새소식

기타

Github - 디스코드 깃허브 알림 action(Discord Github Notification) 설명서

  • -

github marketplace에 올라가있는 프로젝트입니다!

프로젝트 개요

프로젝트 이름: 🛎️ 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)
선택 입력값:

  1. 알림 메시지의 언어 설정(language, 기본값은 korean)
  2. 사용자 정의 메시지 사용 여부(custom, 기본값은 false)

사용법

🧺 준비물

  • discord-webhook-url: Discord 웹훅 URL

🚀 사용 방법 예시

  1. 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 공식 문서를 참고해주세요.


💬 입력 파라미터

  1. discord-webhook-url (필수): Discord 웹훅 URL을 입력합니다.
  2. language (선택): 알림 메시지 언어를 설정합니다. 기본값은 korean입니다. english로 변경 가능합니다.
  3. custom (선택): 커스텀 메시지 템플릿을 사용합니다. 사용자의 레포지토리에서 .github/workflows/messages.json 파일을 읽어옵니다.

🛠 secrets 설정

GitHub 리포지토리의 Settings > Secrets and variables > Actions에서 New repository secret을 클릭하고 DISCORD_WEBHOOK_URL 이름으로 웹훅 URL을 추가합니다.


📚 지원 이벤트 및 메시지

PR (Pull Request) 이벤트

  1. opened: PR이 생성되었을 때
  2. synchronize: PR이 동기화되었을 때
  3. reopened: PR이 다시 열렸을 때
  4. closed: PR이 닫혔을 때
  5. merged: PR이 병합되었을 때

브랜치 이벤트

  1. create: 브랜치가 생성되었을 때
  2. delete: 브랜치가 삭제되었을 때

이슈 이벤트

  1. opened: 이슈가 생성되었을 때
  2. closed: 이슈가 닫혔을 때

푸시 이벤트

  1. push: 커밋이 푸시되었을 때

📄 메시지 템플릿

기본적으로 메시지 템플릿은 messages.json 파일에 정의된 템플릿을 사용합니다.


커스텀 메시지 템플릿

활성화 방법

custom 파라미터true로 설정하면 사용자의 레포지토리에서 .github/workflows/messages.json 파일을 읽어옵니다.

구조

  1. 언어 키
    1. korean
    2. english
  2. 이벤트별 메시지 키
    1. PR_OPENED - PR이 새로 생성되었을 때 발생하는 이벤트
    2. PR_SYNCHRONIZE - PR이 업데이트(새로운 커밋 추가 등) 되었을 때 발생하는 이벤트
    3. PR_REOPENED - 닫힌 PR이 다시 열렸을 때 발생하는 이벤트
    4. PR_CLOSED - PR이 닫혔을 때 발생하는 이벤트
    5. PR_MERGED - PR이 병합되었을 때 발생하는 이벤트
    6. BRANCH_CREATE - 새로운 브랜치가 생성되었을 때 발생하는 이벤트
    7. BRANCH_DELETE - 브랜치가 삭제되었을 때 발생하는 이벤트
    8. ISSUE_OPENED - 새로운 이슈가 생성되었을 때 발생하는 이벤트
    9. ISSUE_CLOSED - 이슈가 닫혔을 때 발생하는 이벤트
    10. PUSH - 새로운 커밋이 푸시되었을 때 발생하는 이벤트

메시지 포멧

메시지에는 아래 변수가 필수로 포함되어야 합니다.

  1. {title} - PR, 이슈, 브랜치 등 이벤트의 제목
  2. {user} - 해당 이벤트를 발생시킨 사용자의 이름
  3. {url} - 발생 이벤트와 관련된 링크

커스텀 메시지 템플릿 예시

Ex. PR이 생성되거나 push 이벤트가 발생했을 때만 한국어로 알림을 보낼 경우의 커스텀 메시지 템플릿

{
    "korean": {
        "PR_OPENED": "PR이!!!!!!!!!!!!!!!!!!!! 또!!!!!!!!!!!!!! 올라왔네!!!!!!!!!!!!!!!!!!!!!!!!!!!: {title}\n PR한 놈: {user}\n PR url: {url}",
        "PUSH": "{title}\n아이고.. main 브랜치로.. 바로 푸시를 하면 곤란한데...\n 커밋 올린 놈: {user}\n{url}"
    },
}

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.