M6: CI/CD 고도화¶
| 항목 | 내용 |
|---|---|
| 상태 | 완료 (100%) |
| 핵심 목표 | GitHub Actions 자동화, Docker GHCR + Trivy, Shift-Left 테스트, 오프라인 배포 |
| 관련 PR | #238 -- #283 (2026-03-27 완료) |
개요¶
M6 단계에서는 4단계에 걸쳐 CI/CD 파이프라인을 체계적으로 고도화했다. 총 16개의 GitHub Actions 워크플로우를 구축하여 코드 품질, 보안, 배포, 모니터링을 자동화하고, 폐쇄망 환경을 위한 오프라인 배포 패키지를 제공한다.
4단계 고도화 구조¶
graph TD
subgraph "1단계: 기반 구축"
A[ci.yml] --> B[reusable-test.yml]
C[docker-publish.yml] --> D[GHCR 배포]
E[security.yml] --> F[Trivy + CodeQL]
end
subgraph "2단계: 품질 게이트"
G[pr-labeler.yml] --> H[자동 라벨링]
I[dependabot-auto-merge.yml] --> J[의존성 자동 머지]
K[publish-package.yml] --> L[PyPI 배포]
end
subgraph "3단계: 배포 확장"
M[selective-deploy.yml] --> N[Feature Flag 배포]
O[deploy-cloud-run.yml] --> P[Cloud Run]
Q[offline-package.yml] --> R[오프라인 패키지]
end
subgraph "4단계: 관측/실험"
S[dora-metrics.yml] --> T[DORA 메트릭]
U[lean-experiment.yml] --> V[Lean 실험 스코어]
W[monitor-cloud-run.yml] --> X[Cloud Run 모니터링]
end
A --> G --> M --> S
워크플로우 목록¶
1단계: CI/CD 기반 구축¶
| 워크플로우 | 파일 | 트리거 | 역할 |
|---|---|---|---|
| CI Pipeline | ci.yml |
push, PR | Lint, 테스트, 커버리지 가드 |
| Reusable Test | reusable-test.yml |
호출 | 재사용 가능 테스트 잡 |
| Docker Publish | docker-publish.yml |
push(main), tag | GHCR 이미지 빌드 및 푸시 |
| Security Scan | security.yml |
push, PR, schedule | Trivy 컨테이너 스캔 + CodeQL 분석 |
2단계: 품질 게이트 강화¶
| 워크플로우 | 파일 | 트리거 | 역할 |
|---|---|---|---|
| PR Labeler | pr-labeler.yml |
PR | 변경 파일 기반 자동 라벨링 |
| Dependabot Auto-merge | dependabot-auto-merge.yml |
PR (dependabot) | patch/minor 업데이트 자동 머지 |
| Publish Package | publish-package.yml |
release | PyPI 패키지 배포 |
3단계: 배포 전략 확장¶
| 워크플로우 | 파일 | 트리거 | 역할 |
|---|---|---|---|
| Selective Deploy | selective-deploy.yml |
push(main) | Feature Flag 기반 선택적 배포 |
| Deploy Cloud Run | deploy-cloud-run.yml |
push(main), tag | Google Cloud Run 배포 |
| Offline Package | offline-package.yml |
release, 수동 | 폐쇄망용 오프라인 배포 패키지 생성 |
4단계: 관측 및 실험¶
| 워크플로우 | 파일 | 트리거 | 역할 |
|---|---|---|---|
| DORA Metrics | dora-metrics.yml |
schedule (daily) | 배포 빈도, 리드 타임, MTTR 측정 |
| Lean Experiment | lean-experiment.yml |
schedule, 수동 | Lean Startup 실험 스코어 산출 |
| Monitor Cloud Run | monitor-cloud-run.yml |
schedule | Cloud Run 서비스 헬스 모니터링 |
| Model Evaluation | model-eval.yml |
수동 | 모델 성능 평가 파이프라인 |
| E2E Test | e2e.yml |
push, PR | End-to-End 통합 테스트 |
| Deploy Pages | deploy-pages.yml |
push(main) | MkDocs 문서 사이트 배포 |
Docker GHCR + Trivy 보안¶
Docker 이미지 빌드 및 배포¶
docker-publish.yml이 main 브랜치 push 또는 태그 생성 시 Docker 이미지를 빌드하여 GitHub Container Registry(GHCR)에 배포한다.
코드 Push / Tag
|
v
Docker Build (멀티 스테이지)
|
v
Trivy 취약점 스캔
|
v CRITICAL/HIGH 취약점 0건 확인
GHCR Push (ghcr.io/govon-org/govon)
보안 스캔 구성¶
security.yml이 매일 정기 스캔과 PR/push 시 실시간 스캔을 수행한다.
| 스캔 유형 | 도구 | 대상 | 기준 |
|---|---|---|---|
| 컨테이너 취약점 | Trivy | Docker 이미지 | CRITICAL/HIGH 0건 |
| 코드 분석 | CodeQL | Python 소스 | 보안 패턴 위반 0건 |
| 의존성 취약점 | Dependabot | requirements.txt | 알려진 CVE 0건 |
Shift-Left 테스트 + 커버리지 가드¶
ci.yml에서 모든 PR에 대해 린트, 테스트, 커버리지를 검증한다.
테스트 파이프라인¶
PR 생성
|
v
Black (코드 포맷팅) + isort (임포트 정렬) + flake8 (린트)
|
v
pytest --cov=src (단위 테스트 + 커버리지)
|
v 커버리지 기준 미달 시 실패
PR 머지 가능
재사용 가능 테스트¶
reusable-test.yml은 여러 워크플로우에서 호출 가능한 공용 테스트 잡이다. Python 버전 매트릭스, 캐싱, 의존성 설치를 표준화하여 중복을 제거했다.
오프라인 배포 패키지¶
공공기관 폐쇄망 환경에서 인터넷 연결 없이 시스템을 설치할 수 있도록 오프라인 배포 패키지를 생성한다.
패키지 구성¶
offline-package.yml이 릴리즈 생성 시 자동으로 아래 항목을 번들링한다.
| 구성 요소 | 내용 |
|---|---|
| Docker 이미지 | docker save로 추출한 tar 파일 |
| Python 패키지 | pip wheel 파일 (오프라인 설치용) |
| 설치 스크립트 | install.sh -- 원커맨드 설치 |
| 설정 파일 | docker-compose.yml, 환경 변수 템플릿 |
폐쇄망 설치 절차¶
# 1. 오프라인 패키지를 USB 등으로 폐쇄망 서버에 전달
# 2. 압축 해제 및 설치
tar xzf govon-offline-v1.0.0.tar.gz
cd govon-offline-v1.0.0
./install.sh
Lean Startup 실험¶
lean-experiment.yml은 프로젝트의 Lean Startup 실험 메트릭을 자동으로 산출한다.
측정 항목¶
| 메트릭 | 설명 |
|---|---|
| 이슈 완료율 | 전체 이슈 대비 완료 이슈 비율 |
| PR 머지 속도 | PR 생성 후 머지까지 평균 소요 시간 |
| 테스트 커버리지 | 코드 커버리지 비율 |
| 실험 가설 검증률 | 마일스톤별 가설 달성 비율 |
DORA 메트릭¶
dora-metrics.yml은 매일 DevOps 핵심 지표를 수집한다.
| DORA 메트릭 | 설명 | 측정 방법 |
|---|---|---|
| Deployment Frequency | 배포 빈도 | main 브랜치 push 횟수 |
| Lead Time for Changes | 변경 리드 타임 | 커밋에서 배포까지 소요 시간 |
| Mean Time to Restore | 평균 복구 시간 | 장애 발생에서 해결까지 소요 시간 |
| Change Failure Rate | 변경 실패율 | 배포 후 롤백 비율 |
Feature Flag 기반 배포¶
selective-deploy.yml은 Feature Flag를 기반으로 기능 단위의 선택적 배포를 수행한다. 새로운 기능을 전체 사용자에게 한 번에 배포하지 않고, 특정 조건(환경, 사용자 그룹)에 따라 점진적으로 릴리즈할 수 있다.
Cloud Run 배포 및 모니터링¶
배포¶
deploy-cloud-run.yml이 main 브랜치 push 또는 태그 생성 시 Google Cloud Run에 자동 배포한다.
모니터링¶
monitor-cloud-run.yml이 정기적으로 Cloud Run 서비스의 헬스 상태를 확인한다.
| 모니터링 항목 | 설명 |
|---|---|
| 서비스 상태 | 실행 중 / 정지 확인 |
| 응답 시간 | 헬스체크 엔드포인트 레이턴시 |
| 에러율 | 최근 배포 후 5xx 에러 비율 |
관련 PR¶
M6 고도화는 총 46개의 PR(#238 -- #283)을 통해 완료되었다. 모든 작업은 2026-03-27에 마무리되었다.