#!/usr/bin/env bash # ============================================================================= # GUARDiA ITSM 결과 콜백 스크립트 # Jenkins Stage 8: ITSM Callback에서 호출 # 사용: itsm_callback.sh [MESSAGE] # STATUS: BUILDING|TESTING|DEPLOYING|COMPLETED|FAILED|UNSTABLE|PENDING_APPROVAL|ROLLED_BACK # ============================================================================= set -euo pipefail STATUS="${1:-FAILED}" MESSAGE="${2:-파이프라인 실행 완료}" # ── 환경변수 ───────────────────────────────────────────────────────────────── ITSM_URL="${ITSM_URL:-http://itsm.agency.go.kr:8000}" ITSM_CALLBACK_URL="${ITSM_CALLBACK_URL:-${ITSM_URL}/api/vibe/callback}" ITSM_TOKEN="${ITSM_TOKEN:-}" # withCredentials로 주입 ITSM_SESSION_ID="${ITSM_SESSION_ID:-}" # Jenkins 파라미터 ITSM_SR_ID="${ITSM_SR_ID:-}" # Jenkins 파라미터 BUILD_NUMBER="${BUILD_NUMBER:-0}" BUILD_URL="${BUILD_URL:-}" DEPLOY_ENV="${DEPLOY_ENV:-dev}" JOB_NAME="${JOB_NAME:-unknown-job}" STAGE_NAME="${STAGE_NAME:-}" LOG_DIR="${WORKSPACE:-/tmp}/build-logs" CALLBACK_LOG="${LOG_DIR}/itsm-callback.log" GREEN='\033[0;32m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m' log() { echo -e "${GREEN}[ITSM]${NC} $*" | tee -a "${CALLBACK_LOG}"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*" | tee -a "${CALLBACK_LOG}"; } err() { echo -e "${RED}[ERROR]${NC} $*" | tee -a "${CALLBACK_LOG}"; } mkdir -p "${LOG_DIR}" # ── 세션 ID 없으면 경고 후 종료 (비배포 브랜치 등) ───────────────────────── if [[ -z "${ITSM_SESSION_ID}" ]]; then warn "ITSM_SESSION_ID가 설정되지 않았습니다 — 콜백 건너뜀" exit 0 fi log "ITSM 콜백: ${STATUS} — ${MESSAGE}" # ── 빌드 로그 요약 수집 ────────────────────────────────────────────────────── get_log_summary() { local log_type="$1" local log_file="${LOG_DIR}/${log_type}-"*".log" 2>/dev/null if compgen -G "${log_file}" > /dev/null; then tail -n 5 "$(ls ${log_file} | tail -1)" 2>/dev/null | tr '\n' ' ' | \ sed 's/["\t]/ /g' | cut -c1-200 || echo "" else echo "" fi } BUILD_LOG_SUMMARY=$(get_log_summary "build") TEST_LOG_SUMMARY=$(get_log_summary "test") DEPLOY_LOG_SUMMARY=$(get_log_summary "deploy") HC_LOG_SUMMARY=$(get_log_summary "healthcheck") # ── 현재 타임스탬프 ────────────────────────────────────────────────────────── TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # ── JSON 페이로드 구성 ─────────────────────────────────────────────────────── JSON_PAYLOAD=$(cat </dev/null || echo "000") if [[ "${http_code}" =~ ^2[0-9]{2}$ ]]; then log "✅ 콜백 성공: HTTP ${http_code}" if [[ -f "${LOG_DIR}/callback-response.json" ]]; then log " 응답: $(cat ${LOG_DIR}/callback-response.json)" fi return 0 else warn " 콜백 실패: HTTP ${http_code}" if [[ ${attempt} -lt ${retries} ]]; then sleep $((attempt * 5)) fi fi done err "ITSM 콜백 실패 (${retries}회 재시도 후)" err "URL: ${ITSM_CALLBACK_URL}" err "상태: ${STATUS}" # 콜백 실패는 파이프라인 실패로 처리하지 않음 return 0 } # ── 로컬 로그에도 기록 ──────────────────────────────────────────────────────── log_locally() { local history_file="${LOG_DIR}/pipeline-history.log" echo "${TIMESTAMP}|${JOB_NAME}|${BUILD_NUMBER}|${STATUS}|${MESSAGE}|${DEPLOY_ENV}" \ >> "${history_file}" } # ── 메인 ───────────────────────────────────────────────────────────────────── main() { log_locally send_callback log "ITSM 콜백 처리 완료: ${STATUS}" } main "$@"