Infra/Git

Monorepo에서 다른 패키지를 참조하여 빌드할 때 GitHub Actions 작성 방법

iam102 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 되지 않도록 최적화하는 것이 좋겠습니다.