ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Monorepo에서 다른 패키지를 참조하여 빌드할 때 GitHub Actions 작성 방법
    Infra/Git 2025. 3. 30. 13:10

    최근 포스팅에서 여러 project에서 사용할 모듈을 따로 package로 구성하여 개발하는 작업이 끝나 해당 모듈이 필요한 project에 적용하였습니다. Monorepo 구조를 가지는 repo의 project가 build 시 모듈도 같이 build가 되어야 하여 Github Actions에 해당 내용을 추가하게 되었습니다.

     

    Github Actions 작성

    예시를 위해 이전에 작성했던 CI/CD 관련 포스팅에서 예제를 가져오겠습니다.

    name: <build name(workflow name)>
    on:
      push:
        branches:
          - <빌드를 발생시킬 트리거가 되는 branch>
    jobs:
      run:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - uses: actions/setup-node@v3
            with:
              node-version: 20
    
          - name: set env
            run: |
              if [[ $GITHUB_REF == 'refs/heads/<빌드를 발생시킬 트리거가 되는 branch>' ]]; then
                  echo "S3_BUCKET=${{ secrets.<환경변수로 넣어둔 버킷 name> }}" >> $GITHUB_ENV
                  echo "S3_BUCKET_REGION=${{ secrets.<환경변수로 넣어둔 버킷 region> }}" >> $GITHUB_ENV
                  echo "CLOUDFORNT_DIST_ID=${{ secrets.<환경변수로 넣어둔 cloudfront id> }}" >> $GITHUB_ENV
                  echo "BUILD_COMMAND=<패키지 빌드 커맨드>" >> $GITHUB_ENV
              fi
    
          - name: Caching
            uses: actions/cache@v3
            id: yarn-cache
            with:
              path: |
                **/node_modules
              key: ${{ runner.os }}-${{ env.BUILD_COMMAND }}-dev-yarn-${{ hashFiles('**/yarn.lock') }}
              restore-keys: |
                ${{ runner.os }}-${{ env.BUILD_COMMAND }}-dev-yarn-
    
          - name: Install dependencies
            if: steps.yarn-cache.outputs.cache-hit != 'true'
            run: |
              yarn
    
          - name: Build
            env:
              NODE_OPTIONS: "--max_old_space_size=4096"
            run: |
              cd <디렉토리 위치>
              yarn ${{ env.BUILD_COMMAND }}
    
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v3
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ env.S3_BUCKET_REGION }}
    
          - name: Deploy
            run: |
              cd <디렉토리 위치>
              aws s3 sync ./dist s3://$S3_BUCKET
              aws cloudfront create-invalidation --distribution-id ${{ env.CLOUDFORNT_DIST_ID }} --paths "/*"

     

    해당 workflow에서 module package의 변경사항(코드 변경 및 dependencies 추가)을 체크하고 변경사항 있을 경우 module package를 build 하는 flow로 작성해 보겠습니다.

     

    name: <build name(workflow name)>
    on:
      push:
        branches:
          - <빌드를 발생시킬 트리거가 되는 branch>
    jobs:
      run:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v3
          - uses: actions/setup-node@v3
            with:
              node-version: 20
    
          - name: set env
            run: |
              if [[ $GITHUB_REF == 'refs/heads/<빌드를 발생시킬 트리거가 되는 branch>' ]]; then
                  echo "S3_BUCKET=${{ secrets.<환경변수로 넣어둔 버킷 name> }}" >> $GITHUB_ENV
                  echo "S3_BUCKET_REGION=${{ secrets.<환경변수로 넣어둔 버킷 region> }}" >> $GITHUB_ENV
                  echo "CLOUDFORNT_DIST_ID=${{ secrets.<환경변수로 넣어둔 cloudfront id> }}" >> $GITHUB_ENV
                  echo "BUILD_COMMAND=<패키지 빌드 커맨드>" >> $GITHUB_ENV
              fi
    
          - name: Caching
            uses: actions/cache@v3
            id: yarn-cache
            with:
              path: |
                **/node_modules
              key: ${{ runner.os }}-${{ env.BUILD_COMMAND }}-dev-yarn-${{ hashFiles('**/yarn.lock') }}
              restore-keys: |
                ${{ runner.os }}-${{ env.BUILD_COMMAND }}-dev-yarn-
                
          # Module의 cache 확인
          - name: Module caching
            uses: actions/cache@v3
            id: module-cache
            with:
              path: |
                **/dist
              key: ${{ runner.os }}-${{ env.BUILD_COMMAND }}-module-${{ hashFiles('**/<module package name>/src/**', '**/<module package name>/package.json') }}
              restore-keys: |
                ${{ runner.os }}-${{ env.BUILD_COMMAND }}-module-
    
          - name: Install dependencies
            if: steps.yarn-cache.outputs.cache-hit != 'true'
            run: |
              yarn
          
          # Module의 cache를 확인후 build
          - name: Install module
            if: steps.module-cache.outputs.cache-hit != 'true'
            run: |
              cd packages/<module package name>
              yarn ${{ env.BUILD_COMMAND }} 
    
          - name: Build
            env:
              NODE_OPTIONS: "--max_old_space_size=4096"
            run: |
              cd <디렉토리 위치>
              yarn ${{ env.BUILD_COMMAND }}
    
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v3
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              aws-region: ${{ env.S3_BUCKET_REGION }}
    
          - name: Deploy
            run: |
              cd <디렉토리 위치>
              aws s3 sync ./dist s3://$S3_BUCKET
              aws cloudfront create-invalidation --distribution-id ${{ env.CLOUDFORNT_DIST_ID }} --paths "/*"

     

    name이 Module caching step에서 module package의 변경사항을 체크한 뒤 해당 step에서 hit가 발생 시 name이 Install module step이 동작하여 module package가 build 됩니다.

     

    마무리

    간단한 내용이지만 Monorepo 구조에서 별도 package로 구성한 모듈을 프로젝트에서 사용할 때 build 이슈가 발생하지 않도록 해야 합니다. 또한 해당 패키지의 변경 사항을 체크하여 불필요하게 build 되지 않도록 최적화하는 것이 좋겠습니다.

     

    'Infra > Git' 카테고리의 다른 글

    Git Repository copy  (1) 2024.12.08
    GitHub Actions Auto tagging  (0) 2024.11.17
    GitHub 2FA(2단계 인증) 설정  (0) 2024.07.28
    Github PR Reviewer 자동 추가하기  (1) 2024.01.27
Designed by Tistory.