G-1: 메신저 Webhook Relay + _send_to_room 실제 httpx 호출 구현 G-2: POST /api/tasks/bulk SR 대량작업 엔드포인트 (최대 100건) G-3: 라이선스 만료 알림 스케줄러 (매일 09:00 KST) G-4: 체험판 upgrade_banner 필드 + license.py 배너 로직 G-5: core/auto_rca.py + incidents/problem auto-rca 엔드포인트 G-6: core/deploy_impact.py + vibe impact-analysis 엔드포인트 G-7: core/ticket_classifier.py + SR 생성 시 AI 분류 + ai-suggestion API G-8: VulnPatchRecord 모델 + vuln_scan 패치추적 4개 엔드포인트 G-9: core/jira_sync.py + gateway Jira/Confluence 연동 엔드포인트 G-10: core/push_notify.py + routers/push.py + PushSubscription 모델 G-11: approvals 다중승인 (위임/서명/기한초과/마감연장) G-12: alembic.ini + migrations/ + cicd/migrate_to_postgres.sh 하네스: guardia-orchestrator 확장기능 Phase 반영 봇명령어: /sr /status /license /bulk 슬래시 명령어 추가 설치스크립트: setup/ (Ubuntu, CentOS, RHEL, Windows) --test 옵션 포함 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
293 lines
6.7 KiB
Markdown
293 lines
6.7 KiB
Markdown
# GUARDiA ITSM 연동 가이드
|
|
|
|
> **버전**: 1.0.0
|
|
> **최종 수정**: 2026-05-25
|
|
|
|
---
|
|
|
|
## 1. 연동 아키텍처
|
|
|
|
```
|
|
GUARDiA Messenger
|
|
│ !build <session_id>
|
|
▼
|
|
GUARDiA ITSM API
|
|
│ POST /api/vibe/{id}/build
|
|
│ (Jenkins REST API 호출)
|
|
▼
|
|
Jenkins Server
|
|
│ 파이프라인 실행
|
|
│
|
|
├── Stage 1~7 실행
|
|
│
|
|
└── Stage 8: ITSM Callback
|
|
│ POST /api/vibe/callback
|
|
▼
|
|
GUARDiA ITSM
|
|
│ SR 상태 = COMPLETED
|
|
│
|
|
├── 고객 이메일 발송
|
|
└── 메신저 결과 통보
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Jenkins → ITSM Callback API
|
|
|
|
### 2-1. 엔드포인트
|
|
|
|
```
|
|
POST /api/vibe/callback
|
|
Content-Type: application/json
|
|
Authorization: Bearer <ITSM_API_TOKEN>
|
|
```
|
|
|
|
### 2-2. 요청 바디
|
|
|
|
```json
|
|
{
|
|
"session_id": "42",
|
|
"sr_id": "SR-2026-001234",
|
|
"status": "COMPLETED",
|
|
"stage": "ITSM Callback",
|
|
"message": "배포 완료 (빌드 #15)",
|
|
"build_number": "15",
|
|
"build_url": "http://jenkins.agency.go.kr:8080/job/my-app/15/",
|
|
"deploy_env": "prd",
|
|
"timestamp": "2026-05-25T14:30:00Z",
|
|
"logs": {
|
|
"build": "빌드 성공 (45초)",
|
|
"test": "테스트 통과 (120/120)",
|
|
"deploy": "배포 완료 → /opt/apps/my-app",
|
|
"health_check": "HTTP 200 OK"
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2-3. 응답
|
|
|
|
```json
|
|
// 성공
|
|
{
|
|
"ok": true,
|
|
"sr_id": "SR-2026-001234",
|
|
"sr_status": "COMPLETED",
|
|
"notified": ["email", "messenger"]
|
|
}
|
|
|
|
// 실패
|
|
{
|
|
"ok": false,
|
|
"error": "세션을 찾을 수 없습니다."
|
|
}
|
|
```
|
|
|
|
### 2-4. 상태값 목록
|
|
|
|
| status | 설명 | SR 상태 변경 |
|
|
|--------|------|------------|
|
|
| `BUILDING` | 빌드 진행 중 | IN_PROGRESS |
|
|
| `TESTING` | 테스트 진행 중 | IN_PROGRESS |
|
|
| `DEPLOYING` | 배포 진행 중 | IN_PROGRESS |
|
|
| `COMPLETED` | 배포 완료 | COMPLETED |
|
|
| `FAILED` | 파이프라인 실패 | FAILED |
|
|
| `UNSTABLE` | 테스트 불안정 | IN_PROGRESS |
|
|
| `PENDING_APPROVAL` | 운영 배포 승인 대기 | PENDING |
|
|
| `ROLLED_BACK` | 롤백 완료 | IN_PROGRESS |
|
|
|
|
---
|
|
|
|
## 3. ITSM → Jenkins 빌드 트리거 API
|
|
|
|
### 3-1. Jenkins REST API 호출 형식
|
|
|
|
```bash
|
|
# 파라미터 있는 빌드 트리거
|
|
curl -X POST \
|
|
"http://jenkins.agency.go.kr:8080/job/${JOB_NAME}/buildWithParameters" \
|
|
--user "itsm-bot:${JENKINS_TOKEN}" \
|
|
--data-urlencode "ITSM_SESSION_ID=${SESSION_ID}" \
|
|
--data-urlencode "ITSM_SR_ID=${SR_ID}" \
|
|
--data-urlencode "DEPLOY_ENV=${DEPLOY_ENV}" \
|
|
--data-urlencode "TARGET_SERVER=${TARGET_SERVER}"
|
|
```
|
|
|
|
### 3-2. GUARDiA ITSM core/cicd.py
|
|
|
|
```python
|
|
import httpx
|
|
|
|
JENKINS_URL = os.getenv("JENKINS_URL", "http://jenkins.agency.go.kr:8080")
|
|
JENKINS_USER = os.getenv("JENKINS_USER", "itsm-bot")
|
|
JENKINS_TOKEN = os.getenv("JENKINS_TOKEN", "")
|
|
|
|
async def trigger_pipeline(
|
|
job_name: str,
|
|
session_id: int,
|
|
sr_id: str,
|
|
deploy_env: str = "dev",
|
|
target_server: str = "",
|
|
) -> dict:
|
|
url = f"{JENKINS_URL}/job/{job_name}/buildWithParameters"
|
|
auth = (JENKINS_USER, JENKINS_TOKEN)
|
|
params = {
|
|
"ITSM_SESSION_ID": str(session_id),
|
|
"ITSM_SR_ID": sr_id,
|
|
"DEPLOY_ENV": deploy_env,
|
|
"TARGET_SERVER": target_server,
|
|
}
|
|
async with httpx.AsyncClient(timeout=30) as client:
|
|
resp = await client.post(url, auth=auth, params=params)
|
|
resp.raise_for_status()
|
|
# 큐 번호는 Location 헤더에서 추출
|
|
location = resp.headers.get("Location", "")
|
|
queue_id = location.rstrip("/").split("/")[-1] if location else None
|
|
return {"queued": True, "queue_id": queue_id}
|
|
```
|
|
|
|
---
|
|
|
|
## 4. 환경 변수 설정
|
|
|
|
### 4-1. GUARDiA ITSM (.env)
|
|
|
|
```bash
|
|
# Jenkins 연동
|
|
JENKINS_URL=http://jenkins.agency.go.kr:8080
|
|
JENKINS_USER=itsm-bot
|
|
JENKINS_TOKEN=<API Token>
|
|
JENKINS_CALLBACK_URL=http://itsm.agency.go.kr:8000/api/vibe/callback
|
|
|
|
# 기본 Jenkins Job 이름 (프로젝트별로 재정의 가능)
|
|
JENKINS_DEFAULT_JOB=guardia-default-pipeline
|
|
```
|
|
|
|
### 4-2. Jenkins (JCasC or Manage Jenkins)
|
|
|
|
```yaml
|
|
# jenkins.yaml 참고
|
|
globalNodeProperties:
|
|
- envVars:
|
|
env:
|
|
- key: ITSM_URL
|
|
value: "http://itsm.agency.go.kr:8000"
|
|
- key: ITSM_CALLBACK_URL
|
|
value: "http://itsm.agency.go.kr:8000/api/vibe/callback"
|
|
```
|
|
|
|
### 4-3. Jenkins Credentials 등록 (ITSM Token)
|
|
|
|
```
|
|
Kind: Secret text
|
|
ID: itsm-api-token
|
|
Secret: <GUARDiA ITSM에서 발급한 API 토큰>
|
|
```
|
|
|
|
---
|
|
|
|
## 5. 봇 명령어 ↔ Jenkins 파이프라인 매핑
|
|
|
|
| 봇 명령어 | Jenkins Job | 설명 |
|
|
|---------|------------|------|
|
|
| `!build <session_id>` | `{project}-build` | 빌드 + 테스트만 |
|
|
| `!deploy <session_id> dev` | `{project}-deploy` | 개발 서버 배포 |
|
|
| `!deploy <session_id> prd` | `{project}-deploy` | 운영 서버 배포 (승인 필요) |
|
|
| `!rollback <session_id> <버전>` | `{project}-rollback` | 이전 버전 롤백 |
|
|
|
|
---
|
|
|
|
## 6. SR 상태 전환 흐름
|
|
|
|
```
|
|
OPEN
|
|
│ !vibe 명령
|
|
▼
|
|
IN_PROGRESS (바이브 코딩)
|
|
│ !build 명령
|
|
▼
|
|
IN_PROGRESS (빌드/테스트)
|
|
│ Jenkins 빌드 완료
|
|
▼
|
|
IN_PROGRESS (배포)
|
|
│ Jenkins 배포 완료 + 헬스체크 통과
|
|
▼
|
|
COMPLETED
|
|
│ 자동 이메일 + 메신저 발송
|
|
```
|
|
|
|
실패 시:
|
|
```
|
|
IN_PROGRESS
|
|
│ Jenkins FAILED 콜백
|
|
▼
|
|
FAILED
|
|
│ 롤백 자동 실행 (설정 시)
|
|
▼
|
|
IN_PROGRESS (수동 조치 대기)
|
|
```
|
|
|
|
---
|
|
|
|
## 7. 알림 포맷
|
|
|
|
### 7-1. 배포 완료 메신저 알림
|
|
|
|
```
|
|
✅ [SR-2026-001234] 배포 완료
|
|
|
|
📌 프로젝트: my-app
|
|
🌿 브랜치: main
|
|
🏗️ 빌드: #15
|
|
🌐 환경: 운영 (prd)
|
|
⏱️ 소요 시간: 4분 23초
|
|
|
|
✔️ 빌드: 성공
|
|
✔️ 테스트: 120/120 통과
|
|
✔️ 배포: /opt/apps/my-app
|
|
✔️ 헬스체크: HTTP 200 OK
|
|
|
|
승인자: 홍길동, 김철수
|
|
담당자: 이영희
|
|
```
|
|
|
|
### 7-2. 배포 실패 메신저 알림
|
|
|
|
```
|
|
❌ [SR-2026-001234] 배포 실패
|
|
|
|
📌 프로젝트: my-app
|
|
🏗️ 빌드: #15
|
|
💥 실패 단계: Health Check
|
|
|
|
원인: 서비스 응답 없음 (3회 재시도 후 타임아웃)
|
|
🔄 자동 롤백 완료 → 빌드 #14로 복원
|
|
|
|
조치 필요: http://jenkins.agency.go.kr:8080/job/my-app/15/
|
|
```
|
|
|
|
---
|
|
|
|
## 8. 연동 테스트
|
|
|
|
```bash
|
|
# 1. ITSM → Jenkins 트리거 테스트
|
|
curl -X POST \
|
|
"http://jenkins.agency.go.kr:8080/job/test-pipeline/buildWithParameters" \
|
|
--user "itsm-bot:<TOKEN>" \
|
|
--data-urlencode "ITSM_SESSION_ID=1" \
|
|
--data-urlencode "ITSM_SR_ID=SR-TEST-001" \
|
|
--data-urlencode "DEPLOY_ENV=dev"
|
|
|
|
# 2. Jenkins → ITSM 콜백 테스트
|
|
curl -X POST "http://itsm.agency.go.kr:8000/api/vibe/callback" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer <TOKEN>" \
|
|
-d '{
|
|
"session_id": "1",
|
|
"sr_id": "SR-TEST-001",
|
|
"status": "COMPLETED",
|
|
"message": "연동 테스트 성공",
|
|
"build_number": "1"
|
|
}'
|
|
```
|