사이드 프로젝트

옵시디언 Github Action 으로 파일 등록 알림 보내기

귀찮은 개발자 2024. 3. 13. 09:31

스터디 진행 과정 중 옵시디언을 지리와 노션처럼 사용하기로 했다.
이로 인해 글이 업로드 되었다는 것을 디스코드에 공유하기로 했다.

이 과정을 자동화하기 위해

  1. 옵시디언에 글을 작성하면 자동 커밋 + Push 가 된다.
  2. Push 된 파일들을 디스코드로 공유한다.

정도로 분류했다.

1번은 옵시디언 확장 프로그램으로 해결이 가능하며
2번은 Github Action 으로 해결이 가능해 보였다.

요구사항

  1. 옵시디언에 글을 작성하면 Github 에 업로드
  2. 업로드 된 글을 Discord 의 웹훅으로 알림을 준다.

알림 내용

제목을 통해 어떤 글이 추가되었는지 알 수 있다. 이는 파일 경로로 유추가 가능하다.

  1. 옵시디언 주소 연결하여, 바로 갈 수 있도록 한다.
  2. 각 글의 카테고리를 분류하여 어떤 주제인지 알려준다.
  3. 글이 작성된 시간을 기록한다.
  4. 작성자를 기록한다.

이슈

  1. github 에서 지원하던 github.event.head_commit 은 지원이 중단되었다.
    이슈 : https://github.com/orgs/community/discussions/25597
  2. 유니코드 이스케이프 문자 때문에 JSON 이 깨진다.
    이를 위한 해결 방법으로는 디코딩을 하면 되는데, 다른 것들까지 원치 않는 것 까지 디코딩이 된다.

해결 방법

  1. 잘 만들어진 서드파티를 활용한다
    잘 만들어진 서드파티 : tj-actions/changed-files@v42
  2. 처음에는 JSON Body 전체를 디쾽 하려 했으나, 생각해보니 듣록된 경로+파일 이름만 디코딩하면 되는 문제였다.

구현 방법

  1. github action 에 대한 yml 을 추가한다.
  2. main 에 반영된 커밋들 중 폴더를 기준으로 파일 URL 을 생성한다.
  3. 생성된 URL 은 한번 디코딩 해준다.
  4. DIscord 으로 웹훅 알림을 준다.
  5. DIscord 주소는 Github Action 환경변수로 관리한다.
  6. 2번 과정의 경우 배열을 이용하여 코드를 좀 줄인다.

전체적인 Yaml 파일은 다음과 같다.

name: CI

on:
  push:
    branches:
      - main

jobs:
  notify_changes:
    runs-on: ubuntu-latest
    name: Notify Changes
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Get Changed Files
        id: changed-files
        uses: tj-actions/changed-files@v42

      - name: Prepare Discord Notifications
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
        id: prepare-notifications
        run: |
          declare -A categories=(
            ["Meeting"]="새로 등록된 미팅 목록"
            ["Projects"]="새로 등록된 프로젝트 이슈"
            ["Reference"]="새로 등록된 레퍼런스 자료"
            ["Notices"]="새로 등록된 공지사항"
          )

          for category in "${!categories[@]}"; do
            category_changes=""
            for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
              if [[ $file == *"$category"* ]]; then
                decoded_string=$(printf '%b' "$file")
                category_changes+="\n- https://github.com/lucycato-backend/obsidian/blob/main/$decoded_string"
              fi
            done

            if [[ $category_changes != '' ]]; then
              category_changes="**${categories[$category]}** \n업로드 시간: $(TZ=Asia/Seoul date +'%Y-%m-%d %H:%M:%S') \n작성자: ${{ github.actor }} $category_changes"
              echo "Changes in $category: $category_changes"
              curl -X POST -H "Content-Type: application/json" -d "{\"content\": \"$category_changes\"}" $DISCORD_WEBHOOK_URL
            fi
          done

결과

2개의 파일이 삭제되었고, 1개의 파일이 삭제되었다. 

추가된 파일은 아래처럼 알림으로 확인할 수 있다. (싱크가 안맞긴하다.)