모노레포 CI/CD 배포 전략
모노레포 환경에서 release 브랜치 기반의 자동화된 배포 파이프라인을 구축한 경험을 공유합니다. 버전 검증부터 NPM 배포까지 전 과정을 CI가 자동으로 처리하도록 설계했습니다.
🚀 배포 흐름 개요
전체 흐름도
develop에서 release 브랜치를 생성하고 QA를 거쳐 main에 병합되면 자동으로 버전 범핑과 NPM 배포가 이루어집니다.
배포 파이프라인 전체 흐름
개발
develop
QA
release/v1.0.0
개발 서버
CI: 버전 검증
Production
main
Production
CI: auto-release
CI: publish
develop
→ branch →
release/*
→ PR & Merge →
main
→ 버전 범핑 & 태그 → NPM 배포자동화된 릴리즈 흐름
| 단계 | 작업 | 시점 | 담당 |
|---|---|---|---|
| 2 | 브랜치 버전 검증 | release/* 브랜치 push 시 | CI 자동 |
| 3 | QA 진행 | release 브랜치에서 | 수동 |
| 4 | main 병합 | QA 완료 후 | 수동 (PR Merge) |
| 5 | 버전 범핑 | release/* → main 병합 시 | CI 자동 |
| 6 | 태그 생성 | release/* → main 병합 시 | CI 자동 |
| 7 | 패키지 배포 | 태그 push 시 | CI 자동 |
⚙️ CI/CD 파이프라인 구조
파이프라인 다이어그램
CI/CD 파이프라인 스테이지
install
→
build
→
test / lint
→
validate
→
release
→
publish
↳ validate 단계는
release/* 브랜치에서만 버전 검증 실행Stage별 Job 설명
| Stage | Job | 트리거 조건 | 역할 |
|---|---|---|---|
install |
install | 모든 브랜치/태그 | 의존성 설치 (pnpm install) |
build |
build | 모든 브랜치/태그 | 패키지 빌드 |
test |
lint | feature/*, develop, release/*, main | ESLint 검사 |
test |
test | feature/*, develop, release/*, main | 테스트 실행 |
validate |
validate-release-branch | release/v* 브랜치 | 버전 형식 및 유효성 검증 |
release |
auto-release | main 브랜치 (merge 시) | 버전 범핑 및 태그 생성 |
publish |
publish | v* 태그 | NPM 레지스트리 배포 |
🔍 Release 브랜치 버전 검증
release 브랜치가 push되면 CI가 자동으로 버전의 유효성을 검증합니다.
검증 항목
1
형식 검증브랜치 이름이 release/v<Major>.<Minor>.<Patch> 형식인지 확인합니다.
2
버전 비교새 버전이 기존 태그보다 높은지 확인합니다.
검증 결과 예시
# ✅ 통과 예시
기존 최신 태그: v1.0.0
새 브랜치: release/v1.1.0 # 통과: 1.1.0 > 1.0.0
기존 최신 태그: v2.3.1
새 브랜치: release/v2.3.2 # 통과: 2.3.2 > 2.3.1
# ❌ 실패 예시
release/version-1.0.0 # 형식 오류 (v가 없음)
release/v0.9.0 # 기존 v1.0.0보다 낮음
release/v1.0.0 # 이미 존재하는 태그
검증 실패 시
CI 파이프라인이 실패하며 release 브랜치 이름을 올바른 형식으로 수정해야 합니다.
# 잘못된 브랜치 삭제 후 올바른 이름으로 재생성
git branch -d release/wrong-name
git checkout -b release/v1.2.0
자동 릴리즈 프로세스
트리거 조건
main브랜치에 push (merge commit)- Merge 메시지에
release/v<version>패턴이 포함된 경우
자동 처리 흐름
Auto Release 시퀀스
release/v1.2.0
main
CI (auto-release)
Git Tag
NPM Registry
1
release → main Merge
release/v1.2.0 브랜치가 main에 병합됩니다.
release/v1.2.0 브랜치가 main에 병합됩니다.
2
CI 트리거
main 브랜치 push 이벤트로 auto-release job이 시작됩니다.
main 브랜치 push 이벤트로 auto-release job이 시작됩니다.
3
버전 추출
Merge commit 메시지에서 버전 정보(v1.2.0)를 추출합니다.
Merge commit 메시지에서 버전 정보(v1.2.0)를 추출합니다.
4
Changeset 처리 및 버전 범핑
pnpm changeset:auto → pnpm version-packages5
Git Tag 생성
git tag v1.2.0을 생성하고 push합니다.6
NPM 배포
태그 push 이벤트로 publish job이 실행되어 NPM 레지스트리에 배포됩니다.
태그 push 이벤트로 publish job이 실행되어 NPM 레지스트리에 배포됩니다.
자동 처리 내용
| 단계 | 명령어 | 설명 |
|---|---|---|
| 버전 추출 | - | Merge commit 메시지에서 버전 정보 추출 |
| Changeset 생성 | pnpm changeset:auto |
Changeset 파일 자동 생성 |
| 버전 범핑 | pnpm version-packages |
package.json 버전 업데이트 |
| 태그 생성 | git tag v1.2.0 |
Git 태그 생성 및 Push |
| 패키지 배포 | pnpm publish |
NPM 레지스트리 배포 |
버전 관리 (Semantic Versioning)
버전 형식
Semantic Versioning 구조
v1.2.3
Major: 1
Breaking Change
호환성이 깨지는 변경
호환성이 깨지는 변경
Minor: 2
새 기능 추가
(하위 호환 유지)
(하위 호환 유지)
Patch: 3
버그 수정
리팩터링 등
리팩터링 등
Commit Type → Version 매핑
| Commit Type | Version Bump | 설명 |
|---|---|---|
feat |
Minor | 새 기능 추가 |
improve |
Minor | 기존 기능 개선 |
fix |
Patch | 버그 수정 |
perf |
Patch | 성능 개선 |
refactor |
Patch | 코드 리팩토링 |
feat! / BREAKING CHANGE |
Major | 호환성이 깨지는 변경 |
docs, test, chore, style, ci |
- | 버전 영향 없음 |
Changeset 사용법
Changeset이란?
Changeset은 모노레포에서 패키지 버전 관리를 자동화하는 도구입니다. 변경된 패키지만 버전이 업데이트되고 의존성 있는 패키지도 자동으로 처리됩니다.
사용 방법
# 1. 대화형 changeset 생성
pnpm changeset
# → 변경된 패키지 선택 → 버전 타입 선택 → 변경 내용 요약 작성
# 2. 자동 changeset 생성 (마지막 릴리즈 이후 커밋 분석)
pnpm changeset:auto
# 3. 버전 업데이트 적용
pnpm version-packages
Changeset 파일 예시
.changeset/brave-lions-dance.md 파일 형태로 생성됩니다.
---
"@workspace/core": minor
"@workspace/hooks": patch
---
feat: 새로운 Button 컴포넌트 추가
fix: useDebounce 훅 메모리 누수 수정
⚠️ 주의
pnpm version-packages 실행 시 changeset 파일이 소비되고 삭제됩니다.
'je개발 회고' 카테고리의 다른 글
| [ 번들러 ] 모노레포 번들러 비교 (0) | 2025.12.22 |
|---|---|
| [ Git ] 회사에 맞는 브랜치 전략 (0) | 2025.12.22 |
| [ 번들러 ] Monorepo 모노레포 번들러 비교 (0) | 2025.12.16 |
| [ 데이터 품질 관리 ] (4) Frontend : Batching (4) | 2025.08.19 |
| [ 데이터 품질 관리 ] (3) Frontend : Zod 스키마와 API 검증 (3) | 2025.08.18 |