#!/bin/bash # ───────────────────────────────────────────────────────────── # BurningTimes — NAS git 서버측 post-receive hook # Phase 3 (2026-04-15 PD님 승인) # # 목적: git push 도달 즉시 Discord 채널로 실시간 알림 발송 # → 부서 세션이 구동되지 않은 상태에서도 PD님·PM·부서가 push 이벤트를 즉시 인지 # # 배치 위치: /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 < /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