Skip to content

Commit 98b6f4a

Browse files
authored
Merge pull request #8 from SEMOSAN/feat/#7-discord-notifier
[Feat] PR 생성 및 머지 시 디스코드 알림 전송 기능 추가
2 parents 40f4ded + ffed873 commit 98b6f4a

1 file changed

Lines changed: 210 additions & 0 deletions

File tree

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
name: 🌿 PR 디스코드 알림
2+
3+
on:
4+
pull_request:
5+
types: [opened, reopened, ready_for_review, closed]
6+
7+
jobs:
8+
# ──────────────────────────────────────────────
9+
# PR 열림 → 리뷰 요청 알림
10+
# ──────────────────────────────────────────────
11+
notify-review:
12+
if: >-
13+
github.event.action != 'closed'
14+
&& !github.event.pull_request.draft
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: 🎲 메시지 뽑기
18+
id: message
19+
run: |
20+
MESSAGES=(
21+
"살려주세요... 리뷰 안 하면 머지 못 해요... 🥺"
22+
"따끈따끈한 PR이 나왔어요! 식기 전에 리뷰해주세요~ 🍞"
23+
"리뷰 한 스푼만... 제발... 🥄"
24+
"새 PR이 당신을 기다리고 있어요. 읽씹하지 마세요 💌"
25+
"코드가 외로워하고 있어요. 누가 좀 봐주세요... 🐾"
26+
"PR 승인 버튼은 세상에서 제일 아름다운 버튼이에요 💚"
27+
"리뷰해주시면 오늘 하루 서버 안 터집니다 ☕✨"
28+
"이 PR은 사랑과 정성으로 만들어졌습니다. 감상 부탁드립니다 🎨"
29+
"긴급) 코드가 approve를 갈망하고 있습니다 🆘"
30+
"[속보] 머지 대기 중인 PR 발견! 리뷰어 급구! 📰"
31+
"스프링이 꽃을 피우려면 리뷰가 필요합니다 🌸"
32+
"JPA가 울고 있어요. 제발 봐주세요 😭"
33+
"500 Internal Server Error... 리뷰 안 해서 그래요 🔥"
34+
"이 PR 안 보면 null pointer exception 납니다 (진짜임) 👀"
35+
"빌드는 성공했어요. 이제 리뷰만 남았습니다 🛠️"
36+
"커밋 하나하나에 땀이 배어있어요... 제발요 💦"
37+
"오늘 야근 여부는 당신의 리뷰 속도에 달려있습니다 🌙"
38+
"머지 못 하면 잠 못 자요. 제발 리뷰해주세요 😴"
39+
"이 코드, 혼자 짜기 너무 외로웠어요 🥲"
40+
"리뷰 안 하면... 다음 스프린트에 기억할게요 👁️"
41+
"세모산이 당신의 approve를 기다리고 있어요 🏔️"
42+
"어차피 다 같이 쓸 코드잖아요. 같이 봐요 🤝"
43+
)
44+
INDEX=$(( RANDOM % ${#MESSAGES[@]} ))
45+
echo "cute_msg=${MESSAGES[$INDEX]}" >> "$GITHUB_OUTPUT"
46+
47+
- name: 📨 디스코드로 리뷰 요청 보내기
48+
env:
49+
DISCORD_WEBHOOK_URL: ${{ secrets.BE_PR_WEBHOOK }}
50+
PR_TITLE: ${{ github.event.pull_request.title }}
51+
PR_URL: ${{ github.event.pull_request.html_url }}
52+
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
53+
PR_BODY: ${{ github.event.pull_request.body }}
54+
CUTE_MSG: ${{ steps.message.outputs.cute_msg }}
55+
CHANGED_FILES: ${{ github.event.pull_request.changed_files }}
56+
ADDITIONS: ${{ github.event.pull_request.additions }}
57+
DELETIONS: ${{ github.event.pull_request.deletions }}
58+
run: |
59+
TOTAL_CHANGES=$(( ADDITIONS + DELETIONS ))
60+
if [ "$TOTAL_CHANGES" -lt 50 ]; then
61+
SIZE_LABEL="🍰 한입 크기"
62+
elif [ "$TOTAL_CHANGES" -lt 200 ]; then
63+
SIZE_LABEL="🍔 적당한 크기"
64+
elif [ "$TOTAL_CHANGES" -lt 500 ]; then
65+
SIZE_LABEL="🍕 꽤 큰 편"
66+
elif [ "$TOTAL_CHANGES" -lt 1000 ]; then
67+
SIZE_LABEL="🏋️ 헬스장 급 (힘내세요...)"
68+
else
69+
SIZE_LABEL="💀 리뷰어 사망각 (커피 챙기세요)"
70+
fi
71+
72+
DESCRIPTION=$(echo "$PR_BODY" | head -c 200)
73+
if [ ${#PR_BODY} -gt 200 ]; then
74+
DESCRIPTION="${DESCRIPTION}..."
75+
fi
76+
DESCRIPTION=$(echo "$DESCRIPTION" | jq -Rs '.')
77+
78+
curl -H "Content-Type: application/json" \
79+
-X POST \
80+
-d @- \
81+
"$DISCORD_WEBHOOK_URL" <<CURL_EOF
82+
{
83+
"username": "세모산 PR봇 🌿",
84+
"avatar_url": "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
85+
"content": "📢 **[BE] 리뷰 요청이 도착했어요!** ${CUTE_MSG}",
86+
"embeds": [
87+
{
88+
"title": "📝 ${PR_TITLE}",
89+
"url": "${PR_URL}",
90+
"color": 16750848,
91+
"description": ${DESCRIPTION},
92+
"fields": [
93+
{
94+
"name": "👤 작성자",
95+
"value": "${PR_AUTHOR}",
96+
"inline": true
97+
},
98+
{
99+
"name": "📦 PR 크기",
100+
"value": "${SIZE_LABEL}",
101+
"inline": true
102+
},
103+
{
104+
"name": "📊 변경 사항",
105+
"value": "\`${CHANGED_FILES}\`개 파일 | +${ADDITIONS} -${DELETIONS}",
106+
"inline": true
107+
}
108+
],
109+
"footer": {
110+
"text": "SEMOSAN Backend 🌿 리뷰해주시면 복이 와요 🍀"
111+
},
112+
"timestamp": "${{ github.event.pull_request.created_at }}"
113+
}
114+
]
115+
}
116+
CURL_EOF
117+
118+
echo "✅ 리뷰 요청 알림 전송 완료!"
119+
120+
# ──────────────────────────────────────────────
121+
# 🎉 PR 머지됨 → 축하 알림
122+
# ──────────────────────────────────────────────
123+
notify-merged:
124+
if: >-
125+
github.event.action == 'closed'
126+
&& github.event.pull_request.merged == true
127+
runs-on: ubuntu-latest
128+
steps:
129+
- name: 🎲 축하 메시지 뽑기
130+
id: message
131+
run: |
132+
MESSAGES=(
133+
"코드가 무사히 새 집을 찾았어요! 이사 축하~ 🏠"
134+
"머지 완료! 오늘의 영웅은 바로 당신! 🦸"
135+
"main 브랜치가 한 뼘 더 자랐어요 🌱"
136+
"성공적으로 합류! 세모산 백엔드 어벤져스 결성 완료 🛡️"
137+
"Merge! 이 순간을 위해 살았다... 감동 🥲"
138+
"브랜치여 안녕... 넌 main 속에서 영원히 살 거야 💐"
139+
"축) 머지 기념 커피 한 잔 어때요? ☕🎊"
140+
"드디어 해냈다! 리뷰어분들 감사합니다 🫡✨"
141+
"Spring이 활짝 피었습니다 🌸"
142+
"서버가 한층 더 강해졌어요 💪"
143+
"git log --oneline 한 줄이 늘었습니다 📜"
144+
"오늘도 무사 머지... 개발자의 하루가 빛납니다 🌟"
145+
"리뷰어 여러분, 오늘도 세모산을 지켜주셔서 감사합니다 🏔️"
146+
"배포까지 달려봐요! 화이팅 🚀"
147+
"이제 다음 이슈로 고고씽~ 💨"
148+
)
149+
INDEX=$(( RANDOM % ${#MESSAGES[@]} ))
150+
echo "cute_msg=${MESSAGES[$INDEX]}" >> "$GITHUB_OUTPUT"
151+
152+
- name: 🎊 디스코드로 머지 축하 보내기
153+
env:
154+
DISCORD_WEBHOOK_URL: ${{ secrets.BE_PR_WEBHOOK }}
155+
PR_TITLE: ${{ github.event.pull_request.title }}
156+
PR_URL: ${{ github.event.pull_request.html_url }}
157+
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
158+
MERGED_BY: ${{ github.event.pull_request.merged_by.login }}
159+
CUTE_MSG: ${{ steps.message.outputs.cute_msg }}
160+
CHANGED_FILES: ${{ github.event.pull_request.changed_files }}
161+
ADDITIONS: ${{ github.event.pull_request.additions }}
162+
DELETIONS: ${{ github.event.pull_request.deletions }}
163+
BASE_BRANCH: ${{ github.event.pull_request.base.ref }}
164+
HEAD_BRANCH: ${{ github.event.pull_request.head.ref }}
165+
run: |
166+
curl -H "Content-Type: application/json" \
167+
-X POST \
168+
-d @- \
169+
"$DISCORD_WEBHOOK_URL" <<CURL_EOF
170+
{
171+
"username": "세모산 PR봇 🌿",
172+
"avatar_url": "https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png",
173+
"content": "🎊 **[BE] PR이 머지되었어요!** ${CUTE_MSG}",
174+
"embeds": [
175+
{
176+
"title": "✅ ${PR_TITLE}",
177+
"url": "${PR_URL}",
178+
"color": 2067276,
179+
"fields": [
180+
{
181+
"name": "👤 작성자",
182+
"value": "${PR_AUTHOR}",
183+
"inline": true
184+
},
185+
{
186+
"name": "🔀 머지한 사람",
187+
"value": "${MERGED_BY}",
188+
"inline": true
189+
},
190+
{
191+
"name": "🌿 브랜치",
192+
"value": "\`${HEAD_BRANCH}\` → \`${BASE_BRANCH}\`",
193+
"inline": true
194+
},
195+
{
196+
"name": "📊 최종 변경 사항",
197+
"value": "\`${CHANGED_FILES}\`개 파일 | +${ADDITIONS} -${DELETIONS}",
198+
"inline": false
199+
}
200+
],
201+
"footer": {
202+
"text": "SEMOSAN Backend 🌿 수고하셨습니다! 🍀"
203+
},
204+
"timestamp": "${{ github.event.pull_request.merged_at }}"
205+
}
206+
]
207+
}
208+
CURL_EOF
209+
210+
echo "✅ 머지 축하 알림 전송 완료!"

0 commit comments

Comments
 (0)