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