2026-04-15 12:23:27 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
2026-04-20 15:14:51 +00:00
|
|
|
# BurningTimes — NAS git 서버측 post-receive hook
|
2026-04-15 12:23:27 +00:00
|
|
|
# Phase 3 (2026-04-15 PD님 승인)
|
|
|
|
|
#
|
|
|
|
|
# 목적: git push 도달 즉시 Discord 채널로 실시간 알림 발송
|
|
|
|
|
# → 부서 세션이 구동되지 않은 상태에서도 PD님·PM·부서가 push 이벤트를 즉시 인지
|
|
|
|
|
#
|
|
|
|
|
# 배치 위치: <NAS bare repo 경로>/hooks/post-receive
|
2026-04-20 15:14:51 +00:00
|
|
|
# 예: /volume1/git-repos/BurningTimesAi.git/hooks/post-receive
|
2026-04-15 12:23:27 +00:00
|
|
|
# 배치 후: 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,
|
2026-04-20 15:14:51 +00:00
|
|
|
"footer": {"text": "BurningTimes git server · post-receive"}
|
2026-04-15 12:23:27 +00:00
|
|
|
}]
|
|
|
|
|
}
|
|
|
|
|
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
|
2026-04-16 06:52:36 +00:00
|
|
|
공유/소통/PM→개발팀/*|공유/소통/개발팀→PM/*)
|
2026-04-15 12:23:27 +00:00
|
|
|
TO_PM=1; TO_DEV=1 ;;
|
2026-04-16 06:52:36 +00:00
|
|
|
공유/소통/PM→기획팀/*|공유/소통/기획팀→PM/*)
|
2026-04-15 12:23:27 +00:00
|
|
|
TO_PM=1; TO_PLAN=1 ;;
|
2026-04-16 06:52:36 +00:00
|
|
|
공유/소통/기획팀→개발팀/*)
|
2026-04-15 12:23:27 +00:00
|
|
|
TO_DEV=1 ;;
|
2026-04-16 06:52:36 +00:00
|
|
|
공유/소통/개발팀→기획팀/*)
|
2026-04-15 12:23:27 +00:00
|
|
|
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
|
2026-04-16 06:52:36 +00:00
|
|
|
[ $TO_DEV -eq 1 ] && send_discord "$DEV_WEBHOOK_URL" "📬 개발팀 수신 채널 변경" "$DESC" 5763719
|
|
|
|
|
[ $TO_PLAN -eq 1 ]&& send_discord "$PLAN_WEBHOOK_URL" "📬 기획팀 수신 채널 변경" "$DESC" 15105570
|
2026-04-15 12:23:27 +00:00
|
|
|
[ $TO_ALL -eq 1 ] && send_discord "$ALL_WEBHOOK_URL" "📜 코어룰/조직공지 변경" "$DESC" 15548997
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
exit 0
|