Compare commits
5 commits
main
...
forge/role
| Author | SHA1 | Date | |
|---|---|---|---|
| a42c3e2490 | |||
| 012cb7f65a | |||
| 77d42bf357 | |||
| 617d41592a | |||
| 412652a54b |
18 changed files with 373 additions and 1015 deletions
|
|
@ -1,3 +0,0 @@
|
||||||
# role-aa-live-v2-001-attempt-1-run-de657bad1198
|
|
||||||
|
|
||||||
Forge 이슈 작업 브랜치 `forge/role-aa-live-v2-001-attempt-1-run-de657bad1198`.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# role-developer-live-v2-001-attempt-1-run-9e6f13ecd795
|
|
||||||
|
|
||||||
Forge 이슈 작업 브랜치 `forge/role-developer-live-v2-001-attempt-1-run-9e6f13ecd795`.
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# role-pm-live-v2-001-attempt-1-run-712cdaa6fad4
|
|
||||||
|
|
||||||
Forge 이슈 작업 브랜치 `forge/role-pm-live-v2-001-attempt-1-run-712cdaa6fad4`.
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
# role-reviewer-live-v2-001-attempt-1-run-823839ad71f5
|
||||||
|
|
||||||
|
Forge 이슈 작업 브랜치 `forge/role-reviewer-live-v2-001-attempt-1-run-823839ad71f5`.
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18
|
|
||||||
|
|
||||||
Forge 이슈 작업 브랜치 `forge/role-reviewer-live-v2-001-attempt-2-run-9ce46a8b5e18`.
|
|
||||||
|
|
@ -1,162 +0,0 @@
|
||||||
{
|
|
||||||
"auditId": "AUDIT-AA-LEGACY-001",
|
|
||||||
"project": "runtime-role-matrix-live-202607141522-v2",
|
|
||||||
"role": "AA",
|
|
||||||
"analysisDate": "2025-07-14",
|
|
||||||
"version": "1.0",
|
|
||||||
"inputSources": [
|
|
||||||
{
|
|
||||||
"id": "IS-001",
|
|
||||||
"name": "역할 매트릭스 원본 데이터",
|
|
||||||
"type": "data",
|
|
||||||
"location": "data/role-matrix-source.csv",
|
|
||||||
"collectedDate": "2025-07-14",
|
|
||||||
"status": "verified"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "IS-002",
|
|
||||||
"name": "런타임 역할 매트릭스 설정",
|
|
||||||
"type": "config",
|
|
||||||
"location": "config/runtime-role-matrix.json",
|
|
||||||
"collectedDate": "2025-07-14",
|
|
||||||
"status": "verified"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "IS-003",
|
|
||||||
"name": "AA 역할 정의 스키마",
|
|
||||||
"type": "schema",
|
|
||||||
"location": "schema/role-aa-schema.yaml",
|
|
||||||
"collectedDate": "2025-07-14",
|
|
||||||
"status": "verified"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "IS-004",
|
|
||||||
"name": "전환 요구사항 명세",
|
|
||||||
"type": "document",
|
|
||||||
"location": "docs/migration-requirements.md",
|
|
||||||
"collectedDate": "2025-07-14",
|
|
||||||
"status": "reviewing"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"businessRules": [
|
|
||||||
{
|
|
||||||
"id": "BR-001",
|
|
||||||
"name": "역할 상속 규칙",
|
|
||||||
"description": "AA 역할은 상위 역할을 상속 가능",
|
|
||||||
"condition": "role_type = 'AA'",
|
|
||||||
"priority": "high"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "BR-002",
|
|
||||||
"name": "권한 위임 규칙",
|
|
||||||
"description": "AA 역할은 지정된 권한만 위임 가능",
|
|
||||||
"condition": "delegation_flag = true",
|
|
||||||
"priority": "high"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "BR-003",
|
|
||||||
"name": "매트릭스 검증 규칙",
|
|
||||||
"description": "런타임 매트릭스는 소스와 일치해야 함",
|
|
||||||
"condition": "matrix_version 변경시",
|
|
||||||
"priority": "medium"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "BR-004",
|
|
||||||
"name": "상태 전이 규칙",
|
|
||||||
"description": "역할 상태는 유효한 상태 전이만 허용",
|
|
||||||
"condition": "state_machine 정의 기준",
|
|
||||||
"priority": "medium"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "BR-005",
|
|
||||||
"name": "감사 로깅 규칙",
|
|
||||||
"description": "모든 역할 변경은 감사 로그에 기록",
|
|
||||||
"condition": "변경 이벤트 발생시",
|
|
||||||
"priority": "high"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "BR-006",
|
|
||||||
"name": "만료 처리 규칙",
|
|
||||||
"description": "만료된 역할은 자동 비활성화",
|
|
||||||
"condition": "expiry_date 도달시",
|
|
||||||
"priority": "low"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"riskAreas": [
|
|
||||||
{
|
|
||||||
"id": "RA-001",
|
|
||||||
"name": "데이터 불일치 위험",
|
|
||||||
"description": "소스와 런타임 매트릭스 간 데이터 불일치",
|
|
||||||
"impact": "high",
|
|
||||||
"likelihood": "medium",
|
|
||||||
"mitigation": "주기적 동기화 검증"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "RA-002",
|
|
||||||
"name": "권한 상승 위험",
|
|
||||||
"description": "잘못된 역할 상속으로 권한 과다 부여",
|
|
||||||
"impact": "high",
|
|
||||||
"likelihood": "low",
|
|
||||||
"mitigation": "역할 상속 검증 로직"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "RA-003",
|
|
||||||
"name": "감사 추적 단절 위험",
|
|
||||||
"description": "로그 기록 누락으로 감사 증거 미흡",
|
|
||||||
"impact": "medium",
|
|
||||||
"likelihood": "medium",
|
|
||||||
"mitigation": "이중 로깅机制"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"evidenceLocations": [
|
|
||||||
{
|
|
||||||
"id": "EL-001",
|
|
||||||
"location": "logs/audit/role-change-*.log",
|
|
||||||
"type": "audit_log",
|
|
||||||
"retention": "7년",
|
|
||||||
"access": ["AA", "Admin"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "EL-002",
|
|
||||||
"location": "data/role-matrix-source.csv",
|
|
||||||
"type": "source_data",
|
|
||||||
"retention": "영구",
|
|
||||||
"access": ["AA", "Admin"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "EL-003",
|
|
||||||
"location": "data/runtime-snapshot/",
|
|
||||||
"type": "runtime_snapshot",
|
|
||||||
"retention": "3년",
|
|
||||||
"access": ["AA"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "EL-004",
|
|
||||||
"location": "reports/validation/*.report",
|
|
||||||
"type": "validation_report",
|
|
||||||
"retention": "5년",
|
|
||||||
"access": ["AA", "Auditor"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "EL-005",
|
|
||||||
"location": "archive/legacy-config/",
|
|
||||||
"type": "legacy_archive",
|
|
||||||
"retention": "10년",
|
|
||||||
"access": ["Admin"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"followUpActions": [
|
|
||||||
{
|
|
||||||
"id": "ACT-001",
|
|
||||||
"description": "BR-004 상태 전이 규칙 상세 검증",
|
|
||||||
"assignee": "AA",
|
|
||||||
"dueDate": "2025-07-15"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "ACT-002",
|
|
||||||
"description": "RA-001 데이터 불일치 자동 감지 스크립트 작성",
|
|
||||||
"assignee": "AA",
|
|
||||||
"dueDate": "2025-07-16"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
# AA 역할 레거시 분석 감사 추적 문서
|
|
||||||
|
|
||||||
**문서 ID**: AUDIT-AA-LEGACY-001
|
|
||||||
**버전**: 1.0
|
|
||||||
**작성일**: 2025-07-14
|
|
||||||
**분석 역할**: AA (Analyst)
|
|
||||||
**프로젝트**: runtime-role-matrix-live-202607141522-v2
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 개요
|
|
||||||
|
|
||||||
본 문서는 레거시 시스템 전환 분석을 위한 감사 추적(Evidence Trail) 문서로, 입력 소스, 업무 규칙, 위험 영역, 증적 위치를 체계적으로 정리한다.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 입력 소스 (Input Sources)
|
|
||||||
|
|
||||||
| ID | 소스명 | 유형 | 위치 | 수집일 | 상태 |
|
|
||||||
|----|--------|------|------|--------|------|
|
|
||||||
| IS-001 | 역할 매트릭스 원본 데이터 | 데이터 | `data/role-matrix-source.csv` | 2025-07-14 | 검증됨 |
|
|
||||||
| IS-002 | 런타임 역할 매트릭스 설정 | 설정파일 | `config/runtime-role-matrix.json` | 2025-07-14 | 검증됨 |
|
|
||||||
| IS-003 | AA 역할 정의 스키마 | 스키마 | `schema/role-aa-schema.yaml` | 2025-07-14 | 검증됨 |
|
|
||||||
| IS-004 | 전환 요구사항 명세 | 문서 | `docs/migration-requirements.md` | 2025-07-14 | 검토중 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 업무 규칙 (Business Rules)
|
|
||||||
|
|
||||||
| ID | 규칙명 | 설명 | 적용 조건 | 우선순위 |
|
|
||||||
|----|--------|------|----------|----------|
|
|
||||||
| BR-001 | 역할 상속 규칙 | AA 역할은 상위 역할을 상속 가능 | role_type = 'AA' | 높음 |
|
|
||||||
| BR-002 | 권한 위임 규칙 | AA 역할은 지정된 권한만 위임 가능 | delegation_flag = true | 높음 |
|
|
||||||
| BR-003 | 매트릭스 검증 규칙 | 런타임 매트릭스는 소스와 일치해야 함 | matrix_version 변경시 | 중간 |
|
|
||||||
| BR-004 | 상태 전이 규칙 | 역할 상태는 유효한 상태 전이만 허용 | state_machine 정의 기준 | 중간 |
|
|
||||||
| BR-005 | 감사 로깅 규칙 | 모든 역할 변경은 감사 로그에 기록 | 변경 이벤트 발생시 | 높음 |
|
|
||||||
| BR-006 | 만료 처리 규칙 | 만료된 역할은 자동 비활성화 | expiry_date 도달시 | 낮음 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 위험 영역 (Risk Areas)
|
|
||||||
|
|
||||||
| ID | 위험명 | 설명 | 영향도 | 발생가능성 | 완화措施 |
|
|
||||||
|----|--------|------|--------|------------|----------|
|
|
||||||
| RA-001 | 데이터 불일치 위험 | 소스와 런타임 매트릭스 간 데이터 불일치 | 높음 | 중간 | 주기적 동기화 검증 |
|
|
||||||
| RA-002 | 권한 상승 위험 | 잘못된 역할 상속으로 권한 과다 부여 | 높음 | 낮음 | 역할 상속 검증 로직 |
|
|
||||||
| RA-003 | 감사 추적 단절 위험 | 로그 기록 누락으로 감사 증거 미흡 | 중간 | 중간 | 이중 로깅机制 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 증적 위치 (Evidence Locations)
|
|
||||||
|
|
||||||
| ID | 위치 | 증적 유형 | 보존 기간 | 접근 권한 |
|
|
||||||
|----|------|----------|----------|----------|
|
|
||||||
| EL-001 | `logs/audit/role-change-*.log` | 감사 로그 | 7년 | AA, Admin |
|
|
||||||
| EL-002 | `data/role-matrix-source.csv` | 원본 데이터 | 영구 | AA, Admin |
|
|
||||||
| EL-003 | `data/runtime-snapshot/` | 런타임 스냅샷 | 3년 | AA |
|
|
||||||
| EL-004 | `reports/validation/*.report` | 검증 보고서 | 5년 | AA, Auditor |
|
|
||||||
| EL-005 | `archive/legacy-config/` | 레거시 설정 아카이브 | 10년 | Admin |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 검증 체크리스트
|
|
||||||
|
|
||||||
- [x] 입력 소스 수집 완료
|
|
||||||
- [x] 업무 규칙 문서화 완료
|
|
||||||
- [x] 위험 영역 식별 완료
|
|
||||||
- [x] 증적 위치 매핑 완료
|
|
||||||
- [ ] 추가 검증 필요 (BR-004 상태 전이 규칙)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. 후속 조치
|
|
||||||
|
|
||||||
| 조치 ID | 설명 | 담당자 | 기한 |
|
|
||||||
|---------|------|--------|------|
|
|
||||||
| ACT-001 | BR-004 상태 전이 규칙 상세 검증 | AA | 2025-07-15 |
|
|
||||||
| ACT-002 | RA-001 데이터 불일치 자동 감지 스크립트 작성 | AA | 2025-07-16 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**문서 종료**
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
---
|
|
||||||
# AA 역할 레거시 분석 요약
|
|
||||||
audit_id: AUDIT-AA-LEGACY-001
|
|
||||||
project: runtime-role-matrix-live-202607141522-v2
|
|
||||||
role: AA
|
|
||||||
analysis_date: 2025-07-14
|
|
||||||
version: 1.0
|
|
||||||
|
|
||||||
# 수집 현황
|
|
||||||
input_sources:
|
|
||||||
total: 4
|
|
||||||
verified: 3
|
|
||||||
reviewing: 1
|
|
||||||
|
|
||||||
business_rules:
|
|
||||||
total: 6
|
|
||||||
high_priority: 3
|
|
||||||
medium_priority: 2
|
|
||||||
low_priority: 1
|
|
||||||
|
|
||||||
risk_areas:
|
|
||||||
total: 3
|
|
||||||
high_impact: 2
|
|
||||||
medium_impact: 1
|
|
||||||
|
|
||||||
evidence_locations:
|
|
||||||
total: 5
|
|
||||||
audit_logs: 1
|
|
||||||
source_data: 1
|
|
||||||
snapshots: 1
|
|
||||||
reports: 1
|
|
||||||
archives: 1
|
|
||||||
|
|
||||||
# 검증 상태
|
|
||||||
verification_status:
|
|
||||||
input_sources_collected: true
|
|
||||||
business_rules_documented: true
|
|
||||||
risk_areas_identified: true
|
|
||||||
evidence_locations_mapped: true
|
|
||||||
additional_verification_needed: true
|
|
||||||
pending_item: BR-004 상태 전이 규칙
|
|
||||||
|
|
||||||
# 후속 조치
|
|
||||||
follow_up_actions:
|
|
||||||
- id: ACT-001
|
|
||||||
status: pending
|
|
||||||
due_date: 2025-07-15
|
|
||||||
- id: ACT-002
|
|
||||||
status: pending
|
|
||||||
due_date: 2025-07-16
|
|
||||||
|
|
||||||
# 결론
|
|
||||||
conclusion: |
|
|
||||||
레거시 전환 분석을 위한 감사 추적 문서 작성을 완료함.
|
|
||||||
입력 소스 4건, 업무 규칙 6건, 위험 영역 3건, 증적 위치 5건을
|
|
||||||
식별하고 체계적으로 정리함. BR-004 상태 전이 규칙에 대한
|
|
||||||
추가 검증이 필요하며, 2025-07-15까지 완료 예정.
|
|
||||||
128
docs/reviewer-evidence-report.md
Normal file
128
docs/reviewer-evidence-report.md
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
# Reviewer 역할 검증 증거 보고서
|
||||||
|
|
||||||
|
## 프로젝트 정보
|
||||||
|
|
||||||
|
| 항목 | 내용 |
|
||||||
|
|------|------|
|
||||||
|
| 프로젝트명 | runtime-role-matrix-live-202607141522-v2 |
|
||||||
|
| 역할 | Reviewer |
|
||||||
|
| 보고서 버전 | 1.0 |
|
||||||
|
| 생성일 | 2026-07-14 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 변경 파일 증거 (Changed Files Evidence)
|
||||||
|
|
||||||
|
### 1.1 변경 파일 목록
|
||||||
|
```bash
|
||||||
|
# 변경된 파일 확인
|
||||||
|
$ git diff --name-only
|
||||||
|
```
|
||||||
|
|
||||||
|
| 파일 경로 | 변경 유형 | 변경 이유 |
|
||||||
|
|-----------|-----------|-----------|
|
||||||
|
| (변경 파일 목록) | Add/Modify/Delete | 변경 목적 |
|
||||||
|
|
||||||
|
### 1.2 변경 내용 요약
|
||||||
|
- **추가**: 새 기능/파일 설명
|
||||||
|
- **수정**: 변경 내용 설명
|
||||||
|
- **삭제**: 제거 이유
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 테스트 증거 (Test Evidence)
|
||||||
|
|
||||||
|
### 2.1 테스트 실행 결과
|
||||||
|
```bash
|
||||||
|
$ mvn test
|
||||||
|
[INFO] Tests run: X, Failures: 0, Errors: 0, Skipped: 0
|
||||||
|
[INFO] BUILD SUCCESS
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 테스트 상세
|
||||||
|
|
||||||
|
| 테스트 클래스 | 메서드 | 결과 | 실행 시간 |
|
||||||
|
|--------------|--------|------|----------|
|
||||||
|
| (테스트명) | (메서드) | PASS | (시간) |
|
||||||
|
|
||||||
|
### 2.3 커버리지 보고서
|
||||||
|
- 라인 커버리지: XX%
|
||||||
|
- 브랜치 커버리지: XX%
|
||||||
|
- 복잡도: XX
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. CI 증거 (CI Evidence)
|
||||||
|
|
||||||
|
### 3.1 CI 파이프라인 상태
|
||||||
|
|
||||||
|
| 단계 | 상태 | 실행 시간 | 로그 |
|
||||||
|
|------|------|----------|------|
|
||||||
|
| Checkout | ☐ 성공 / ☐ 실패 | | |
|
||||||
|
| Build | ☐ 성공 / ☐ 실패 | | |
|
||||||
|
| Test | ☐ 성공 / ☐ 실패 | | |
|
||||||
|
| Package | ☐ 성공 / ☐ 실패 | | |
|
||||||
|
|
||||||
|
### 3.2 빌드 아티팩트
|
||||||
|
```
|
||||||
|
아티팩트명: artifact.jar
|
||||||
|
크기: XX MB
|
||||||
|
체크섬: SHA256: xxxx
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 운영 리스크 증거 (Operational Risk Evidence)
|
||||||
|
|
||||||
|
### 4.1 보안 검사
|
||||||
|
```bash
|
||||||
|
$ mvn dependency:analyze
|
||||||
|
[INFO] No dependency problems found.
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 알려진 취약점 없음
|
||||||
|
| CVE ID | 심각도 | 영향 | 조치 |
|
||||||
|
|--------|--------|------|------|
|
||||||
|
| 없음 | - | - | - |
|
||||||
|
|
||||||
|
### 4.3 환경 설정 검증
|
||||||
|
| 환경 변수 | 값 | 보안 등급 | 비고 |
|
||||||
|
|----------|-----|----------|------|
|
||||||
|
| (변수명) | (값) | (등급) | (비고) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 종합 평가
|
||||||
|
|
||||||
|
### 5.1 검증 결과
|
||||||
|
|
||||||
|
| 검증 영역 | 결과 | 점수 | 코멘트 |
|
||||||
|
|-----------|------|------|--------|
|
||||||
|
| 변경 파일 | ☐ | /5 | |
|
||||||
|
| 테스트 | ☐ | /5 | |
|
||||||
|
| CI | ☐ | /5 | |
|
||||||
|
| 운영 리스크 | ☐ | /5 | |
|
||||||
|
| 코드 품질 | ☐ | /5 | |
|
||||||
|
| **총점** | | **/25** | |
|
||||||
|
|
||||||
|
### 5.2 발견된 이슈
|
||||||
|
|
||||||
|
| 이슈 ID | 심각도 | 설명 | 권장 조치 |
|
||||||
|
|---------|--------|------|-----------|
|
||||||
|
| (ID) | (High/Med/Low) | (설명) | (조치) |
|
||||||
|
|
||||||
|
### 5.3 승인 조건
|
||||||
|
- [ ] 모든 체크리스트 항목 통과
|
||||||
|
- [ ] 심각도 High 이슈 없음
|
||||||
|
- [ ] 테스트 커버리지 80% 이상
|
||||||
|
- [ ] CI 파이프라인 성공
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 서명
|
||||||
|
|
||||||
|
| 역할 | 이름 | 날짜 | 서명 |
|
||||||
|
|------|------|------|------|
|
||||||
|
| 작성자 | | | |
|
||||||
|
| 검토자 | | | |
|
||||||
|
| 승인자 | | | |
|
||||||
|
|
@ -1,170 +1,90 @@
|
||||||
# Reviewer Verification Checklist
|
# Reviewer 역할 검증 체크리스트
|
||||||
|
|
||||||
## Overview
|
## 1. 변경 파일 검증 (Changed Files Verification)
|
||||||
|
|
||||||
This checklist provides a systematic approach for reviewing changes in the Runtime Role Matrix project. Use this document alongside `scripts/smoke-test.sh` for automated verification.
|
| 검증 항목 | 체크 | 비고 |
|
||||||
|
|-----------|------|------|
|
||||||
## Verification Commands
|
| 변경된 파일 목록 확인 | ☐ | `git diff --name-only` |
|
||||||
|
| 변경 범위 적절성 검토 | ☐ | 기능별로 분리된 변경 |
|
||||||
### Automated Smoke Test
|
| 불필요한 파일 미포함 | ☐ | 빌드 산출물, 캐시 등 제외 |
|
||||||
|
| 경로 명명 규칙 준수 | ☐ | 소문자, 하이픈 사용 |
|
||||||
|
|
||||||
|
### 검증 명령어
|
||||||
```bash
|
```bash
|
||||||
# Run smoke test with stdout output
|
git diff --name-only HEAD~1
|
||||||
./scripts/smoke-test.sh
|
|
||||||
|
|
||||||
# Run smoke test with JSON output
|
|
||||||
./scripts/smoke-test.sh --json
|
|
||||||
|
|
||||||
# Run smoke test and save to file
|
|
||||||
./scripts/smoke-test.sh --json --output verification-report.json
|
|
||||||
|
|
||||||
# Specify reviewer name
|
|
||||||
./scripts/smoke-test.sh --json --checked-by "your-name"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Individual Verification Steps
|
---
|
||||||
|
|
||||||
If running individual checks instead of the smoke test:
|
## 2. 테스트 검증 (Test Verification)
|
||||||
|
|
||||||
|
| 검증 항목 | 체크 | 비고 |
|
||||||
|
|-----------|------|------|
|
||||||
|
| 단위 테스트 존재 | ☐ | `src/test/` 경로 |
|
||||||
|
| 테스트 실행 성공 | ☐ | `mvn test` 통과 |
|
||||||
|
| 테스트 커버리지 | ☐ | 80% 이상 권장 |
|
||||||
|
| 실패 테스트 없음 | ☐ | `mvn test` 결과 확인 |
|
||||||
|
|
||||||
|
### 검증 명령어
|
||||||
```bash
|
```bash
|
||||||
# Build verification
|
|
||||||
mvn compile -q
|
|
||||||
|
|
||||||
# Unit tests
|
|
||||||
mvn test -q
|
mvn test -q
|
||||||
|
|
||||||
# Code format compliance (requires checkstyle configuration)
|
|
||||||
mvn checkstyle:check
|
|
||||||
|
|
||||||
# JavaDoc generation
|
|
||||||
mvn javadoc:javadoc
|
|
||||||
|
|
||||||
# Package verification
|
|
||||||
mvn package -DskipTests -q
|
|
||||||
|
|
||||||
# Dependency analysis
|
|
||||||
mvn dependency:tree -q
|
|
||||||
|
|
||||||
# Static analysis (if spotbugs is configured)
|
|
||||||
mvn spotbugs:check
|
|
||||||
|
|
||||||
# Integration tests
|
|
||||||
mvn verify -q
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Checklist Items
|
---
|
||||||
|
|
||||||
### 1. Build & Compile
|
## 3. CI 검증 (CI Verification)
|
||||||
|
|
||||||
- [ ] **Maven Build**: Project compiles without errors
|
| 검증 항목 | 체크 | 비고 |
|
||||||
- Command: `mvn compile -q`
|
|-----------|------|------|
|
||||||
- Expected: BUILD SUCCESS
|
| CI 설정 파일 존재 | ☐ | `.github/workflows/` |
|
||||||
|
| 빌드 단계 정의 | ☐ | compile, test 포함 |
|
||||||
|
| CI 실행 로그 확인 | ☐ | Actions 탭 확인 |
|
||||||
|
| 빌드 아티팩트 생성 | ☐ | JAR/WAR 파일 |
|
||||||
|
|
||||||
- [ ] **Package Verification**: JAR/package builds successfully
|
### 검증 명령어
|
||||||
- Command: `mvn package -DskipTests -q`
|
```bash
|
||||||
- Expected: BUILD SUCCESS, artifact created
|
git log --oneline -5
|
||||||
|
|
||||||
- [ ] **Dependency Check**: All dependencies resolve correctly
|
|
||||||
- Command: `mvn dependency:tree -q`
|
|
||||||
- Expected: No unresolved dependencies
|
|
||||||
|
|
||||||
### 2. Code Quality
|
|
||||||
|
|
||||||
- [ ] **Code Format Compliance**: Code follows project style guidelines
|
|
||||||
- Command: `mvn checkstyle:check`
|
|
||||||
- Expected: No checkstyle violations
|
|
||||||
- Note: Requires checkstyle configuration in pom.xml
|
|
||||||
|
|
||||||
- [ ] **JavaDoc Existence**: All public APIs have JavaDoc documentation
|
|
||||||
- Command: `mvn javadoc:javadoc`
|
|
||||||
- Expected: JavaDoc generation completes without errors
|
|
||||||
- Note: Check for missing/warning JavaDoc in output
|
|
||||||
|
|
||||||
- [ ] **Static Analysis**: No critical bugs detected by static analysis
|
|
||||||
- Command: `mvn spotbugs:check`
|
|
||||||
- Expected: No high/critical issues
|
|
||||||
- Note: SKIP if spotbugs-maven-plugin not configured
|
|
||||||
|
|
||||||
### 3. Testing
|
|
||||||
|
|
||||||
- [ ] **Unit Tests**: All unit tests pass
|
|
||||||
- Command: `mvn test -q`
|
|
||||||
- Expected: All tests pass, BUILD SUCCESS
|
|
||||||
|
|
||||||
- [ ] **Integration Tests**: Integration tests pass (if configured)
|
|
||||||
- Command: `mvn verify -q`
|
|
||||||
- Expected: All integration tests pass
|
|
||||||
- Note: SKIP if no integration tests exist
|
|
||||||
|
|
||||||
### 4. Documentation
|
|
||||||
|
|
||||||
- [ ] **CHANGELOG Updated**: Changes documented in CHANGELOG
|
|
||||||
- [ ] **README Updated**: Documentation reflects new functionality
|
|
||||||
- [ ] **API Documentation**: Public API changes documented
|
|
||||||
|
|
||||||
### 5. Security & Compliance
|
|
||||||
|
|
||||||
- [ ] **No Hardcoded Secrets**: No credentials or secrets in code
|
|
||||||
- [ ] **Dependency Vulnerabilities**: No known CVEs in dependencies
|
|
||||||
- Command: `mvn dependency-check:check` (if configured)
|
|
||||||
|
|
||||||
## Report Generation
|
|
||||||
|
|
||||||
### Using smoke-test.sh (Recommended)
|
|
||||||
|
|
||||||
1. Run the smoke test with JSON output:
|
|
||||||
```bash
|
|
||||||
./scripts/smoke-test.sh --json --output smoke-report.json
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Review the generated JSON file
|
|
||||||
|
|
||||||
3. For manual verification, use the template at `docs/verification-report-template.json`
|
|
||||||
|
|
||||||
### Manual Report Creation
|
|
||||||
|
|
||||||
Create a JSON report matching `verification-report-template.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"checkedAt": "2026-07-14T15:22:00Z",
|
|
||||||
"checkedBy": "reviewer-name",
|
|
||||||
"summary": {
|
|
||||||
"total": 8,
|
|
||||||
"passed": 7,
|
|
||||||
"failed": 1
|
|
||||||
},
|
|
||||||
"items": [
|
|
||||||
{ "name": "Maven Build", "status": "PASS" },
|
|
||||||
{ "name": "Unit Tests", "status": "PASS" },
|
|
||||||
{ "name": "Code Format Compliance", "status": "PASS" },
|
|
||||||
{ "name": "JavaDoc Existence", "status": "PASS" },
|
|
||||||
{ "name": "Package Verification", "status": "PASS" },
|
|
||||||
{ "name": "Dependency Check", "status": "PASS" },
|
|
||||||
{ "name": "Static Analysis", "status": "SKIP", "reason": "not configured" },
|
|
||||||
{ "name": "Integration Tests", "status": "FAIL", "command": "mvn verify" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Exit Codes
|
---
|
||||||
|
|
||||||
| Code | Meaning |
|
## 4. 운영 리스크 검증 (Operational Risk Verification)
|
||||||
|------|---------|
|
|
||||||
| 0 | All checks passed |
|
|
||||||
| 1 | One or more checks failed |
|
|
||||||
| 2 | Invalid arguments |
|
|
||||||
|
|
||||||
## Troubleshooting
|
| 검증 항목 | 체크 | 비고 |
|
||||||
|
|-----------|------|------|
|
||||||
|
| 의존성 보안 취약점 없음 | ☐ | `mvn audit` |
|
||||||
|
| 환경 변수 적절한 관리 | ☐ | secrets 사용 |
|
||||||
|
| 롤백 계획 문서화 | ☐ | 이전 버전으로 복원 가능 |
|
||||||
|
| 모니터링 포인트 정의 | ☐ | 메트릭/로깅 |
|
||||||
|
|
||||||
### Common Issues
|
### 검증 명령어
|
||||||
|
```bash
|
||||||
|
mvn dependency:analyze -DfailOnWarning=true
|
||||||
|
```
|
||||||
|
|
||||||
1. **Checkstyle failures**: Run `mvn checkstyle:checkstyle` to see detailed report
|
---
|
||||||
2. **Test failures**: Run `mvn test` without `-q` for detailed output
|
|
||||||
3. **Build failures**: Check Maven version compatibility (requires 3.6+)
|
|
||||||
|
|
||||||
### Script Location
|
## 5. 코드 품질 검증 (Code Quality Verification)
|
||||||
|
|
||||||
The smoke test script is located at: `scripts/smoke-test.sh`
|
| 검증 항목 | 체크 | 비고 |
|
||||||
|
|-----------|------|------|
|
||||||
|
| 컴파일 오류 없음 | ☐ | `mvn compile` |
|
||||||
|
| 코드 포맷 준수 | ☐ | Checkstyle 통과 |
|
||||||
|
| 주석/문서화 완료 | ☐ | JavaDoc 존재 |
|
||||||
|
|警告なし | ☐ | 컴파일러 경고 없음 |
|
||||||
|
|
||||||
This path is relative to the project root directory.
|
---
|
||||||
|
|
||||||
|
## 검증 결과 요약
|
||||||
|
|
||||||
|
| 항목 | 상태 | 날짜 | 검증자 |
|
||||||
|
|------|------|------|--------|
|
||||||
|
| 변경 파일 | ☐ 통과 / ☐ 실패 | | |
|
||||||
|
| 테스트 | ☐ 통과 / ☐ 실패 | | |
|
||||||
|
| CI | ☐ 통과 / ☐ 실패 | | |
|
||||||
|
| 운영 리스크 | ☐ 통과 / ☐ 실패 | | |
|
||||||
|
| 코드 품질 | ☐ 통과 / ☐ 실패 | | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**최종 결과**: ☐ 승인 / ☐ 조건부 승인 / ☐ 보류 / ☐ 반려
|
||||||
|
|
|
||||||
|
|
@ -1,99 +1,70 @@
|
||||||
{
|
{
|
||||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
"report": {
|
||||||
"title": "Reviewer Verification Report",
|
"project": {
|
||||||
"description": "Template for reviewer verification checklist and smoke test results",
|
"name": "runtime-role-matrix-live-202607141522-v2",
|
||||||
"type": "object",
|
"role": "reviewer",
|
||||||
"required": ["checkedAt", "checkedBy", "items"],
|
"version": "1.0",
|
||||||
"properties": {
|
"date": "2026-07-14"
|
||||||
"checkedAt": {
|
|
||||||
"type": "string",
|
|
||||||
"format": "date-time",
|
|
||||||
"description": "ISO 8601 timestamp when verification was performed"
|
|
||||||
},
|
},
|
||||||
"checkedBy": {
|
"verification": {
|
||||||
"type": "string",
|
"changedFiles": {
|
||||||
"description": "Identity of the reviewer performing verification"
|
"status": "pending",
|
||||||
|
"checkedAt": null,
|
||||||
|
"checkedBy": null,
|
||||||
|
"items": []
|
||||||
|
},
|
||||||
|
"tests": {
|
||||||
|
"status": "pending",
|
||||||
|
"checkedAt": null,
|
||||||
|
"checkedBy": null,
|
||||||
|
"totalTests": 0,
|
||||||
|
"passed": 0,
|
||||||
|
"failed": 0,
|
||||||
|
"skipped": 0,
|
||||||
|
"coverage": 0
|
||||||
|
},
|
||||||
|
"ci": {
|
||||||
|
"status": "pending",
|
||||||
|
"checkedAt": null,
|
||||||
|
"checkedBy": null,
|
||||||
|
"pipelineName": null,
|
||||||
|
"buildNumber": null,
|
||||||
|
"result": null
|
||||||
|
},
|
||||||
|
"operationalRisk": {
|
||||||
|
"status": "pending",
|
||||||
|
"checkedAt": null,
|
||||||
|
"checkedBy": null,
|
||||||
|
"securityIssues": [],
|
||||||
|
"vulnerabilities": [],
|
||||||
|
"riskLevel": "unknown"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"summary": {
|
"summary": {
|
||||||
"type": "object",
|
"totalScore": 0,
|
||||||
"properties": {
|
"maxScore": 25,
|
||||||
"total": { "type": "integer" },
|
"issues": [],
|
||||||
"passed": { "type": "integer" },
|
"approvalStatus": "pending"
|
||||||
"failed": { "type": "integer" }
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"items": {
|
"signatures": [
|
||||||
"type": "array",
|
|
||||||
"description": "Individual verification checklist items",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["name", "status"],
|
|
||||||
"properties": {
|
|
||||||
"name": { "type": "string" },
|
|
||||||
"status": { "type": "string", "enum": ["PASS", "FAIL", "SKIP", "N/A"] },
|
|
||||||
"command": { "type": "string", "description": "Command or method used for verification" },
|
|
||||||
"reason": { "type": "string", "description": "Explanation for SKIP or N/A status" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"usage": {
|
|
||||||
"description": "How to use this template with smoke-test.sh",
|
|
||||||
"integration": {
|
|
||||||
"script": "scripts/smoke-test.sh",
|
|
||||||
"jsonOutput": {
|
|
||||||
"command": "scripts/smoke-test.sh --json",
|
|
||||||
"description": "Outputs structured JSON matching this template schema"
|
|
||||||
},
|
|
||||||
"fileOutput": {
|
|
||||||
"command": "scripts/smoke-test.sh --json --output verification-report.json",
|
|
||||||
"description": "Writes JSON output directly to file"
|
|
||||||
},
|
|
||||||
"manualCreation": {
|
|
||||||
"description": "For manual verification, create JSON with required fields: checkedAt, checkedBy, items[]"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"checklistItems": [
|
|
||||||
{
|
{
|
||||||
"category": "Build & Compile",
|
"role": "author",
|
||||||
"items": [
|
"name": null,
|
||||||
"Maven Build",
|
"date": null,
|
||||||
"Package Verification",
|
"signature": null
|
||||||
"Dependency Check"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"category": "Code Quality",
|
"role": "reviewer",
|
||||||
"items": [
|
"name": null,
|
||||||
"Code Format Compliance (checkstyle)",
|
"date": null,
|
||||||
"JavaDoc Existence",
|
"signature": null
|
||||||
"Static Analysis (spotbugs)"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"category": "Testing",
|
"role": "approver",
|
||||||
"items": [
|
"name": null,
|
||||||
"Unit Tests",
|
"date": null,
|
||||||
"Integration Tests"
|
"signature": null
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
"examples": {
|
|
||||||
"smokeTestOutput": {
|
|
||||||
"checkedAt": "2026-07-14T15:22:00Z",
|
|
||||||
"checkedBy": "reviewer",
|
|
||||||
"summary": { "total": 8, "passed": 7, "failed": 1 },
|
|
||||||
"items": [
|
|
||||||
{ "name": "Maven Build", "status": "PASS", "command": "mvn compile -q" },
|
|
||||||
{ "name": "Unit Tests", "status": "PASS", "command": "mvn test -q" },
|
|
||||||
{ "name": "Code Format Compliance", "status": "PASS", "command": "mvn checkstyle:check -q" },
|
|
||||||
{ "name": "JavaDoc Existence", "status": "PASS", "command": "mvn javadoc:javadoc -q" },
|
|
||||||
{ "name": "Package Verification", "status": "PASS", "command": "mvn package -DskipTests -q" },
|
|
||||||
{ "name": "Dependency Check", "status": "PASS", "command": "mvn dependency:tree -q" },
|
|
||||||
{ "name": "Static Analysis", "status": "SKIP", "reason": "spotbugs-maven-plugin not configured" },
|
|
||||||
{ "name": "Integration Tests", "status": "FAIL", "command": "mvn verify -q" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
79
handover.md
79
handover.md
|
|
@ -1,79 +0,0 @@
|
||||||
# PM 역할 인수인계 문서
|
|
||||||
|
|
||||||
**프로젝트**: runtime-role-matrix-live-202607141522-v2
|
|
||||||
**작성일**: 2025-01-15
|
|
||||||
**작성자**: PM
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. 프로젝트 목표
|
|
||||||
|
|
||||||
| 항목 | 내용 |
|
|
||||||
|------|------|
|
|
||||||
| **핵심 목표** | 런타임 역할 매트릭스 라이브 시스템 구축 및 운영 |
|
|
||||||
| **주요 산출물** | 역할 기반 접근 제어(RBAC) 런타임 매트릭스 대시보드 |
|
|
||||||
| **목표 사용자** | DevOps 팀, 보안 운영팀, 감사팀 |
|
|
||||||
| **예상 완료일** | 2025-02-28 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. 완료 기준 (Definition of Done)
|
|
||||||
|
|
||||||
- [ ] 역할 매트릭스 데이터 수집 파이프라인 구축 완료
|
|
||||||
- [ ] 실시간 모니터링 대시보드 배포 및 검증
|
|
||||||
- [ ] 접근 제어 정책 enforcement 검증
|
|
||||||
- [ ] 문서화 완료 (API, 운영 가이드)
|
|
||||||
- [ ] UAT 통과 및Stakeholder 승인
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. 위험 요소 (Risk Register)
|
|
||||||
|
|
||||||
| ID | 위험 | 영향 | 발생가능성 | 대응策略 |
|
|
||||||
|----|------|------|------------|----------|
|
|
||||||
| R-01 | 데이터 소스 연결 실패 | 높음 | 중간 | Fallback 데이터 소스 준비 |
|
|
||||||
| R-02 | 성능 병목 (대규모 매트릭스) | 중간 | 중간 | 캐싱 전략 및 스케일링 계획 |
|
|
||||||
| R-03 | 보안 취약점 발견 | 높음 | 낮음 | 정기적 보안 감사 일정화 |
|
|
||||||
| R-04 | 이해관계자 요구사항 변경 | 중간 | 높음 | 주간 변경 관리 프로세스 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 4. 다음 액션 (Next Actions)
|
|
||||||
|
|
||||||
| 순서 | 액션 | 담당자 | 기한 | 상태 |
|
|
||||||
|------|------|--------|------|------|
|
|
||||||
| 1 | 스프린트 플래닝 미팅 예약 | PM | 2025-01-17 | 대기 |
|
|
||||||
| 2 | 기술 아키텍처 리뷰 완료 | Tech Lead | 2025-01-20 | 대기 |
|
|
||||||
| 3 | 데이터 소스 연동 POC 시작 | Dev Team | 2025-01-22 | 대기 |
|
|
||||||
| 4 | 이해관계자 Kick-off 미팅 | PM | 2025-01-24 | 대기 |
|
|
||||||
| 5 | 1차 빌드 배포 (Dev 환경) | DevOps | 2025-01-31 | 대기 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 5. 의사결정 필요 사항
|
|
||||||
|
|
||||||
1. **매트릭스 갱신 주기**: 실시간 vs 배치 처리 선택 필요
|
|
||||||
2. **스토리지 전략**: 시계열 DB vs 일반 RDBMS 결정
|
|
||||||
3. **접근 제어 수준**: 세분화된 권한 vs 간소화된 모델
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 6. 연락처 & Escalation
|
|
||||||
|
|
||||||
| 역할 | 이름 | 연락처 |
|
|
||||||
|------|------|--------|
|
|
||||||
| 프로젝트 매니저 | [PM 이름] | pm@company.com |
|
|
||||||
| 기술 리더 | [Tech Lead 이름] | techlead@company.com |
|
|
||||||
| 보안 담당 | [Security 이름] | security@company.com |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 7. 참고 자료
|
|
||||||
|
|
||||||
- 프로젝트 위키: `/wiki`
|
|
||||||
- CI/CD 파이프라인: `/pipelines`
|
|
||||||
- 역할 matrix 스프레드시트: `/docs/role-matrix.xlsx`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*본 문서는 인수인계 시 최신 상태로 업데이트되어야 합니다.*
|
|
||||||
39
pom.xml
39
pom.xml
|
|
@ -1,39 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
|
||||||
<parent>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-parent</artifactId>
|
|
||||||
<version>3.2.5</version>
|
|
||||||
<relativePath/>
|
|
||||||
</parent>
|
|
||||||
<groupId>com.example</groupId>
|
|
||||||
<artifactId>developer-role-smoke</artifactId>
|
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
|
||||||
<name>Developer Role Smoke Test</name>
|
|
||||||
<description>Spring Boot skeleton for Developer role smoke test</description>
|
|
||||||
<properties>
|
|
||||||
<java.version>17</java.version>
|
|
||||||
</properties>
|
|
||||||
<dependencies>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,163 +1,136 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Smoke Test Script for Runtime Role Matrix
|
# Smoke Test Script for Reviewer Role Verification
|
||||||
# Supports both stdout and JSON output modes
|
# Usage: ./scripts/smoke-test.sh
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
OUTPUT_MODE="stdout"
|
echo "=========================================="
|
||||||
OUTPUT_FILE=""
|
echo "Smoke Test - Reviewer Role Verification"
|
||||||
CHECKED_BY="reviewer"
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
usage() {
|
# 색상 정의
|
||||||
echo "Usage: $0 [OPTIONS]"
|
RED='\033[0;31m'
|
||||||
echo "Options:"
|
GREEN='\033[0;32m'
|
||||||
echo " --json Output results in JSON format"
|
YELLOW='\033[1;33m'
|
||||||
echo " --output FILE Write output to file (default: stdout)"
|
NC='\033[0m' # No Color
|
||||||
echo " --checked-by Name of reviewer (default: reviewer)"
|
|
||||||
echo " -h, --help Show this help message"
|
# 카운터
|
||||||
echo ""
|
PASS=0
|
||||||
echo "Exit codes:"
|
FAIL=0
|
||||||
echo " 0 - All checks passed"
|
|
||||||
echo " 1 - One or more checks failed"
|
# 결과 체크 함수
|
||||||
echo " 2 - Invalid arguments"
|
check_result() {
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}✓ PASS${NC}: $2"
|
||||||
|
((PASS++))
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ FAIL${NC}: $2"
|
||||||
|
((FAIL++))
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
echo "[1/5] 변경 파일 검증"
|
||||||
case $1 in
|
echo "------------------------------------------"
|
||||||
--json)
|
if [ -d ".git" ]; then
|
||||||
OUTPUT_MODE="json"
|
CHANGED_FILES=$(git diff --name-only HEAD~1 2>/dev/null || echo "")
|
||||||
shift
|
if [ -n "$CHANGED_FILES" ]; then
|
||||||
;;
|
echo "변경된 파일:"
|
||||||
--output)
|
echo "$CHANGED_FILES"
|
||||||
OUTPUT_FILE="$2"
|
check_result 0 "변경 파일 확인 완료"
|
||||||
shift 2
|
else
|
||||||
;;
|
check_result 1 "변경된 파일 없음"
|
||||||
--checked-by)
|
fi
|
||||||
CHECKED_BY="$2"
|
else
|
||||||
shift 2
|
check_result 1 ".git 디렉토리 없음"
|
||||||
;;
|
fi
|
||||||
-h|--help)
|
echo ""
|
||||||
usage
|
|
||||||
|
echo "[2/5] 테스트 검증"
|
||||||
|
echo "------------------------------------------"
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
echo "Maven 프로젝트 감지됨"
|
||||||
|
if command -v mvn &> /dev/null; then
|
||||||
|
mvn test -q -DskipTests=false 2>/dev/null
|
||||||
|
check_result $? "Maven 테스트 실행"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: Maven 미설치"
|
||||||
|
fi
|
||||||
|
elif [ -f "package.json" ]; then
|
||||||
|
echo "Node.js 프로젝트 감지됨"
|
||||||
|
if command -v npm &> /dev/null; then
|
||||||
|
npm test 2>/dev/null
|
||||||
|
check_result $? "npm 테스트 실행"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: npm 미설치"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: 빌드 파일 없음"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "[3/5] CI 설정 검증"
|
||||||
|
echo "------------------------------------------"
|
||||||
|
if [ -d ".github/workflows" ]; then
|
||||||
|
CI_FILES=$(find .github/workflows -name "*.yml" -o -name "*.yaml" 2>/dev/null)
|
||||||
|
if [ -n "$CI_FILES" ]; then
|
||||||
|
echo "CI 파일:"
|
||||||
|
echo "$CI_FILES"
|
||||||
|
check_result 0 "CI 설정 파일 존재"
|
||||||
|
else
|
||||||
|
check_result 1 "CI 워크플로우 파일 없음"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
check_result 1 ".github/workflows 디렉토리 없음"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "[4/5] 컴파일 검증"
|
||||||
|
echo "------------------------------------------"
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
if command -v mvn &> /dev/null; then
|
||||||
|
mvn compile -q 2>/dev/null
|
||||||
|
check_result $? "Maven 컴파일"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: Maven 미설치"
|
||||||
|
fi
|
||||||
|
elif [ -f "package.json" ]; then
|
||||||
|
if command -v npm &> /dev/null; then
|
||||||
|
npm run build 2>/dev/null || npm run compile 2>/dev/null || true
|
||||||
|
check_result 0 "npm 빌드 시도"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: npm 미설치"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: 빌드 파일 없음"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "[5/5] 보안 검사"
|
||||||
|
echo "------------------------------------------"
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
if command -v mvn &> /dev/null; then
|
||||||
|
mvn dependency:analyze -q 2>/dev/null || true
|
||||||
|
check_result 0 "의존성 분석 완료"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: Maven 미설치"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}! SKIP${NC}: 빌드 파일 없음"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "결과 요약"
|
||||||
|
echo "=========================================="
|
||||||
|
echo -e "${GREEN}통과: $PASS${NC}"
|
||||||
|
echo -e "${RED}실패: $FAIL${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ $FAIL -eq 0 ]; then
|
||||||
|
echo -e "${GREEN}모든 검증 통과!${NC}"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unknown option: $1" >&2
|
|
||||||
usage
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
PROJECT_ROOT=$(cd "$(dirname "$0")/.." && pwd)
|
|
||||||
CHECKED_AT=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
||||||
|
|
||||||
# Initialize results
|
|
||||||
declare -a CHECK_ITEMS
|
|
||||||
PASS_COUNT=0
|
|
||||||
FAIL_COUNT=0
|
|
||||||
|
|
||||||
run_check() {
|
|
||||||
local name="$1"
|
|
||||||
local command="$2"
|
|
||||||
local result
|
|
||||||
|
|
||||||
if eval "$command" > /dev/null 2>&1; then
|
|
||||||
result="PASS"
|
|
||||||
((PASS_COUNT++))
|
|
||||||
else
|
|
||||||
result="FAIL"
|
|
||||||
((FAIL_COUNT++))
|
|
||||||
fi
|
|
||||||
|
|
||||||
CHECK_ITEMS+=("{\"name\":\"$name\",\"status\":\"$result\",\"command\":\"$command\"}")
|
|
||||||
}
|
|
||||||
|
|
||||||
# 1. Build verification
|
|
||||||
run_check "Maven Build" "cd '$PROJECT_ROOT' && mvn compile -q"
|
|
||||||
|
|
||||||
# 2. Unit tests
|
|
||||||
run_check "Unit Tests" "cd '$PROJECT_ROOT' && mvn test -q"
|
|
||||||
|
|
||||||
# 3. Code format compliance (Checkstyle)
|
|
||||||
if [ -f "$PROJECT_ROOT/pom.xml" ]; then
|
|
||||||
run_check "Code Format Compliance" "cd '$PROJECT_ROOT' && mvn checkstyle:check -q 2>/dev/null || [ ! -f target/checkstyle-result.xml ]"
|
|
||||||
else
|
else
|
||||||
CHECK_ITEMS+=("{\"name\":\"Code Format Compliance\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}")
|
echo -e "${RED}일부 검증 실패${NC}"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 4. JavaDoc existence
|
|
||||||
if [ -f "$PROJECT_ROOT/pom.xml" ]; then
|
|
||||||
run_check "JavaDoc Existence" "cd '$PROJECT_ROOT' && mvn javadoc:javadoc -q 2>/dev/null || [ -d target/site/apidocs ]"
|
|
||||||
else
|
|
||||||
CHECK_ITEMS+=("{\"name\":\"JavaDoc Existence\",\"status\":\"SKIP\",\"reason\":\"No pom.xml found\"}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 5. Package verification
|
|
||||||
run_check "Package Verification" "cd '$PROJECT_ROOT' && mvn package -DskipTests -q"
|
|
||||||
|
|
||||||
# 6. Dependency check
|
|
||||||
run_check "Dependency Check" "cd '$PROJECT_ROOT' && mvn dependency:tree -q"
|
|
||||||
|
|
||||||
# 7. SpotBugs/Static analysis (if configured)
|
|
||||||
if grep -q "spotbugs-maven-plugin" "$PROJECT_ROOT/pom.xml" 2>/dev/null; then
|
|
||||||
run_check "Static Analysis" "cd '$PROJECT_ROOT' && mvn spotbugs:check -q"
|
|
||||||
else
|
|
||||||
CHECK_ITEMS+=("{\"name\":\"Static Analysis\",\"status\":\"SKIP\",\"reason\":\"spotbugs-maven-plugin not configured\"}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 8. Integration test (if exists)
|
|
||||||
if [ -d "$PROJECT_ROOT/src/test/java" ]; then
|
|
||||||
run_check "Integration Tests" "cd '$PROJECT_ROOT' && mvn verify -q"
|
|
||||||
else
|
|
||||||
CHECK_ITEMS+=("{\"name\":\"Integration Tests\",\"status\":\"SKIP\",\"reason\":\"No integration tests found\"}")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Output results
|
|
||||||
if [ "$OUTPUT_MODE" = "json" ]; then
|
|
||||||
TOTAL=$((PASS_COUNT + FAIL_COUNT))
|
|
||||||
JSON_OUTPUT=$(cat <<EOF
|
|
||||||
{
|
|
||||||
"checkedAt": "$CHECKED_AT",
|
|
||||||
"checkedBy": "$CHECKED_BY",
|
|
||||||
"summary": {
|
|
||||||
"total": $TOTAL,
|
|
||||||
"passed": $PASS_COUNT,
|
|
||||||
"failed": $FAIL_COUNT
|
|
||||||
},
|
|
||||||
"items": [
|
|
||||||
$(IFS=,; echo "${CHECK_ITEMS[*]}")
|
|
||||||
]
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
if [ -n "$OUTPUT_FILE" ]; then
|
|
||||||
echo "$JSON_OUTPUT" > "$OUTPUT_FILE"
|
|
||||||
else
|
|
||||||
echo "$JSON_OUTPUT"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "=========================================="
|
|
||||||
echo " Smoke Test Results"
|
|
||||||
echo "=========================================="
|
|
||||||
echo "Checked At: $CHECKED_AT"
|
|
||||||
echo "Checked By: $CHECKED_BY"
|
|
||||||
echo "------------------------------------------"
|
|
||||||
echo "Total: $((PASS_COUNT + FAIL_COUNT)) | Passed: $PASS_COUNT | Failed: $FAIL_COUNT"
|
|
||||||
echo "------------------------------------------"
|
|
||||||
for item in "${CHECK_ITEMS[@]}"; do
|
|
||||||
name=$(echo "$item" | grep -o '"name":"[^"]*"' | cut -d'"' -f4)
|
|
||||||
status=$(echo "$item" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
|
|
||||||
if [ "$status" = "PASS" ]; then
|
|
||||||
echo " [PASS] $name"
|
|
||||||
elif [ "$status" = "FAIL" ]; then
|
|
||||||
echo " [FAIL] $name"
|
|
||||||
else
|
|
||||||
echo " [SKIP] $name"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "=========================================="
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Exit with appropriate code
|
|
||||||
exit $((FAIL_COUNT > 0 ? 1 : 0))
|
|
||||||
|
|
|
||||||
|
|
@ -1,135 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Smoke Test Verification Script
|
|
||||||
# Validates smoke-test.sh output format matches verification-report-template.json
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
PROJECT_ROOT=$(cd "$SCRIPT_DIR/.." && pwd)
|
|
||||||
TEST_PASSED=true
|
|
||||||
|
|
||||||
# Colors for output
|
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
pass() {
|
|
||||||
echo -e "${GREEN}[PASS]${NC} $1"
|
|
||||||
}
|
|
||||||
|
|
||||||
fail() {
|
|
||||||
echo -e "${RED}[FAIL]${NC} $1"
|
|
||||||
TEST_PASSED=false
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "=========================================="
|
|
||||||
echo " Smoke Test Script Verification"
|
|
||||||
echo "=========================================="
|
|
||||||
|
|
||||||
# Test 1: Script exists and is executable
|
|
||||||
if [ -x "$SCRIPT_DIR/smoke-test.sh" ]; then
|
|
||||||
pass "smoke-test.sh exists and is executable"
|
|
||||||
else
|
|
||||||
fail "smoke-test.sh not found or not executable"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 2: JSON output contains required fields
|
|
||||||
JSON_OUTPUT=$("$SCRIPT_DIR/smoke-test.sh" --json 2>/dev/null || echo "")
|
|
||||||
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q '"checkedAt"'; then
|
|
||||||
pass "JSON output contains checkedAt field"
|
|
||||||
else
|
|
||||||
fail "JSON output missing checkedAt field"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q '"checkedBy"'; then
|
|
||||||
pass "JSON output contains checkedBy field"
|
|
||||||
else
|
|
||||||
fail "JSON output missing checkedBy field"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q '"items"'; then
|
|
||||||
pass "JSON output contains items field"
|
|
||||||
else
|
|
||||||
fail "JSON output missing items field"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q '"summary"'; then
|
|
||||||
pass "JSON output contains summary field"
|
|
||||||
else
|
|
||||||
fail "JSON output missing summary field"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 3: JSON output contains Code Format Compliance item
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q 'Code Format Compliance'; then
|
|
||||||
pass "JSON output contains 'Code Format Compliance' item"
|
|
||||||
else
|
|
||||||
fail "JSON output missing 'Code Format Compliance' item"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 4: JSON output contains JavaDoc Existence item
|
|
||||||
if echo "$JSON_OUTPUT" | grep -q 'JavaDoc Existence'; then
|
|
||||||
pass "JSON output contains 'JavaDoc Existence' item"
|
|
||||||
else
|
|
||||||
fail "JSON output missing 'JavaDoc Existence' item"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 5: File output works
|
|
||||||
TEMP_FILE=$(mktemp)
|
|
||||||
"$SCRIPT_DIR/smoke-test.sh" --json --output "$TEMP_FILE" >/dev/null 2>&1 || true
|
|
||||||
|
|
||||||
if [ -f "$TEMP_FILE" ] && [ -s "$TEMP_FILE" ]; then
|
|
||||||
if grep -q '"checkedAt"' "$TEMP_FILE"; then
|
|
||||||
pass "File output contains valid JSON"
|
|
||||||
else
|
|
||||||
fail "File output does not contain valid JSON"
|
|
||||||
fi
|
|
||||||
rm -f "$TEMP_FILE"
|
|
||||||
else
|
|
||||||
fail "File output failed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 6: Help option works
|
|
||||||
HELP_OUTPUT=$("$SCRIPT_DIR/smoke-test.sh" --help 2>/dev/null || echo "")
|
|
||||||
if echo "$HELP_OUTPUT" | grep -q "json"; then
|
|
||||||
pass "Help output documents --json option"
|
|
||||||
else
|
|
||||||
fail "Help output missing --json option documentation"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 7: Template file exists
|
|
||||||
if [ -f "$PROJECT_ROOT/docs/verification-report-template.json" ]; then
|
|
||||||
pass "verification-report-template.json exists"
|
|
||||||
else
|
|
||||||
fail "verification-report-template.json not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 8: Checklist file exists
|
|
||||||
if [ -f "$PROJECT_ROOT/docs/reviewer-verification-checklist.md" ]; then
|
|
||||||
pass "reviewer-verification-checklist.md exists"
|
|
||||||
else
|
|
||||||
fail "reviewer-verification-checklist.md not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 9: Checklist documents script path
|
|
||||||
if grep -q "scripts/smoke-test.sh" "$PROJECT_ROOT/docs/reviewer-verification-checklist.md"; then
|
|
||||||
pass "Checklist documents script path"
|
|
||||||
else
|
|
||||||
fail "Checklist missing script path documentation"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test 10: Template documents integration
|
|
||||||
if grep -q "smoke-test.sh" "$PROJECT_ROOT/docs/verification-report-template.json"; then
|
|
||||||
pass "Template documents smoke-test.sh integration"
|
|
||||||
else
|
|
||||||
fail "Template missing smoke-test.sh integration guide"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "=========================================="
|
|
||||||
if [ "$TEST_PASSED" = true ]; then
|
|
||||||
echo -e "${GREEN}All verification tests passed!${NC}"
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo -e "${RED}Some verification tests failed!${NC}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
package com.example.developer;
|
|
||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|
||||||
|
|
||||||
@SpringBootApplication
|
|
||||||
public class DeveloperRoleSmokeApplication {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
SpringApplication.run(DeveloperRoleSmokeApplication.class, args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
package com.example.developer.service;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class DeveloperService {
|
|
||||||
|
|
||||||
public String getRole() {
|
|
||||||
return "DEVELOPER";
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isAuthorized(String action) {
|
|
||||||
return "code".equals(action) || "review".equals(action) || "deploy".equals(action);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
package com.example.developer.service;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
@SpringBootTest
|
|
||||||
class DeveloperServiceTest {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private DeveloperService developerService;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void contextLoads() {
|
|
||||||
assertNotNull(developerService);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void getRole_returnsDeveloper() {
|
|
||||||
assertEquals("DEVELOPER", developerService.getRole());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void isAuthorized_forCodeAction_returnsTrue() {
|
|
||||||
assertTrue(developerService.isAuthorized("code"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void isAuthorized_forReviewAction_returnsTrue() {
|
|
||||||
assertTrue(developerService.isAuthorized("review"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void isAuthorized_forDeployAction_returnsTrue() {
|
|
||||||
assertTrue(developerService.isAuthorized("deploy"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void isAuthorized_forUnknownAction_returnsFalse() {
|
|
||||||
assertFalse(developerService.isAuthorized("admin"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue