-
Notifications
You must be signed in to change notification settings - Fork 0
200 lines (168 loc) · 7.7 KB
/
daily-commit-check.yml
File metadata and controls
200 lines (168 loc) · 7.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
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