Skip to content

매일 커밋 체크 #69

매일 커밋 체크

매일 커밋 체크 #69

name: 매일 커밋 체크
on:
schedule:
# 매일 00:01 KST (UTC 15:01, 전날)
- cron: '1 15 * * *'
workflow_dispatch: # 수동 실행 가능
jobs:
check-commits:
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # 전체 히스토리 가져오기
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Check yesterday's commits
id: check
run: |
# 현재 한국 시간 확인
CURRENT_KST=$(TZ='Asia/Seoul' date '+%Y-%m-%d %H:%M:%S %Z')
echo "현재 한국 시간: $CURRENT_KST"
# 한국 시간 기준으로 오늘과 어제 날짜 계산
TODAY_KST=$(TZ='Asia/Seoul' date '+%Y-%m-%d')
YESTERDAY_KST=$(TZ='Asia/Seoul' date -d "$TODAY_KST -1 day" '+%Y-%m-%d')
echo "오늘 (KST): $TODAY_KST"
echo "어제 (KST): $YESTERDAY_KST"
echo "체크 대상 날짜: $YESTERDAY_KST"
echo "yesterday=$YESTERDAY_KST" >> $GITHUB_OUTPUT
echo "today=$TODAY_KST" >> $GITHUB_OUTPUT
# 디버깅: UTC 시간도 출력
CURRENT_UTC=$(date -u '+%Y-%m-%d %H:%M:%S %Z')
echo "현재 UTC 시간: $CURRENT_UTC"
# 활성 멤버 목록 (GitHub ID -> 한국어 이름)
declare -A MEMBERS=(
["oncsr"]="권혁준"
["0224LJH"]="이종환"
["Ukj0ng"]="한종욱"
["suyeun84"]="김수연"
["lkhyun"]="이강현"
["zinnnn37"]="김민진"
["JHLEE325"]="이준희"
["Seol-JY"]="설진영"
["LiiNi-coder"]="이인희"
["ksinji"]="강신지"
)
# 멤버별 폴더명 매핑 (GitHub ID -> 폴더명)
# 기본값은 GitHub ID와 동일, 다른 경우만 명시
declare -A FOLDERS=(
["oncsr"]="khj20006"
# 나머지는 GitHub ID와 동일하므로 생략
)
# 탈퇴한 멤버 (체크 제외)
GRADUATED=("03do-new30" "ShinHeeEul")
# 커밋이 없는 멤버 저장
NO_COMMIT_MEMBERS=()
# 각 멤버별로 체크
for github_id in "${!MEMBERS[@]}"; do
korean_name="${MEMBERS[$github_id]}"
# 폴더명 결정: FOLDERS에 정의되어 있으면 사용, 없으면 github_id 사용
if [ -n "${FOLDERS[$github_id]}" ]; then
folder_name="${FOLDERS[$github_id]}"
else
folder_name="$github_id"
fi
# 해당 멤버의 폴더에서 어제 날짜에 변경사항이 있는 커밋 확인
# 커밋 작성자가 아닌, 폴더에 변경이 있었는지를 체크
COMMITS=$(git log --all \
--since="$YESTERDAY_KST 00:00:00 +0900" \
--until="$YESTERDAY_KST 23:59:59 +0900" \
--pretty=format:"%H|%an|%ad" \
--date=iso \
-- "$folder_name/" 2>/dev/null || echo "")
if [ -z "$COMMITS" ]; then
echo "❌ $korean_name ($github_id) [폴더: $folder_name]: 커밋 없음"
NO_COMMIT_MEMBERS+=("$korean_name")
else
COMMIT_COUNT=$(echo "$COMMITS" | wc -l)
# 첫 번째 커밋 정보 추출 (디버깅용)
FIRST_COMMIT=$(echo "$COMMITS" | head -1)
COMMIT_AUTHOR=$(echo "$FIRST_COMMIT" | cut -d'|' -f2)
COMMIT_DATE=$(echo "$FIRST_COMMIT" | cut -d'|' -f3)
echo "✅ $korean_name ($github_id) [폴더: $folder_name]: $COMMIT_COUNT 개 커밋 (작성자: $COMMIT_AUTHOR)"
fi
done
# 결과 요약
echo ""
echo "=== 커밋 체크 결과 ==="
echo "체크 날짜: $YESTERDAY_KST"
if [ ${#NO_COMMIT_MEMBERS[@]} -eq 0 ]; then
echo "🎉 모든 멤버가 커밋했습니다!"
echo "no_commit_count=0" >> $GITHUB_OUTPUT
echo "no_commit_list=" >> $GITHUB_OUTPUT
else
echo "❌ 커밋하지 않은 멤버 (${#NO_COMMIT_MEMBERS[@]}명):"
for name in "${NO_COMMIT_MEMBERS[@]}"; do
echo " - $name"
done
# GitHub Output으로 내보내기
echo "no_commit_count=${#NO_COMMIT_MEMBERS[@]}" >> $GITHUB_OUTPUT
# 배열을 쉼표로 구분된 문자열로 변환
NO_COMMIT_LIST=$(IFS=','; echo "${NO_COMMIT_MEMBERS[*]}")
echo "no_commit_list=$NO_COMMIT_LIST" >> $GITHUB_OUTPUT
fi
- name: Create daily check issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const yesterday = '${{ steps.check.outputs.yesterday }}';
const noCommitList = '${{ steps.check.outputs.no_commit_list }}';
const count = '${{ steps.check.outputs.no_commit_count }}';
let body = `## 📊 ${yesterday} 커밋 체크 결과\n\n`;
if (count === '0') {
body += `🎉 **모든 멤버가 커밋했습니다!**\n\n`;
body += `총 10명 전원 제출 완료 ✅`;
} else {
const members = noCommitList.split(',');
body += `**커밋하지 않은 멤버: ${count}명**\n\n`;
body += members.map(name => `- ${name} (벌금 5,000원)`).join('\n');
body += `\n\n---\n\n`;
body += `💰 **총 벌금**: ${parseInt(count) * 5000}원`;
}
body += `\n\n⏰ 체크 시간: ${new Date().toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' })}`;
// 이슈 생성
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: count === '0' ? `[${yesterday}] ✅ 전원 제출 완료` : `[${yesterday}] ❌ 커밋 미제출 알림`,
body: body,
labels: count === '0' ? ['daily-check', 'all-clear'] : ['daily-check', 'penalty']
});
- name: Post detailed results
if: steps.check.outputs.no_commit_count != '0'
run: |
echo "========================================="
echo "❌ 커밋 미제출 알림"
echo "========================================="
echo "날짜: ${{ steps.check.outputs.yesterday }}"
echo "미제출 인원: ${{ steps.check.outputs.no_commit_count }}명"
echo "대상자: ${{ steps.check.outputs.no_commit_list }}"
NO_COMMIT_COUNT="${{ steps.check.outputs.no_commit_count }}"
PENALTY=$((NO_COMMIT_COUNT * 5000))
echo "총 벌금: ${PENALTY}원"
echo "========================================="
- name: Print summary
run: |
echo "### 커밋 체크 완료 ✅" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**체크 날짜**: ${{ steps.check.outputs.yesterday }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
NO_COMMIT_COUNT="${{ steps.check.outputs.no_commit_count }}"
if [ "$NO_COMMIT_COUNT" == "0" ]; then
echo "🎉 **모든 멤버가 커밋했습니다!**" >> $GITHUB_STEP_SUMMARY
else
echo "❌ **커밋하지 않은 멤버**: ${NO_COMMIT_COUNT}명" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**대상자**: ${{ steps.check.outputs.no_commit_list }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 벌금 계산 (bash 산술 연산)
PENALTY=$((NO_COMMIT_COUNT * 5000))
echo "💰 **총 벌금**: ${PENALTY}원" >> $GITHUB_STEP_SUMMARY
fi