-
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