Move directory
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
# Breaking Change Rule Engine 설계
|
||||
|
||||
## 1. 개요
|
||||
|
||||
Structured Diff JSON을 입력받아 **코드 기반**으로 Breaking Change 여부를 판단한다.
|
||||
LLM을 사용하지 않으며, 결과는 완전히 deterministic하다.
|
||||
|
||||
> **카탈로그 맥락에서의 Breaking 정의**: `custom-values.yaml`을 수정해야 하는 상황.
|
||||
> 카탈로그는 신규 배포를 위한 차트 보관소이며, 운영 클러스터 직접 변경과 무관하다.
|
||||
> Breaking 판단의 기준은 "기존 `custom-values.yaml`이 새 차트 버전에서 유효한가?"이다.
|
||||
|
||||
> 설계 의도: LLM이 "이건 Breaking인 것 같아"라고 추론하는 대신, 코드가 명확한 기준으로 판단한다.
|
||||
|
||||
---
|
||||
|
||||
## 2. Breaking Change 판단 기준
|
||||
|
||||
### 2.0 공통 원칙
|
||||
|
||||
모든 values 관련 규칙에서 **`custom-values.yaml`에 해당 key가 존재하는지 여부**가 breaking 판단의 핵심 조건이다.
|
||||
|
||||
- `custom-values.yaml`이 없거나 해당 key를 사용하지 않는 경우 → `warning`으로 처리 (실제 수정 불필요)
|
||||
- `custom-values.yaml`에 해당 key가 존재하는 경우 → `breaking`으로 처리 (수정 필요)
|
||||
|
||||
### 2.1 Values 관련
|
||||
|
||||
| 조건 | 판정 | 조건 상세 |
|
||||
|------|------|---------|
|
||||
| values key 삭제 | ✅ Breaking | 해당 key가 `custom-values.yaml`에 **있을** 때 — 기존 override가 무시됨 |
|
||||
| values key 삭제 | ⚠️ Warning | 해당 key가 `custom-values.yaml`에 **없을** 때 (또는 custom-values.yaml 없음) |
|
||||
| values type 변경 | ✅ Breaking | 해당 key가 `custom-values.yaml`에 **있을** 때 — 파싱 오류 또는 예상치 못한 동작 |
|
||||
| values type 변경 | ⚠️ Warning | 해당 key가 `custom-values.yaml`에 **없을** 때 |
|
||||
| values key 추가 | ℹ️ Info | 항상 — 신규 기능, 필요 시 custom-values.yaml에 추가 검토 |
|
||||
| default 값 변경 | ⚠️ Warning | custom-values.yaml에서 명시적으로 override하지 않는 경우 동작 변경 가능 |
|
||||
|
||||
> **`custom-values.yaml` 없는 차트**: 해당 차트에 custom override가 없으므로 values 삭제는 모두 `warning`으로 처리.
|
||||
|
||||
### 2.2 Template / 리소스 관련
|
||||
|
||||
카탈로그 맥락에서 Template 변경은 `custom-values.yaml` 수정 요인이 아니므로 **Warning**으로 처리한다.
|
||||
담당자가 신규 배포 시 참고할 수 있도록 업그레이드 주의사항 문서에 기록한다.
|
||||
|
||||
| 조건 | 판정 | 이유 |
|
||||
|------|------|------|
|
||||
| Service port 변경 | ⚠️ Warning | 카탈로그 신규 배포 시 주의사항. custom-values.yaml에서 port override 가능 |
|
||||
| Service type 변경 (ClusterIP → NodePort 등) | ⚠️ Warning | 네트워크 구성 변경 필요, 주의사항으로 기록 |
|
||||
| Deployment selector 변경 | ⚠️ Warning | 재배포 시 주의사항. custom-values.yaml 수정 요인 아님 |
|
||||
| StatefulSet selector 변경 | ⚠️ Warning | 동일 |
|
||||
| StatefulSet volumeClaimTemplate 변경 | ⚠️ Warning | 동일 |
|
||||
| container 이름 변경 | ⚠️ Warning | 참조 변경 필요, 주의사항 기록 |
|
||||
| 리소스 삭제 | ⚠️ Warning | 의존 서비스 변경 필요, 주의사항 기록 |
|
||||
| resource limits 변경 | ℹ️ Info | 참고 사항 |
|
||||
| replicas 기본값 변경 | ℹ️ Info | custom-values.yaml에서 명시적 설정 시 영향 없음 |
|
||||
|
||||
### 2.3 CRD 관련
|
||||
|
||||
CRD 변경은 기존 Custom Resource의 유효성에 영향을 미치므로 Breaking으로 처리한다.
|
||||
|
||||
| 조건 | 판정 | 이유 |
|
||||
|------|------|------|
|
||||
| CRD field 삭제 | ✅ Breaking | 기존 CR의 해당 필드 손실 |
|
||||
| required field 추가 | ✅ Breaking | 기존 CR validation 실패 |
|
||||
| storage version 변경 | ✅ Breaking | migration 없이 롤백 불가 |
|
||||
| conversion webhook 제거 | ✅ Breaking | 구버전 API 호출 실패 |
|
||||
| field 추가 (optional) | ❌ Not Breaking | 하위 호환 |
|
||||
| schema 제약 완화 | ❌ Not Breaking | 기존 CR은 계속 유효 |
|
||||
|
||||
### 2.4 Dependency 관련
|
||||
|
||||
서브차트의 values를 `custom-values.yaml`에서 override하는 경우에만 breaking이다.
|
||||
|
||||
| 조건 | 판정 | 조건 상세 |
|
||||
|------|------|---------|
|
||||
| 하위 chart major version 변경 | ✅ Breaking | `custom-values.yaml`에 해당 subchart prefix key가 **있을** 때 (예: `postgresql.*`) |
|
||||
| 하위 chart major version 변경 | ⚠️ Warning | `custom-values.yaml`에 해당 subchart 관련 key가 **없을** 때 |
|
||||
| 하위 chart 제거 | ⚠️ Warning | 항상 — 주의사항으로 기록 |
|
||||
| 하위 chart 추가 | ℹ️ Info | 항상 — 신규 리소스 생성만 발생 |
|
||||
|
||||
### 2.5 Deprecated K8s API 감지
|
||||
|
||||
| 조건 | 판정 | 이유 |
|
||||
|------|------|------|
|
||||
| Deprecated API 사용 (extensions/v1beta1 등) | ⚠️ Warning | K8s 버전에 따라 영향 있을 수 있음 |
|
||||
|
||||
감지 방법: `helm template` 결과의 `apiVersion` 필드를 K8s deprecated API 목록과 대조.
|
||||
|
||||
---
|
||||
|
||||
## 3. Rule Engine 출력
|
||||
|
||||
## 2.6 Rule 우선순위 및 충돌 처리
|
||||
|
||||
- 동일 리소스에 여러 Rule이 매칭되면 **가장 높은 severity**를 최종 severity로 채택한다.
|
||||
- reasons는 모두 남기되, `severity`는 max 기준으로 집계한다.
|
||||
- `breaking=true`는 `reasons`에 항목이 하나라도 있을 때만 설정된다.
|
||||
|
||||
### 3.1 기본 출력
|
||||
|
||||
```json
|
||||
{
|
||||
"breaking": true,
|
||||
"severity": "high",
|
||||
"reasons": [
|
||||
{
|
||||
"type": "values_key_removed",
|
||||
"key": "ingress.enabled",
|
||||
"detail": "custom-values.yaml에서 사용 중인 key가 삭제됨 — custom-values.yaml 수정 필요"
|
||||
}
|
||||
],
|
||||
"warnings": [
|
||||
{
|
||||
"type": "service_port_changed",
|
||||
"resource": "Service/airflow-webserver",
|
||||
"detail": "port changed from 8080 to 8081 — 신규 배포 시 참고"
|
||||
},
|
||||
{
|
||||
"type": "values_key_removed",
|
||||
"key": "old_setting",
|
||||
"detail": "custom-values.yaml에서 사용하지 않는 key 삭제 — 수정 불필요"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 3.2 severity 정의
|
||||
|
||||
| severity | 조건 |
|
||||
|----------|------|
|
||||
| `critical` | CRD storage version 변경 |
|
||||
| `high` | custom-values.yaml에서 사용 중인 values key 삭제/타입 변경, CRD required field 추가 |
|
||||
| `medium` | custom-values.yaml에서 사용 중인 subchart dependency major version 변경 |
|
||||
| `warning` | Deprecated API 사용, 미사용 values key 삭제, template 변경 (port, resource 등) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 확장 방법
|
||||
|
||||
새로운 Breaking 조건을 추가하려면 Rule 정의 파일에 항목을 추가한다.
|
||||
각 Rule은 다음 인터페이스를 구현한다:
|
||||
|
||||
```python
|
||||
class BreakingRule:
|
||||
name: str
|
||||
severity: str # critical / high / medium / warning
|
||||
|
||||
def check(self, diff: StructuredDiffJSON, custom_keys: set[str]) -> list[BreakingReason]:
|
||||
...
|
||||
```
|
||||
|
||||
Rule 목록은 설정 파일(`rules.yaml`)로 활성화/비활성화 가능하도록 설계한다.
|
||||
|
||||
---
|
||||
|
||||
## 5. 관련 문서
|
||||
|
||||
- [01-helm-diff-engine.md](01-helm-diff-engine.md) — Structured Diff JSON 생성
|
||||
- [03-llm-summarizer.md](03-llm-summarizer.md) — Breaking Change 결과를 LLM에 전달
|
||||
- [04-skill-interface.md](04-skill-interface.md) — `breaking_change_check` Skill 인터페이스
|
||||
Reference in New Issue
Block a user