# QuantEngine CI/CD 파이프라인 — 근본적 개선 분석 및 로드맵 **작성일**: 2026-07-11 **분석 대상**: 522 workflow runs (모두 실패 또는 skipped) **핵심 발견**: 원론적 아키텍처 결함, 중복 빌드, 불명확한 실패 원인 --- ## 📊 현재 상태 분석 ### 1. Workflow 구조의 문제 ``` Current (병렬 & 독립적): push → build.yml → GitHub Release 발행 → 🔴 실패 → ci.yml → 30+ validators → 🔴 실패 → deploy-prod.yml → 배포 → 🔴 실패 → wbs_9_3_*.yml → 검증 → 🔴 실패 문제점: - 세 workflow가 동시에 실행 (경합 위험) - build.yml과 deploy-prod.yml이 각각 독립적으로 빌드 - 아티팩트 공유 메커니즘 없음 - GitHub Release action 사용 (Gitea에서 미지원) - ci.yml의 30+ 단계 중 어느 것이 실패하는지 불명확 ``` ### 2. 실패 패턴 (최근 20개 run 분석) ``` build.yml: 18/20 실패 (90%) ci.yml: 18/20 실패 (90%) deploy-prod.yml: 18/20 실패 (90%) wbs_9_3_*.yml: 5/5 실패 (100%) validate-ui-*: 5/5 skipped (조건부 실행) 일관된 실패 = 시스템적 문제 (간헐적 flake 아님) ``` ### 3. 주요 근본 원인 | 원인 | 영향 | 심각도 | |------|------|--------| | **빌드 중복** | CI runner 리소스 낭비, 시간 증가 | 🔴 High | | **Workflow 의존성 부재** | 각 workflow가 독립적 → 아티팩트 비동기화 | 🔴 High | | **30+ Python validators 순차 실행** | 하나 실패 시 전체 ci.yml 중단 → 원인 파악 어려움 | 🔴 High | | **GitHub Release 사용** | Gitea에서 미지원 → build.yml 실패 | 🔴 High | | **로그 분산** | 실패 원인 추적 어려움 | 🟠 Medium | | **Secret 관리 부재** | QUANTENGINE_DB_PASSWORD 미설정 | 🟠 Medium | --- ## 🎯 원론적 개선 방향 (Principled Architecture) ### Phase 1: Pipeline 아키텍처 재설계 (필수) **목표**: SSOT (Single Source of Truth) + 명확한 흐름 ``` 재설계 (순차 & 의존적): push → stage: Validate (fast gates) ├─ Lint & Format Check ├─ Security Scan (KIS API governance) └─ Spec Validation (YAML/JSON) → stage: Build (공유 아티팩트) ├─ dotnet build ├─ Unit tests └─ Package creation → stage: Test (통합 테스트) ├─ Python validators (병렬, 독립적 재시도) └─ E2E tests → stage: Deploy (조건부) ├─ Pre-deployment checks ├─ Green-Blue deployment └─ Health check 효과: - 빌드 1회만 → 시간 50% 단축 - 아티팩트 중앙화 → 동기화 문제 제거 - 각 stage 독립 실패 처리 → 원인 명확 - Validator 병렬 실행 가능 → 시간 개선 ``` ### Phase 2: Quality Gates 계층화 ``` Tier 1: Fast Gates (< 2분, 모든 PR) ├─ YAML/JSON lint ├─ File size check ├─ Branch naming convention └─ → 실패 시 즉시 피드백 Tier 2: Critical Gates (3-5분, 모든 PR) ├─ KIS API read-only enforcement ├─ No hardcoded secrets ├─ Security scanning └─ → 실패 시 배포 차단 Tier 3: Integration Gates (10-15분, merge 시에만) ├─ 30+ Python validators (병렬 실행) ├─ Unit tests └─ → 실패 시 skipped (로그만 저장) 효과: - PR 속도 개선 (2분 내 피드백) - 중요한 gate만 배포 차단 - Validators 실패 = 정보만 저장 (배포는 진행) ``` ### Phase 3: Observability 강화 ``` 각 단계별 명확한 출력: ✅ Stage: Validate └─ Lint: PASS └─ Security: PASS └─ Specs: PASS (3/3 files) ✅ Stage: Build └─ Restore: PASS (1.2s) └─ Build: PASS (45s) └─ Tests: PASS (8/8) └─ Package: quantengine-abc1234.tar.gz (2.6MB) ✅ Stage: Test ├─ validator-01-kis-governance: PASS ├─ validator-02-specs: PASS ├─ validator-03-formula: PASS ... (병렬 실행) └─ Summary: 28/30 PASS, 2 SKIP (ok) ✅ Stage: Deploy └─ Green-Blue: quantengine_20260711_ABC1234_523 └─ Health: OK (HTTP 200) └─ Rollback: Available 효과: - 각 단계 진행 상황 실시간 파악 - 실패 시 구체적인 단계 & 원인 명시 - Artifact 추적 가능 ``` ### Phase 4: Workflow 파일 구조화 ``` 새로운 파일 구조: .gitea/workflows/ ├─ _common/ # 공유 로직 │ ├─ build-artifact.yml # dotnet build & package │ ├─ quick-gates.yml # Lint, 정적분석 │ ├─ deploy.yml # Green-Blue deployment │ └─ notify.yml # Slack/Telegram 알림 │ ├─ pr-validation.yml # PR 검증 (Fast gates 만) ├─ merge-to-main.yml # main 병합 (Critical + Integration) ├─ deploy-production.yml # 배포 (main 태그/release) │ └─ scheduled/ ├─ nightly-validators.yml # 야간 전체 검증 └─ cleanup-deployments.yml# 배포 정리 각 workflow 책임: - pr-validation.yml: 2분 내 피드백 (Tier 1) - merge-to-main.yml: 15분 내 완료 (Tier 1+2+3) - deploy-production.yml: 10분 내 배포 (Tier 2+3+Deploy) ``` --- ## 🛠 구체적 개선 작업 (다음 세션) ### 1단계: 빌드 파이프라인 통일 (1시간) - [ ] `.gitea/workflows/_common/build-artifact.yml` 생성 - [ ] build.yml → `_common/build-artifact.yml` 참조로 변경 - [ ] deploy-prod.yml → `_common/build-artifact.yml` 참조로 변경 - [ ] 아티팩트 S3/Gitea Release storage로 중앙화 ### 2단계: Validator 최적화 (2시간) - [ ] ci.yml의 30+ validator를 3개 그룹으로 분류 - Group A: Tier 1 (빠른 gates) - Group B: Tier 2 (중요 gates) - Group C: Tier 3 (정보성) - [ ] 각 그룹을 병렬 job으로 분리 - [ ] Validator 실패 시 `continue-on-error: true` 설정 ### 3단계: Workflow 통합 (2시간) - [ ] `pr-validation.yml` 생성 (Tier 1 only) - [ ] `merge-to-main.yml` 생성 (Tier 1+2+3) - [ ] `deploy-production.yml` 정리 (Tier 2+3+Deploy) - [ ] 각 workflow의 outputs 명확히 (success/failure/artifact) ### 4단계: 모니터링 & 알림 (1시간) - [ ] `.gitea/workflows/_common/notify.yml` 생성 - [ ] 각 stage 완료 후 알림 - [ ] 실패 시 상세 로그 링크 포함 ### 5단계: 문서화 & 테스트 (1시간) - [ ] README.md 업데이트 (workflow 흐름) - [ ] 로컬에서 workflow 검증 가능한 스크립트 - [ ] CI/CD 트러블슈팅 가이드 --- ## 🚀 기대 효과 | 지표 | 현재 | 개선 후 | 개선율 | |------|------|--------|--------| | 빌드 시간 | 3-4분 | 1-2분 | -60% | | 전체 workflow 시간 | 10-15분 | 15-20분 (더 안정적) | +정확성 | | 실패율 | 90% | <10% | -80% | | 평균 실패 원인 파악 시간 | 30분 | 5분 | -83% | | PR 피드백 시간 | 5분 (전체 CI 완료 후) | 2분 (Tier 1만) | -60% | --- ## 📋 최종 체크리스트 - [ ] 새 DB password 설정 (QUANTENGINE_DB_PASSWORD secret) - [ ] GitHub Release action → Gitea-compatible 버전으로 변경 - [ ] Build artifact 저장소 선정 (S3 / Gitea Releases / 로컬) - [ ] Validator 병렬화 방안 검토 - [ ] Notification 채널 구성 (Slack/Telegram/Gitea comment) --- ## 참고: 기존 대비 개선 원칙 | 원칙 | 현재 상태 | 개선 방향 | |------|----------|---------| | **Single Build** | ❌ 중복 빌드 (build.yml + deploy-prod.yml) | ✅ 공유 아티팩트 | | **Clear Deps** | ❌ 의존성 없음 (병렬 실행) | ✅ 순차 & 조건부 | | **Fast Feedback** | ❌ 15분 대기 | ✅ 2분 내 피드백 | | **Fail Fast** | ❌ 30 validators 순차 | ✅ Validator 병렬 | | **Observability** | ❌ 로그 분산 | ✅ 단계별 명확한 출력 | | **Secret Security** | ⚠️ 환경변수만 | ✅ Gitea secret + fail-fast |