매일 커밋 체크 #61
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 -> 한국어 이름) | |
| 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 |