## doc/sbom-pipeline.md — 중복·모순 정리 (328 → 286줄) 같은 사실이 여러 절에 흩어져 있었고, 일부는 문서가 아니라 변경 이력이었다. - `SEVERITY` 를 전 심각도로 덮어써야 하는 이유가 환경변수 절·CI 절·요약 절 3곳에 있었다. 스크립트 절의 blockquote 하나로 합쳤다 — "게이트를 돌릴 거라면 전 심각도로 스캔해야 한다"가 핵심이고 나머지는 그 결과다. - Job Summary 1MB 제한이 CI 절과 결과 확인 절에 중복됐다. CI 절 하나로 합쳤다. - `--warn-only` 서술이 mermaid 라벨·CI 절·게이트 절·트리아지 절 4곳에 있었다. 게이트 절 하나로 합치고, `build-image.yml` 쪽은 이미 강제라는 대비를 함께 적었다. - 자체 빌드 트리거 표가 "PR 은 push 안 함"을 말하는데 바로 아래 불릿이 같은 말을 반복했다. 표는 그대로 두고 불릿은 **왜** 그런지(REGISTRY 미전달 → localhost 태그라 push 를 시도할 수조차 없다)만 남겼다. - "오해를 주던 단일 '총 소요'는 제거" 같은 변경 이력 서술을 걷어냈다. 문서는 현재 상태를 적는 곳이다. - "첫 전체 실행 결과(2026-07-08)" 절은 수치를 싣고 바로 아래에서 "현재 수치가 아니다"로 무효화하는 구조였다. 절 자체를 없애고, 거기서 유일하게 쓸모 있던 사실 (SBOM 생성 실패는 대부분 사설/미인증 레지스트리이거나 대용량 timeout)만 스크립트 절로 옮겼다. - "실행 이력(2026-08-04)" 절은 MEMORY.md 와 중복이라 제거했다. 거기서만 알 수 있던 사실(Actions 시크릿의 push 권한 확인)은 GitHub 설정 표에 반영했다. - `CVE_API_KEY` 가 본문에만 있고 GitHub 설정 표에 빠져 있어 추가했다. - 아키텍처 절 불릿이 mermaid 서브그래프 라벨과 같은 말을 하고 있어, "pull 을 ② 한 곳에 몰아둔 것이 핵심"이라는 결론 한 문장으로 줄였다. ## 이미지 목록을 문서에 박아두지 않는다 이미지는 계속 추가되므로 열거하면 추가할 때마다 낡는다. `images/` 디렉토리를 단일 출처로 삼고 CLAUDE.md·image-authoring.md·build-image.yml·sbom-pipeline.md 의 열거를 걷어냈다. keycloak README 의 베이스 OS 결정 근거도 "기존 3종" 대신 "먼저 들어온 이미지들"로 바꿨다 — 근거의 내용은 그대로다. ## 현황 서술 정정 - build-image.yml 주석이 "아직 도입된 자체 빌드 이미지가 없다(images/ 가 비어 있음)" 로 남아 있었다. 이 레포 CI 에서 빌드→검증→게이트→push→카탈로그 브랜치 push 까지 실제로 검증된 상태다. - MEMORY.md: cve-exceptions.json 첫 예외 등록, 베이스 OS 정책 확정, PR 자동 생성이 조직 정책으로 불가하다는 실측(run 30882785612)을 반영했다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
12 KiB
DIP Catalog — 하네스 엔지니어링 가이드
프로젝트 개요
DIP Catalog는 세 개의 독립 서브시스템으로 구성된다.
| 서브시스템 | 설명 | 경로 |
|---|---|---|
| 정적 카탈로그 | 45+ 엔터프라이즈 Helm 차트 버전 보관소 (Kafka, Airflow, MLflow, KServe, OpenMetadata 등) | manifests/helm/ |
| 자동화 에이전트 | Helm 차트 신규 버전 감지 → Diff 분석 → 문서 생성 → GitHub PR 자동화 | agent/update_catalog/ |
| CVE/SBOM 게이트 | 카탈로그 이미지 SBOM·취약점 스캔 + 게이트 판정 (현재 warn-only) | scripts/pipeline/, scripts/build/, doc/sbom-pipeline.md |
카탈로그는 운영 클러스터 직접 변경과 무관하다. 모든 변경은 Git PR을 통해서만 이루어진다.
디렉토리 구조
dip-catalog/
├── manifests/
│ ├── helm/<chart>/<version>/ # Helm 차트 정적 카탈로그 (각 버전 독립 디렉토리)
│ ├── applicationset/ # ArgoCD ApplicationSet 매니페스트
│ └── kustomize/ # Kustomize 오버레이 (Kubeflow, Model Registry)
├── agent/
│ └── update_catalog/
│ ├── skills/ # 자동화 Skills (Python, 각 Skill 독립 실행 가능)
│ ├── scripts/run_flow.sh # 전체 파이프라인 로컬 실행 스크립트
│ └── docs/ # 아키텍처·설계 문서 (한국어)
│ ├── design/ # 컴포넌트별 상세 설계 (00~05)
│ ├── decisions/ # ADR (아키텍처 결정 기록)
│ └── status.md # 구현 현황
├── scripts/
│ ├── pipeline/ # SBOM 생성 + CVE 스캔 + 게이트 판정 (sbom.yml/cve-edge-post.yml 이 쓴다)
│ └── build/ # 자체 빌드 이미지 프레임워크 (build-image.yml 이 쓴다 — 아직 실사용 이미지 없음)
└── doc/ # 차트 리소스 프로파일(CPU/Memory/Storage) + CVE/SBOM 파이프라인 문서
├── sbom-pipeline.md # SBOM 생성·스캔·게이트 메커니즘
└── cve-exceptions.json # 게이트 승인 예외 목록
정적 카탈로그 작업
차트 디렉토리 구조
각 manifests/helm/<chart>/<version>/에 다음 파일이 있어야 한다.
| 파일 | 역할 |
|---|---|
Chart.yaml |
Helm 차트 메타데이터 |
values.yaml |
업스트림 기본값 |
custom-values.yaml |
PaaSup 전용 오버라이드 (Breaking Change 판단 기준) |
CUSTOM-README.md |
업그레이드 주의사항 (자동 생성 + 수동 추가 가능) |
BUILD-README.md |
업스트림 README (버전 정보 파싱에 사용됨, 변경 금지) |
신규 차트 추가
manifests/helm/<chart>/<version>/ 디렉토리를 생성하고 위 5개 파일을 포함시킨다.
custom-values.yaml은 PaaSup 환경에 필요한 오버라이드만 작성한다. 기본값 전체를 복사하지 않는다.
리소스 프로파일
차트별 CPU/Memory/Storage 요구사항은 doc/define-chart-resources.md에 Small/Medium/Large 티어로 정의되어 있다. 신규 차트 추가 시 이 파일에도 리소스 정의를 추가한다.
자동화 Skills 작업
파이프라인 순서
chart_version_detector → chart_updater → helm_diff →
breaking_change_check → generate_upgrade_doc → update_docs_file → create_pr
각 Skill은 독립 실행 가능하다. JSON을 stdout으로 출력하며, 다음 Skill의 입력으로 전달된다.
로컬 실행
# 전체 파이프라인 실행 (필수 환경변수 오버라이드)
CATALOG_ROOT=/path/to/dip-catalog CHART=airflow \
bash agent/update_catalog/scripts/run_flow.sh
# 개별 Skill 실행 예시
python3 agent/update_catalog/skills/chart_version_detector/scripts/run.py \
--catalog-root /path/to/dip-catalog --chart airflow
python3 agent/update_catalog/skills/helm_diff/scripts/run.py \
--chart airflow --repo bitnami \
--chart-path /path/to/dip-catalog/manifests/helm/airflow/1.15.0 \
--from-version 1.15.0 --to-version 1.16.0
주요 환경변수
| 변수 | 설명 | 기본값 |
|---|---|---|
CATALOG_ROOT |
dip-catalog 레포 절대 경로 | 하드코딩된 로컬 경로 (반드시 오버라이드) |
CHART |
대상 차트명 | airflow |
USE_CLAUDE_CLI=1 |
LLM 호출 활성화 (breaking=true 시 상세 가이드 생성) | 미설정 시 템플릿 기반 생성 |
run_flow.sh의CATALOG_ROOT기본값은 songwonbin의 로컬 경로로 하드코딩되어 있다. 다른 환경에서 실행할 때 반드시 환경변수로 오버라이드한다.
Skill 인터페이스 확인
각 Skill의 입출력 스키마는 agent/update_catalog/skills/<skill>/SKILL.md에 정의되어 있다.
Claude Code Skills (.claude/skills/)
위 agent/update_catalog/skills/(결정론적 Python CLI 파이프라인)와 용도가 다른 별개
체계다. 혼동하지 않는다.
| 구분 | agent/update_catalog/skills/ |
.claude/skills/ |
|---|---|---|
| 형식 | SKILL.md + scripts/run.py (JSON in/out) |
Claude Code Agent Skill (frontmatter + 지시문) |
| 실행 | python3 run.py --flags, 파이프라인이 호출 |
Claude Code 세션에서 관련 작업 시 자동 로드 |
| 용도 | 차트 버전 감지·diff·PR 생성 등 결정론적 자동화 | 차트마다 판단이 필요한 반복 편집·검증 절차 |
.claude/skills/의 Skill도 설계 원칙 #1을 지킨다 — helm/kubectl 실행은
scripts/deploy-test/*.sh 같은 스크립트가 전담하고, Skill은 편집·판단·검증 절차만 담당한다.
| Skill | 용도 |
|---|---|
| chart-to-cnpg | 카탈로그 차트의 내장 bitnami postgresql 서브차트를 전용 cnpg-cluster로 전환 |
| catalog-update-pipeline | 차트 신규 버전 감지 → diff → breaking 판정 → 문서 생성 파이프라인 실행 (agent/update_catalog) |
| sbom-cve-gate | SBOM 생성·CVE 스캔·게이트 판정 실행 및 결과 해석 (scripts/pipeline) |
| self-build-image | 자체 빌드 하드닝 이미지 추가·변경 (scripts/build, images/) |
각 Skill 은 절차 본문을 복제하지 않고 권위 있는 문서(doc/sbom-pipeline.md,
.claude/image-authoring.md 등)를 가리킨다 — 문서가 단일 출처이고, Skill 은 실행 계약과
문서가 놓치기 쉬운 함정·현재 상태만 담는다.
관련 참조 문서(Skill이 절차의 단일 출처로 삼는다): deploy-test-procedure.md · pitfalls.md · image-authoring.md
CVE/SBOM 게이트 작업
manifests/helm/ 카탈로그가 참조하는 컨테이너 이미지의 SBOM·취약점을 스캔하고
게이트로 판정한다. 정적 카탈로그·자동화 에이전트와 독립적으로 동작한다.
extract-helm-images.sh → generate-sbom.sh → scan-sbom.sh → cve-gate.py
(scripts/pipeline/, .github/workflows/sbom.yml·cve-edge-post.yml 이 실행)
- 현재 warn-only: 게이트가 실패해도 CI/PR 을 막지 않는다. 카탈로그 차트 전체가 이 게이트로 트리아지된 적이 없다.
- CI 는 전 심각도로 스캔한다 — 게이트가 벤더 하향 등급·NVD 재평가·사각지대 판정에
MEDIUM/LOW 까지 필요로 하기 때문이다. 스크립트 기본값(
HIGH,CRITICAL)으로 만든 리포트로 게이트를 돌리면 판정이 달라진다. - 자체 빌드 프레임워크(
scripts/build/,.github/workflows/build-image.yml)로images/<image>/아래에 자체 빌드 이미지를 둔다(목록은 그 디렉토리가 단일 출처). 최종 런타임 베이스 OS 는 SUSE BCI 로 통일하되 버전은 이미지마다 실측해서 고른다. push·카탈로그 반영을 동반하는 빌드는workflow_dispatch수동 실행뿐이고(images/**PR 은 검증 전용,schedule없음),sbom.yml의 게이트가 이 워크플로를 자동 호출하지 않는다 — 자체 빌드로 갈지는 사람이 판단한다. 2026-08-04 에etcd·cloudnative-pg로 빌드→게이트→push→카탈로그 브랜치 push 까지 실제 CI 에서 검증됐다. 게이트가 상위 태그·베이스 OS 교체로 해소 안 되는 차단 CVE 를 찾으면 이 프레임워크로 자체 빌드를 검토한다 — 절차는 .claude/image-authoring.md. - 상세: doc/sbom-pipeline.md · 승인 예외:
doc/cve-exceptions.json· 현재 미결 사항: MEMORY.md
설계 원칙
아래 원칙을 위반하는 코드를 제안하거나 작성하지 않는다.
- LLM은 Helm CLI를 직접 실행하지 않는다. helm 실행은 결정론적 Skill(Python)이 전담한다.
- Diff 생성은 100% deterministic이다. Structured Diff JSON 형식을 사용하며 LLM이 직접 diff를 생성하지 않는다.
- LLM 입력은 반드시 Structured JSON이다. 자유 텍스트나 raw helm output을 LLM에 직접 전달하지 않는다.
- Breaking Change 판단은 Rule Engine이 먼저 수행한다.
custom-values.yaml의 실제 사용 키 기준으로 코드가 판단하며 LLM은 후순위다. - LLM은 Markdown 설명 생성만 담당한다.
breaking=true시에만 호출되며,breaking=false이면 템플릿 기반으로 생성한다. - 운영 환경은 Git PR로만 변경한다. 클러스터 직접 변경이나 kubectl apply를 자동화 흐름에 포함하지 않는다.
- 보안 경계: 외부 입력(PR comment, webhook 등)은 신뢰 경계 밖으로 취급한다. 프롬프트 주입 방어를 기본 전제로 한다.
현재 구현 상태
| Step | 내용 | 상태 |
|---|---|---|
| Step 1 | Skills 구현 (로컬 실행) | ✅ 거의 완료 |
| Step 2 | Agent 프레임워크 POC (OpenClaw vs Nanobot) | 📋 계획 |
| Step 3 | On-Cluster Agent 워크플로 정의 | 💡 구상 |
| Step 4 | 보안 정책 수립 후 운영 | 💡 구상 |
Step 1 세부 현황:
chart_version_detector,chart_updater,helm_diff,breaking_change_check,generate_upgrade_doc,update_docs_file: ✅ 구현 완료create_pr: ✅ 구현 (실제 GitHub 연동 테스트 미완료)deploy_validate: ❌ Phase 2 예정
주요 설계 문서
| 문서 | 설명 |
|---|---|
| agent/update_catalog/docs/design/00-architecture-overview.md | 전체 아키텍처 + 설계 원칙 + 기술 스택 |
| agent/update_catalog/docs/design/01-helm-diff-engine.md | Helm Diff Engine 상세 설계 |
| agent/update_catalog/docs/design/02-breaking-change-rules.md | Breaking Change Rule Engine 판단 로직 |
| agent/update_catalog/docs/design/03-llm-summarizer.md | LLM Summarizer + Prompt 설계 |
| agent/update_catalog/docs/design/04-skill-interface.md | Skill 인터페이스 계약 (Agent-Skill) |
| agent/update_catalog/docs/design/05-on-cluster-agent.md | On-Cluster Agent 설계 (Step 2~3) |
| agent/update_catalog/docs/decisions/001-agentic-first.md | 파이프라인 오케스트레이션 건너뛰기 결정 배경 |
| agent/update_catalog/docs/status.md | 구현 현황 상세 |
| doc/sbom-pipeline.md | SBOM 생성·CVE 스캔·게이트 파이프라인 상세 |