매일 커밋 체크 #106
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 -> 한국어 이름) - 4명 졸업 후 5명 잔류 | |
| declare -A MEMBERS=( | |
| ["Ukj0ng"]="한종욱" | |
| ["zinnnn37"]="김민진" | |
| ["JHLEE325"]="이준희" | |
| ["LiiNi-coder"]="이인희" | |
| ["ksinji"]="강신지" | |
| ) | |
| # 멤버별 폴더명 매핑 (GitHub ID -> 폴더명) | |
| declare -A FOLDERS=( | |
| # 현재 멤버 중 특이사항 있는 경우 여기에 추가 | |
| ) | |
| # 졸업/탈퇴 멤버 (체크 제외) - 기존 졸업자 + 신규 졸업자 4명 추가 | |
| GRADUATED=("03do-new30" "ShinHeeEul" "oncsr" "0224LJH" "lkhyun" "Seol-JY" "suyeun84") | |
| # 커밋이 없는 멤버 저장 | |
| NO_COMMIT_MEMBERS=() | |
| # 각 멤버별로 체크 | |
| for github_id in "${!MEMBERS[@]}"; do | |
| korean_name="${MEMBERS[$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) | |
| 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 | |
| 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 += `총 5명 전원 제출 완료 ✅`; // 인원수 10명 -> 5명으로 수정 | |
| } 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: 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 | |
| PENALTY=$((NO_COMMIT_COUNT * 5000)) | |
| echo "💰 **총 벌금**: ${PENALTY}원" >> $GITHUB_STEP_SUMMARY | |
| fi |