zioinfo-mail/itsm/cicd/docs/04_itsm_integration.md
DESKTOP-TKLFCPR\ython e228faabf5 feat(itsm): G-1~G-12 확장 기능 + 하네스/봇/설치스크립트 구현
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>
2026-05-29 18:18:52 +09:00

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"
    }'