Github - 디스코드 깃허브 알림 action(Discord Github Notification) 설명서
- -
프로젝트 개요
프로젝트 이름: 🛎️ Discord Github Notification
Github repository url
Github marketplace url
프로젝트 설명
이 프로젝트는 GitHub Action을 통해 GitHub에서 발생하는 다양한 이벤트(예: Pull Request 생성, 이슈 생성 등)를 Discord 채널 알림으로 전송하는 프로세스를 단순화해주는 서비스입니다.
이 Action을 사용하면 중요한 개발 이벤트를 놓치지 않고 바로 Discord에서 확인할 수 있습니다!
이 Action은 커스텀 알림 메시지를 지원하며, 한국어 🇰🇷와 영어 🇬🇧 중 원하는 언어로 알림을 받을 수 있습니다.
👤 개발자: 김채민(Aleph Kim)
🔧 주요 기능
📝 PR 알림
Pull Request 생성, 동기화, 병합, 재오픈, 닫힘 등의 이벤트에 대해 Discord로 알림을 전송합니다.
🌿 브랜치 이벤트 알림
브랜치 생성 및 삭제 이벤트 발생 시, Discord에서 알림을 확인할 수 있습니다.
❗ 이슈 알림
새로운 이슈가 열리거나 닫힐 때, Discord로 알림이 전송됩니다.
🚀 푸시 알림
새로운 커밋이 발생할 때마다, 해당 커밋 정보가 Discord로 알림이 전송됩니다.
🌍 한국어/영어 지원
한국어와 영어 두 가지 언어로 알림 메시지를 설정할 수 있습니다.
🎨 사용자 정의 메시지 지원
사용자가 메시지 템플릿을 자유롭게 설정할 수 있습니다.
📦 주요 구성 요소:
action.yml: GitHub Actions의 핵심 설정 파일로, Action의 입력 변수, 실행 스크립트, 그리고 알림 메시지 전송에 필요한 단계들을 정의합니다.
name: 'Discord Github Notification' # action 이름
description: 'GitHub Action Marketplace Action to Allow Discord to Receive GitHub Notifications' # action 설명
author: 'Aleph Kim' # 작성자
inputs:
discord-webhook-url: # 디스코드 웹훅 URL 입력값
description: 'The Discord webhook URL.' # 디스코드 웹훅 URL
required: true # 필수 입력값 여부
language: # 알림 메시지의 언어 입력값
description: 'The language for notifications (korean or english).' # 알림 메시지의 언어
required: false # 필수 입력값 여부
default: 'korean' # 기본값
custom: # 사용자 정의 메시지 사용 여부
required: false # 필수 입력값 여부
default: 'false' # 기본값
runs:
using: 'composite'
steps:
- name: Checkout messages.json from user repository # 사용자 레포지토리에서 messages.json 파일을 체크아웃하는 단계
if: inputs.custom == 'true' # 사용자가 custom 메시지 사용 설정을 한 경우에만 실행
uses: actions/checkout@v4 # checkout 액션 사용
with:
path: custom-messages-repo
repository: ${{ github.repository }} # 사용자의 레포지토리
ref: ${{ github.ref }} # 사용자의 브랜치 또는 커밋
- name: Checkout default messages.json from deployer's repository # 기본 레포지토리에서 기본 메시지 파일을 체크아웃하는 단계
if: inputs.custom == 'false' # 사용자가 custom 메시지 사용 설정을 하지않은 경우에만 실행
uses: actions/checkout@v4 # checkout 액션 사용
with:
repository: 'Aleph-Kim/discord-github-notification' # 기본 메시지를 포함한 레포지토리
path: default-messages-repo
- name: Read Notification Messages # 알림 메시지를 읽어오는 단계
id: read-messages
shell: bash
run: |
if [[ "${{ inputs.custom }}" == "true" ]]; then # custom 메시지를 사용할 경우
MESSAGES=$(cat custom-messages-repo/.github/workflows/messages.json | jq -c . | sed 's/\\n/\\\\n/g') # 사용자 레포지토리에서 messages.json 파일을 읽어서 MESSAGES 환경 변수에 저장
else # 기본 메시지를 사용할 경우
MESSAGES=$(cat default-messages-repo/messages.json | jq -c . | sed 's/\\n/\\\\n/g') # 기본 레포지토리에서 messages.json 파일을 읽어서 MESSAGES 환경 변수에 저장
fi
echo "MESSAGES=$MESSAGES" >> $GITHUB_ENV # MESSAGES 변수를 GitHub 환경 변수로 설정
- name: Send Discord Notification for PR Events # PR 이벤트에 대한 디스코드 알림을 보내는 단계
if: github.event_name == 'pull_request' # 이벤트가 pull_request일 경우에만 실행
shell: bash
run: |
PR_ACTION=$(jq -r .action < $GITHUB_EVENT_PATH) # PR 액션 종류 추출
PR_TITLE=$(jq -r .pull_request.title < $GITHUB_EVENT_PATH) # PR 제목 추출
PR_USER=$(jq -r .pull_request.user.login < $GITHUB_EVENT_PATH) # PR 작성자 추출
PR_URL=$(jq -r .pull_request.html_url < $GITHUB_EVENT_PATH) # PR URL 추출
LANGUAGE=${{ inputs.language }} # 입력값으로부터 언어 설정
MESSAGE_KEY="PR_${PR_ACTION^^}" # 메시지 키 생성
MESSAGE=$(echo $MESSAGES | jq -r ".${LANGUAGE}.${MESSAGE_KEY}") # 메시지 템플릿 가져오기
MESSAGE=$(echo $MESSAGE | sed "s|{title}|$PR_TITLE|" | sed "s|{user}|$PR_USER|" | sed "s|{url}|$PR_URL|") # 메시지 템플릿에 값 대입
curl -X POST ${{ inputs.discord-webhook-url }} \ # 디스코드 웹훅 URL로 POST 요청 보내기
-H "Content-Type: application/json" \
-d "{\"content\": \"${MESSAGE}\"}"
- name: Send Discord Notification for Merged PRs # 병합된 PR에 대한 디스코드 알림을 보내는 단계
if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true # 이벤트가 pull_request, 액션이 closed, PR이 병합된 경우에만 실행
shell: bash
run: |
PR_TITLE=$(jq -r .pull_request.title < $GITHUB_EVENT_PATH) # PR 제목 추출
PR_USER=$(jq -r .pull_request.user.login < $GITHUB_EVENT_PATH) # PR 작성자 추출
PR_URL=$(jq -r .pull_request.html_url < $GITHUB_EVENT_PATH) # PR URL 추출
LANGUAGE=${{ inputs.language }} # 입력값으로부터 언어 설정
MESSAGE_KEY="PR_MERGED" # 메시지 키 생성
MESSAGE=$(echo $MESSAGES | jq -r ".${LANGUAGE}.${MESSAGE_KEY}") # 메시지 템플릿 가져오기
MESSAGE=$(echo $MESSAGE | sed "s|{title}|$PR_TITLE|" | sed "s|{user}|$PR_USER|" | sed "s|{url}|$PR_URL|") # 메시지 템플릿에 값 대입
curl -X POST ${{ inputs.discord-webhook-url }} \ # 디스코드 웹훅 URL로 POST 요청 보내기
-H "Content-Type: application/json" \
-d "{\"content\": \"${MESSAGE}\"}"
- name: Send Discord Notification for Branch Events # 브랜치 이벤트에 대한 디스코드 알림을 보내는 단계
if: github.event.ref_type == 'branch' # 이벤트가 브랜치일 경우에만 실행
shell: bash
run: |
EVENT_NAME=${{ github.event_name }} # 이벤트 이름 추출
BRANCH_NAME=$(jq -r .ref < $GITHUB_EVENT_PATH) # 브랜치 이름 추출
BRANCH_USER=$(jq -r .sender.login < $GITHUB_EVENT_PATH) # 브랜치 생성/삭제 사용자 추출
REPO_URL=$(jq -r .repository.html_url < $GITHUB_EVENT_PATH) # 레포지토리 URL 추출
LANGUAGE=${{ inputs.language }} # 입력값으로부터 언어 설정
MESSAGE_KEY="BRANCH_${EVENT_NAME^^}" # 메시지 키 생성
MESSAGE=$(echo $MESSAGES | jq -r ".${LANGUAGE}.${MESSAGE_KEY}") # 메시지 템플릿 가져오기
if [[ "$EVENT_NAME" == 'create' ]]; then # 브랜치 생성 이벤트일 경우
BRANCH_URL="${REPO_URL}/tree/${BRANCH_NAME}" # 브랜치 URL 생성
elif [[ "$EVENT_NAME" == 'delete' ]]; then # 브랜치 삭제 이벤트일 경우
BRANCH_URL="${REPO_URL}/branches" # 브랜치 목록 URL 설정
fi
MESSAGE=$(echo $MESSAGE | sed "s|{title}|$BRANCH_NAME|" | sed "s|{user}|$BRANCH_USER|" | sed "s|{url}|$BRANCH_URL|") # 메시지 템플릿에 값 대입
curl -X POST ${{ inputs.discord-webhook-url }} \ # 디스코드 웹훅 URL로 POST 요청 보내기
-H "Content-Type: application/json" \
-d "{\"content\": \"${MESSAGE}\"}"
- name: Send Discord Notification for Issue Events # 이슈 이벤트에 대한 디스코드 알림을 보내는 단계
if: github.event_name == 'issues' # 이벤트가 이슈일 경우에만 실행
shell: bash
run: |
ISSUE_ACTION=$(jq -r .action < $GITHUB_EVENT_PATH) # 이슈 액션 종류 추출
ISSUE_TITLE=$(jq -r .issue.title < $GITHUB_EVENT_PATH) # 이슈 제목 추출
ISSUE_USER=$(jq -r .issue.user.login < $GITHUB_EVENT_PATH) # 이슈 작성자 추출
ISSUE_URL=$(jq -r .issue.html_url < $GITHUB_EVENT_PATH) # 이슈 URL 추출
LANGUAGE=${{ inputs.language }} # 입력값으로부터 언어 설정
MESSAGE_KEY="ISSUE_${ISSUE_ACTION^^}" # 메시지 키 생성
MESSAGE=$(echo $MESSAGES | jq -r ".${LANGUAGE}.${MESSAGE_KEY}") # 메시지 템플릿 가져오기
MESSAGE=$(echo $MESSAGE | sed "s|{title}|$ISSUE_TITLE|" | sed "s|{user}|$ISSUE_USER|" | sed "s|{url}|$ISSUE_URL|") # 메시지 템플릿에 값 대입
curl -X POST ${{ inputs.discord-webhook-url }} \ # 디스코드 웹훅 URL로 POST 요청 보내기
-H "Content-Type: application/json" \
-d "{\"content\": \"${MESSAGE}\"}"
- name: Send Discord Notification for Push Events # 푸시 이벤트에 대한 디스코드 알림을 보내는 단계
if: github.event_name == 'push' # 이벤트가 푸시일 경우에만 실행
shell: bash
run: |
COMMIT_MESSAGE=$(jq -r .head_commit.message < $GITHUB_EVENT_PATH) # 커밋 메시지 추출
COMMIT_TITLE=$(echo "$COMMIT_MESSAGE" | head -n 1) # 커밋 제목 추출
COMMIT_USER=$(jq -r .head_commit.author.username < $GITHUB_EVENT_PATH) # 커밋 작성자 추출
COMMIT_URL=$(jq -r .head_commit.url < $GITHUB_EVENT_PATH) # 커밋 URL 추출
LANGUAGE=${{ inputs.language }} # 입력값으로부터 언어 설정
MESSAGE_KEY="PUSH" # 메시지 키 생성
MESSAGE=$(echo $MESSAGES | jq -r ".${LANGUAGE}.${MESSAGE_KEY}") # 메시지 템플릿 가져오기
MESSAGE=$(echo $MESSAGE | sed "s|{title}|$COMMIT_TITLE|" | sed "s|{user}|$COMMIT_USER|" | sed "s|{url}|$COMMIT_URL|") # 메시지 템플릿에 값 대입
curl -X POST ${{ inputs.discord-webhook-url }} \ # 디스코드 웹훅 URL로 POST 요청 보내기
-H "Content-Type: application/json" \
-d "{\"content\": \"${MESSAGE}\"}"
branding:
color: 'blue' # 마켓플레이스에서 노출되는 아이콘 색상
icon: 'bell' # 마켓플레이스에서 노출되는 아이콘
messages.json: 각 이벤트에 대한 알림 메시지의 언어별 템플릿을 포함하는 파일로, 프로젝트의 메시지 커스터마이징을 지원합니다.
{
"korean": {
"PR_OPENED": "**PR이 생성되었습니다!**\nPR 명: {title}\n작성자: {user}\n{url}",
"PR_SYNCHRONIZE": "**PR이 업데이트 되었습니다!**\nPR 명: {title}\n작성자: {user}\n{url}",
"PR_REOPENED": "**PR이 다시 열렸습니다!**\nPR 명: {title}\n작성자: {user}\n{url}",
"PR_CLOSED": "**PR이 닫혔습니다!**\nPR 명: {title}\n작성자: {user}\n{url}",
"PR_MERGED": "**PR이 병합되었습니다!**\nPR 명: {title}\n작성자: {user}\n{url}",
"BRANCH_CREATE": "**브랜치가 생성되었습니다!**\n브런치 명: {title}\n작성자: {user}\n{url}",
"BRANCH_DELETE": "**브랜치 삭제되었습니다!**\n브런치 명: {title}\n작성자: {user}\n{url}",
"ISSUE_OPENED": "**새로운 이슈가 열렸습니다!**\n이슈 명: {title}\n작성자: {user}\n{url}",
"ISSUE_CLOSED": "**이슈가 닫혔습니다!**\n이슈 명: {title}\n작성자: {user}\n{url}",
"PUSH": "**새로운 커밋이 발생했습니다!**\n커밋 명: {title}\n작성자: {user}\n{url}"
},
"english": {
"PR_OPENED": "**PR opened!**\ntitle: {title}\nby {user}\n{url}",
"PR_SYNCHRONIZE": "**PR synchronized!**\ntitle: {title}\nby {user}\n{url}",
"PR_REOPENED": "**PR reopened!**\ntitle: {title}\nby {user}\n{url}",
"PR_CLOSED": "**PR closed!**\ntitle: {title}\nby {user}\n{url}",
"PR_MERGED": "**PR merged!!**\ntitle: {title}\nby: {user}\n{url}",
"BRANCH_CREATE": "**Branch created!**\ntitle: {title}\nby {user}\n{url}",
"BRANCH_DELETE": "**Branch deleted!**\ntitle: {title}\nby {user}\n{url}",
"ISSUE_OPENED": "**Issue opened!**\ntitle: {title}\nby {user}\n{url}",
"ISSUE_CLOSED": "**Issue closed!**\ntitle: {title}\nby {user}\n{url}",
"PUSH": "**Commit pushed!**\ntitle: {title}\by: {user}\n{url}"
}
}
💡 참고 사항:
필수 입력값: Discord 웹훅 URL (discord-webhook-url)
선택 입력값:
- 알림 메시지의 언어 설정(language, 기본값은 korean)
- 사용자 정의 메시지 사용 여부(custom, 기본값은 false)
사용법
🧺 준비물
discord-webhook-url
: Discord 웹훅 URL
🚀 사용 방법 예시
- GitHub 리포지토리의
.github/workflows
디렉토리에 새로운 YAML 파일을 만듭니다(예:discord-notification.yml
).
아래 예제를 참고하여 파일 내용을 작성하세요.
name: Discord Notifications
on:
pull_request: # pr - opened, synchronize, reopened, closed 이벤트 발생 시 discord 알림
types: [opened, synchronize, reopened, closed]
create: # branch - 모든 브런치 생성 시 discord 알림
branches:
- '*'
delete: # branch - 모든 브런치 삭제 시 discord 알림
branches:
- '*'
issues: # issues - opened, closed 이벤트 발생 시 discord 알림
types: [opened, closed]
push: # push - master 브랜치에 push 이벤트 발생 시 discord 알림
branches:
- master
jobs:
discordNotification:
runs-on: ubuntu-latest
steps:
- name: Discord Github Notification
uses: Aleph-Kim/discord-github-notification@v1.2.0
with:
discord-webhook-url: ${{ secrets.DISCORD_WEBHOOK_URL }} # secret key에 저장한 discord webhook url
language: "english" # 필수 X
custom: true # 필수 X
github action에서 사용 가능한 on 이벤트 트리거
에 대해서는 GitHub Actions 공식 문서를 참고해주세요.
💬 입력 파라미터
discord-webhook-url
(필수): Discord 웹훅 URL을 입력합니다.language
(선택): 알림 메시지 언어를 설정합니다. 기본값은 korean입니다. english로 변경 가능합니다.custom
(선택): 커스텀 메시지 템플릿을 사용합니다. 사용자의 레포지토리에서.github/workflows/messages.json 파일
을 읽어옵니다.
🛠 secrets 설정
GitHub 리포지토리의 Settings
> Secrets and variables
> Actions
에서 New repository secret
을 클릭하고 DISCORD_WEBHOOK_URL
이름으로 웹훅 URL을 추가합니다.
📚 지원 이벤트 및 메시지
PR (Pull Request) 이벤트
opened
: PR이 생성되었을 때synchronize
: PR이 동기화되었을 때reopened
: PR이 다시 열렸을 때closed
: PR이 닫혔을 때merged
: PR이 병합되었을 때
브랜치 이벤트
create
: 브랜치가 생성되었을 때delete
: 브랜치가 삭제되었을 때
이슈 이벤트
opened
: 이슈가 생성되었을 때closed
: 이슈가 닫혔을 때
푸시 이벤트
push
: 커밋이 푸시되었을 때
📄 메시지 템플릿
기본적으로 메시지 템플릿은 messages.json 파일에 정의된 템플릿을 사용합니다.
커스텀 메시지 템플릿
활성화 방법
custom 파라미터
를 true
로 설정하면 사용자의 레포지토리에서 .github/workflows/messages.json 파일
을 읽어옵니다.
구조
- 언어 키
korean
english
- 이벤트별 메시지 키
PR_OPENED
- PR이 새로 생성되었을 때 발생하는 이벤트PR_SYNCHRONIZE
- PR이 업데이트(새로운 커밋 추가 등) 되었을 때 발생하는 이벤트PR_REOPENED
- 닫힌 PR이 다시 열렸을 때 발생하는 이벤트PR_CLOSED
- PR이 닫혔을 때 발생하는 이벤트PR_MERGED
- PR이 병합되었을 때 발생하는 이벤트BRANCH_CREATE
- 새로운 브랜치가 생성되었을 때 발생하는 이벤트BRANCH_DELETE
- 브랜치가 삭제되었을 때 발생하는 이벤트ISSUE_OPENED
- 새로운 이슈가 생성되었을 때 발생하는 이벤트ISSUE_CLOSED
- 이슈가 닫혔을 때 발생하는 이벤트PUSH
- 새로운 커밋이 푸시되었을 때 발생하는 이벤트
메시지 포멧
메시지에는 아래 변수가 필수로 포함되어야 합니다.
{title}
- PR, 이슈, 브랜치 등 이벤트의 제목{user}
- 해당 이벤트를 발생시킨 사용자의 이름{url}
- 발생 이벤트와 관련된 링크
커스텀 메시지 템플릿 예시
Ex. PR이 생성되거나 push 이벤트가 발생했을 때만 한국어로 알림을 보낼 경우의 커스텀 메시지 템플릿
{
"korean": {
"PR_OPENED": "PR이!!!!!!!!!!!!!!!!!!!! 또!!!!!!!!!!!!!! 올라왔네!!!!!!!!!!!!!!!!!!!!!!!!!!!: {title}\n PR한 놈: {user}\n PR url: {url}",
"PUSH": "{title}\n아이고.. main 브랜치로.. 바로 푸시를 하면 곤란한데...\n 커밋 올린 놈: {user}\n{url}"
},
}
소중한 공감 감사합니다