[Notion]Draw.io 갱신 내역 Notion 연동

9north·2024년 10월 29일
post-thumbnail

Notion은 기본적으로 Github과의 연동을 이미 지원하고 있다. GitHub의 PR 페이지를 Notion에 복사 붙여넣기를 할 경우 바로 PR을 동기화하는 테이블을 생성시킨다. 그러나 PR을 거치지 않는 직접 push는 해당 동작으로는 완전히 구현할 수 없다.

GitHub에 올라가 있는 Draw.io의 파일을 변경할 때마다, push를 인식하는 GitHub Actions를 생성하고, 이를 Notion API와 연동시켜, GitHub의 업로더와 Notion Workspace의 사람을 연동시킨다면, 간편하게 Draw.io 내역을 추적할 수 있다.

Draw.io 생성

기존에 있는 Draw.io라면 GitHub에 다른 이름으로 저장 을 통해 업로드할 수 있다. 이후 저장할 경우 저장할 때마다 GitHub 에 push가 완료된다.

Notion API 생성

먼저 Notion API를 발급받고, 토큰을 GitHub Actions의 시크릿에 기록해두어야 한다.
노션 API 발급 페이지 링크

새로 생성한 API는 특정 워크 스페이스에서만 작동하게 설정할 수 있다.

GitHub Secrets

GitHub Secrets은 조직, 리포지토리 또는 리포지토리 환경에서 만든 변수다. 만든 비밀은 GitHub Actions 워크플로에서 사용할 수 있다. GitHub Actions는 워크플로에 비밀을 명시적으로 포함하는 경우에만 비밀을 읽을 수 있다.

여기에서 프라이빗 API 통합 시크릿을, 나는 NOTION_API_TOKEN 라는 이름으로 GitHub Organization / Settings / Security / Secrets and variables / Actions / Repository secrets 의 시크릿에 넣었다.

시크릿은 한 번 생성할 때에만 값을 알 수 있고, 이후로는 조회가 불가능하며, 수정과 삭제만 가능하다.

Notion 페이지를 생성한다. 표를 만들고, 필요한 칼럼 값과 속성을 설정한다. 나는 일시는 Notion에서 제공하는 생성 일시로 넣고, 커밋 메시지와 사람만 추가할 것이다.

이때 해당 페이지의 주소표시줄에서, 데이터베이스아이디 로 표기한 부분이 필요한 토큰 값이다. 이를 GitHub에 NOTION_DATABASE_ID 란 값으로 저장해둔다.

해당 페이지의 설정에서, 생성해두었던 Notion API를 연결해둔다.

이제 GitHub의 닉네임과 Notion의 people을 연동한다. GitHub은 사용자의 허가 없이 이메일을 공개하지 않고 있으며, Notion은 독자적이고 복잡한 고유 id를 가지고 있다.

여기서는 GitHub에서 PR을 올리는 사람이 한정적으로 정해져있다는 전제 하에, GiHub의 닉네임과 내 Notion Workspace의 모든 아이디를 불러와 json을 생성한다.

$headers = @{
    "Authorization" = "Bearer [NOTION_API_TOKEN]"
    "Notion-Version" = "2022-06-28"
}
  
$response = Invoke-WebRequest -Uri "https://api.notion.com/v1/users" -Headers $headers -Method GET

$response.Content | Out-String

NOTION_API_TOKEN에 내 토큰을 넣고, 터미널에서 해당 request를 날릴 경우 아래와 같은 JSON을 얻을 수 있다.

{
  "object": "list",
  "results": [
    {
      "object": "user",
      "id": "노션아이디",
      "name": "이름",
      "avatar_url": null,
      "type": "person",
      "person": {
        "email": "이메일"
      }
    }
    ...
  ]
}

이를 아래와 같은 JSON으로 가공하여,USER_MAPPING_JSON 이란 시크릿을 생성한다.

{
  "GitHub 닉네임": "노션아이디"
}

이후 GitHub의 Repository에, .github\workflows\notion-intergration.yml 라는 파일을 생성하고, 아래 workflow를 입력한다.

name: Update Notion

on:
  push:
    branches:
      - main

jobs:
  update-notion:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Extract commit information
        id: commit_info
        run: |
          echo "author_github=$(git log -1 --pretty=format:'%an')" >> $GITHUB_ENV
          echo "commit_message=$(git log -1 --pretty=format:'%s')" >> $GITHUB_ENV
          echo "commit_time=$(git log -1 --pretty=format:'%cI')" >> $GITHUB_ENV

      - name: Load Notion User ID from JSON Secret
        id: load_user_id
        env:
          USER_MAPPING_JSON: ${{ secrets.USER_MAPPING_JSON }}
        run: |
          notion_user_id=$(echo "$USER_MAPPING_JSON" | jq -r --arg github_id "${{ env.author_github }}" '.[$github_id]')
          if [ "$notion_user_id" = "null" ]; then
            echo "Notion user not found for GitHub ID: ${{ env.author_github }}"
            notion_user_id=""
          fi
          echo "notion_user_id=$notion_user_id" >> $GITHUB_ENV

      - name: Send data to Notion
        if: env.notion_user_id != ''
        env:
          NOTION_API_TOKEN: ${{ secrets.NOTION_API_TOKEN }}
          NOTION_DATABASE_ID: ${{ secrets.NOTION_DATABASE_ID }}
        run: |
          curl -X POST 'https://api.notion.com/v1/pages' \
            -H "Authorization: Bearer $NOTION_API_TOKEN" \
            -H "Content-Type: application/json; charset=UTF-8" \
            -H "Notion-Version: 2022-06-28" \
            -d "$(jq -n --arg database_id "${{ secrets.NOTION_DATABASE_ID }}" \
                          --arg msg "${{ env.commit_message }}" \
                          --arg time "${{ env.commit_time }}" \
                          --arg notion_user_id "${{ env.notion_user_id }}" \
                          '{
                              parent: { database_id: $database_id },
                              properties: {
                                "커밋 메시지": {
                                  title: [{ text: { content: $msg } }]
                                },
                                "사람": {
                                  people: [{ id: $notion_user_id }]
                                }
                              }
                            }')"


이제 저장할 때 커밋 메시지를 입력하면,

커밋 메시지가 노션에 업로드된다.

업데이트될 때마다 Notion 알림도 온다.

profile
FE / JAVA 개발자

0개의 댓글