BurningTimesAi/scripts/nas_post_receive.sh

120 lines
4.2 KiB
Bash

#!/bin/bash
# ─────────────────────────────────────────────────────────────
# BurningTimes — NAS git 서버측 post-receive hook
# Phase 3 (2026-04-15 PD님 승인)
#
# 목적: git push 도달 즉시 Discord 채널로 실시간 알림 발송
# → 부서 세션이 구동되지 않은 상태에서도 PD님·PM·부서가 push 이벤트를 즉시 인지
#
# 배치 위치: <NAS bare repo 경로>/hooks/post-receive
# 예: /volume1/git-repos/BurningTimesAi.git/hooks/post-receive
# 배치 후: chmod +x post-receive
#
# 환경변수 파일: 같은 hooks/ 디렉토리에 post-receive-env 파일 생성 후 다음 변수 정의
# PM_WEBHOOK_URL — #pm-inbox Discord webhook URL
# DEV_WEBHOOK_URL — #dev-inbox
# PLAN_WEBHOOK_URL — #plan-inbox
# ALL_WEBHOOK_URL — #core-rules (전 조직 공지·코어룰 변경)
#
# 예:
# PM_WEBHOOK_URL="https://discord.com/api/webhooks/1234.../abcd..."
# DEV_WEBHOOK_URL="https://discord.com/api/webhooks/5678.../efgh..."
# PLAN_WEBHOOK_URL="https://discord.com/api/webhooks/9012.../ijkl..."
# ALL_WEBHOOK_URL="https://discord.com/api/webhooks/3456.../mnop..."
#
# chmod 600 post-receive-env (읽기 권한 제한, C6 준수)
# ─────────────────────────────────────────────────────────────
HOOK_DIR=$(dirname "$0")
ENV_FILE="$HOOK_DIR/post-receive-env"
[ -f "$ENV_FILE" ] && source "$ENV_FILE"
# 로그 파일 (디버깅용)
LOG_FILE="$HOOK_DIR/post-receive.log"
log() {
echo "[$(date -Iseconds)] $*" >> "$LOG_FILE" 2>/dev/null
}
send_discord() {
local URL="$1"
local TITLE="$2"
local DESC="$3"
local COLOR="${4:-3447003}" # 기본 파란색
[ -z "$URL" ] && return
# Discord embed payload
local PAYLOAD
PAYLOAD=$(cat <<EOF
{
"embeds": [{
"title": "$TITLE",
"description": "$DESC",
"color": $COLOR,
"footer": {"text": "BurningTimes git server · post-receive"}
}]
}
EOF
)
curl -s -X POST "$URL" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" > /dev/null 2>&1
log "sent to $TITLE"
}
json_escape() {
# 최소한의 JSON 이스케이프 (backslash, quote, newline)
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr '\n' ' '
}
while read oldrev newrev refname; do
# main 브랜치 push만 처리
branch=$(git rev-parse --symbolic --abbrev-ref "$refname" 2>/dev/null)
[ "$branch" != "main" ] && continue
# 최초 push (oldrev가 0...0) 스킵
[[ "$oldrev" =~ ^0+$ ]] && continue
# 변경 파일 목록
CHANGED=$(git diff --name-only "$oldrev" "$newrev" 2>/dev/null)
[ -z "$CHANGED" ] && continue
# 최근 커밋 요약
COMMIT_MSG=$(git log -1 --format="%s" "$newrev" 2>/dev/null)
AUTHOR=$(git log -1 --format="%an" "$newrev" 2>/dev/null)
SHORT_SHA=$(git rev-parse --short "$newrev" 2>/dev/null)
COMMIT_COUNT=$(git rev-list --count "$oldrev..$newrev" 2>/dev/null)
# 채널별 알림 분기 플래그
TO_PM=0; TO_DEV=0; TO_PLAN=0; TO_ALL=0
while IFS= read -r FILE; do
case "$FILE" in
공유/소통/PM→개발팀/*|공유/소통/개발팀→PM/*)
TO_PM=1; TO_DEV=1 ;;
공유/소통/PM→기획팀/*|공유/소통/기획팀→PM/*)
TO_PM=1; TO_PLAN=1 ;;
공유/소통/기획팀→개발팀/*)
TO_DEV=1 ;;
공유/소통/개발팀→기획팀/*)
TO_PLAN=1 ;;
공유/조직공지/*|공유/공통_업무_규칙.md)
TO_ALL=1 ;;
esac
done <<< "$CHANGED"
# 알림 발송
MSG_ESC=$(json_escape "$COMMIT_MSG")
DESC="**${MSG_ESC}**\\n\\n커밋: \`${SHORT_SHA}\` (${COMMIT_COUNT}건) by ${AUTHOR}"
[ $TO_PM -eq 1 ] && send_discord "$PM_WEBHOOK_URL" "📬 PM 수신 채널 변경" "$DESC" 3447003
[ $TO_DEV -eq 1 ] && send_discord "$DEV_WEBHOOK_URL" "📬 개발팀 수신 채널 변경" "$DESC" 5763719
[ $TO_PLAN -eq 1 ]&& send_discord "$PLAN_WEBHOOK_URL" "📬 기획팀 수신 채널 변경" "$DESC" 15105570
[ $TO_ALL -eq 1 ] && send_discord "$ALL_WEBHOOK_URL" "📜 코어룰/조직공지 변경" "$DESC" 15548997
done
exit 0