Ch7. CI/CD 파이프라인 설계
GitHub Actions + Turborepo, 병렬 빌드, 선택적 테스트, 릴리스 전략
CI 전체 흐름
GitHub Actions + Turborepo
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 변경 감지에 필요
- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'yarn'
- run: yarn install --immutable
- name: Build, Lint, Typecheck, Test
run: turbo run build lint typecheck testfetch-depth: 0은 전체 히스토리를 가져와 --filter=...[HEAD~1] 같은 변경 감지가 작동하게 합니다.
변경 감지 기반 선택적 빌드
# main 대비 변경된 패키지만 빌드
turbo run build --filter=...[origin/main]
# 직전 커밋 대비 변경분만
turbo run build test --filter=...[HEAD~1]
# 특정 앱과 그 의존성만
turbo run build --filter=web...
# 특정 앱만 (의존성 제외)
turbo run build --filter=web| 필터 | 의미 |
|---|---|
--filter=web | web 앱만 |
--filter=web... | web + web이 의존하는 모든 패키지 |
--filter=...web | web + web에 의존하는 모든 앱/패키지 |
--filter=...[HEAD~1] | 마지막 커밋 이후 변경된 패키지만 |
--filter=web...[origin/main] | main 이후 변경된 web 의존성 체인 |
매트릭스 전략 (대규모)
앱이 많아지면 매트릭스 빌드로 CI를 분산합니다:
jobs:
detect:
runs-on: ubuntu-latest
outputs:
apps: ${{ steps.filter.outputs.apps }}
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- id: filter
run: |
APPS=$(turbo run build --filter=...[origin/main] --dry-run=json \
| jq -c '[.tasks[] | select(.directory | startswith("apps/")) | .package]')
echo "apps=$APPS" >> "$GITHUB_OUTPUT"
build:
needs: detect
if: needs.detect.outputs.apps != '[]'
strategy:
matrix:
app: ${{ fromJson(needs.detect.outputs.apps) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: yarn install --immutable
- run: turbo run build --filter=${{ matrix.app }}...릴리스 자동화 (Changesets)
# 초기 설정
npx @changesets/cli init
# 변경 사항 기록 (PR 시)
npx changeset add
# → .changeset/fuzzy-wolf-dance.md 생성# .github/workflows/release.yml
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: yarn install --immutable
- uses: changesets/action@v1
with:
publish: yarn changeset publish
version: yarn changeset version
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}Changesets는 PR마다 변경 내역을 수집하고, main 머지 시 자동으로 버전 범프 + CHANGELOG 생성 + npm publish를 수행합니다.