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>
6.7 KiB
6.7 KiB
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. 요청 바디
{
"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. 응답
// 성공
{
"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 호출 형식
# 파라미터 있는 빌드 트리거
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
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)
# 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)
# 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. 연동 테스트
# 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"
}'