70824c2afb
Consolidates duplicate KIS API client implementations (governance tests were exercising an unused class instead of the one actually running in production), closes a SQL injection path in the DB admin page, fixes a migration that used MySQL-only syntax and had never actually applied (confirmed against production), resyncs docs/db/quantengine.dbml with all migrations, and removes a duplicate OMS·WMS·ERP frontend tree in favor of src/frontend/. Also corrects several unverifiable/inflated claims in the OMS planning docs and realigns CI/CD and architecture documentation with what's actually in the repo. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
8.0 KiB
8.0 KiB
ARCHIVED (2026-07-30): 2026-07-11 시점 build.yml/wbs_9_3_*.yml/merge-to-main.yml 등 이후 삭제된 워크플로우를 전제로 쓰였습니다. 현재 CI 구조는
../CICD_PIPELINE.md를 참고하세요.
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 |