1. 배경
github PR 시에 re-request reivew 요청을 했을 때, 이메일로는 알림이 오는데 slack 등으로 알림(webhook)이 안와서 불편했다. 임시방편으로 각 기안자가 리뷰어들을 슬랙에서 태깅해서 호출하고 있었는데, 자동화되지 않은 부분이라 불편함이 있을 것 같아서 직접 시도해보았다.
조직의 workspace가 설정되어있다는 전제 하에 아래 내용들을 기록해둔다.
기본적으로 slack에 github app을 설치하고, /github ... 명령어를 통해 알림을 추가할 수 있으나, PR 상태별로 세분화하거나, 브랜치별로 나눠서 적용하는 방법 등이 없기 때문에 아래 방법으로 나누어 커스터마이징 했다.
2. Slack 설정
다음 slack api 페이지에 들어가서 Your apps를 클릭한다.
그리고 Create a New App을 클릭하고, From Scratch 방식을 선택한다.
APP-NAME은 아무렇게나 지어도 된다. 수정이 가능하다. 그리고 workspace를 선택한다. 사내 전체 workspace라 살짝 걱정 되었는데, oauth 설정으로 scope를 설정하면 크게 문제될 것은 없다.
그리고 Incoming Webhook 항목에 들어가서 toggle을 ON 처리한다. 아래쪽의 Add New Webhook to workspace 버튼을 눌러서 내가 webhook을 보낼 채널을 설정하면, 아래 그림처럼 curl 요청 명령어가 출력된다. 이를 복사해서 터미널에서 실행해보면 해당 채널로 Hello, World! 가 출력되는 것을 볼 수 있다.
그리고 OAuth & Permissions에 가서 권한을 확인한다. Scopes - Bot Token scopes에 들어가보면 봇이 가질 수 있는 권한을 추가할 수 있다. 위 단계들을 수행했다면 incoming-webhook이 추가된다. 나의 경우 테스트로 channles:read, chat:write도 추가해보았는데, webhook만 수행할 것이라면 굳이 이 권한들은 없어도 되는 것 같다.
3. github workflow 설정
아래처럼 프로젝트의 .github 폴더 내에 workflow 파일을 생성한다. 내용은 적당히 custom 하면 된다.
name: Notify Slack on Re-Requested Review
# 'review_requested' 이벤트 감지
on:
pull_request:
types: [review_requested]
branches:
- '**'
jobs:
notify-slack:
runs-on: ubuntu-latest
steps:
- name: Send Slack Notification
run: |
PR_NUMBER=${{ github.event.pull_request.number }}
PR_TITLE="${{ github.event.pull_request.title }}"
PR_URL="${{ github.event.pull_request.html_url }}"
REQUESTED_REVIEWER="${{ github.event.requested_reviewer.login }}"
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
# Slack Webhook 호출
curl -X POST \
-H 'Content-type: application/json' \
--data '{
"text": "📢 *리뷰 요청 알림*\n*PR 제목:* '"${PR_TITLE}"' (#'"${PR_NUMBER}"')\n*작성자:* '"${PR_AUTHOR}"'\n*리뷰어:* '"${REQUESTED_REVIEWER}"'\n*링크:* '"${PR_URL}"'"
}' \
${{ secrets.SLACK_WEBHOOK_URL }}
그리고 해당 workflow에 secrets.SLACK_WEBHOOK_URL을 참조하는 부분이 있으므로, github의 actions secret으로 추가해준다.
아래처럼 Settings > Secrets and variables > Actions > New repository secret으로 추가하면 된다. 추가할 값은 위 Slack의 curl에서 주었던 URL을 그대로 넣어주면 된다.
추가한 파일을 커밋하고, github에 추가한다.
4. 확인하기
PR이 생성 되었을 때, 그리고 1. 배경에서 처럼 re-request review 버튼을 클릭 했을 때 원하는 양식대로 slack 채널에 알림이 오는 것을 확인하면 된다.
5. 추가 작업
작성자와 리뷰어가 슬랙에서 멘션이 되도록 하기 위해서는 아래처럼 github-id <> slack 사용자 ID간 매핑하는 코드가 추가돼야한다.
아래 코드에서 GITHUB_TO_SLACK 자료구조에 사용자들을 추가해주면 된다. 약간 번거롭다. slack 사용자 ID는 slack에서 사용자 프로필 클릭 -> ... 더보기 -> 사용자 ID값 복사를 통해 얻어낼 수 있다. 'U12950121209' 등과 같은 형태로 되어있다.
또한 아래 코드는 PR이 Draft일 때는 job 자체를 스킵하고, Draft -> Ready for Review 상태가 되었을 때는 다시 알림을 보내는 등의 로직이 추가되어있다.
steps:
- name: Send Slack Notification with Mentions
run: |
# PR 정보 가져오기
PR_NUMBER=${{ github.event.pull_request.number }}
PR_TITLE="${{ github.event.pull_request.title }}"
PR_URL="${{ github.event.pull_request.html_url }}"
PR_ACTION="${{ github.event.action }}" # PR 상태(opened, review_requested)
PR_IS_DRAFT=${{ github.event.pull_request.draft }}
# Draft PR일 경우 알림 스킵
if [ "$PR_ACTION" == "opened" ] && [ "$PR_IS_DRAFT" == "true" ]; then
echo "Draft PR입니다. Slack 알림을 생략합니다."
exit 0 # 워크플로우 종료
fi
# PR 작성자와 리뷰어의 GitHub 로그인 정보
PR_AUTHOR="${{ github.event.pull_request.user.login }}"
REQUESTED_REVIEWER="${{ github.event.requested_reviewer.login }}"
# GitHub 사용자명과 Slack ID 매핑
declare -A GITHUB_TO_SLACK
GITHUB_TO_SLACK["github 사용자 ID 1"]="SLACK 사용자 id"
# 작성자와 리뷰어의 Slack ID 가져오기
# 작성자(PR_AUTHOR)가 비어있을 경우 처리
if [ -z "$PR_AUTHOR" ]; then
SLACK_AUTHOR_ID="작성자 정보 없음" # 작성자 정보가 없을 때 표시할 메시지
else
SLACK_AUTHOR_ID=${GITHUB_TO_SLACK[$PR_AUTHOR]}
fi
# 리뷰어(REQUESTED_REVIEWER)가 비어있을 경우 처리
if [ -z "$REQUESTED_REVIEWER" ]; then
SLACK_REVIEWER_ID="리뷰어 정보 없음" # 리뷰어 정보가 없을 때 표시할 메시지
else
SLACK_REVIEWER_ID=${GITHUB_TO_SLACK[$REQUESTED_REVIEWER]}
fi
# PR 상태에 따른 메시지 구분
if [ "$PR_ACTION" == "opened" ]; then
PR_STATUS="💌 *새 PR이 생성되었습니다!*"
# 모든 사용자 멘션 생성
ALL_MENTIONS=""
for USER_ID in "${GITHUB_TO_SLACK[@]}"; do
ALL_MENTIONS+="<@$USER_ID> "
done
elif [ "$PR_ACTION" == "ready_for_review" ]; then
PR_STATUS="🏃 *리뷰를 받을 준비가 되었습니다!*"
# 모든 사용자 멘션 생성
ALL_MENTIONS=""
for USER_ID in "${GITHUB_TO_SLACK[@]}"; do
ALL_MENTIONS+="<@$USER_ID> "
done
elif [ "$PR_ACTION" == "review_requested" ]; then
PR_STATUS="🏸 *리뷰 재요청이 발생했습니다!*"
ALL_MENTIONS="<@$SLACK_REVIEWER_ID>"
elif [ "$PR_ACTION" == "closed" ]; then
if [[ "${{ github.event.pull_request.merged }}" == "true" ]]; then
PR_STATUS="✅ *PR Merged*"
ALL_MENTIONS=""
else
PR_STATUS="❌ *PR Closed*"
ALL_MENTIONS=""
fi
elif [ "$PR_ACTION" == "reopened" ]; then
PR_STATUS="♻️ *PR이 다시 열렸습니다!*"
# PR이 다시 열릴 때도 모든 사용자에게 알림
ALL_MENTIONS=""
for USER_ID in "${GITHUB_TO_SLACK[@]}"; do
ALL_MENTIONS+="<@$USER_ID> "
done
else
PR_STATUS="☝️ *PR 업데이트 알림*"
ALL_MENTIONS=""
fi
# Slack Webhook 호출
curl -X POST \
-H 'Content-type: application/json' \
--data '{
"text": "'"${PR_STATUS}"'\n*PR 제목:* '"${PR_TITLE}"' (#'"${PR_NUMBER}"')\n*작성자:* <@'"${SLACK_AUTHOR_ID}"'>\n*리뷰어:* '"${ALL_MENTIONS}"'\n*링크:* '"${PR_URL}"'"
}' \
${{ secrets.SLACK_WEBHOOK_URL}}
대략 아래처럼 알림이 온다.
'Programming-[Base] > git' 카테고리의 다른 글
[TIL] Jacoco report 결과를 github PR에 남기기 (2) | 2024.12.28 |
---|---|
github ssh 방식, GPG key와 ssh key unverified 문제, .git config에 대한 이해 (0) | 2023.11.25 |
github ssh 방식, 여러 계정으로 login 및 commit (0) | 2023.11.13 |
[TIL] git reflog: git reset도 잘못하고 merge도 잘못해서 local, remote 모두 엉망일때.. (0) | 2023.07.28 |
GPG key to github - GNUPG, pinentry 에러 mac M1 (0) | 2023.07.28 |