GitHub Actionsからnotion-sdk-pyを用いてNotion上にリリースノートを自動出力してみた

notion-sdk-pyとrelease-drafterを利用して、手軽にNotion上でリリースノート作成を試してみました。
2022.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

リリースノートの自動出力先をNotionにしたい場合、手っ取り早いのはGitHub上で整形したリリースノート用出力をそのままNotion APIに渡すことです。GitHub Actionsにはリリースノートの整形出力用Actionが存在しており、幾つかの設定を追加するだけで手作業いらずとなります。

ramnes/notion-sdk-pyrelease-drafter/release-drafterを組み合わせて、リリースノートを出力する際にNotion更新も試してみました。

ramnes/notion-sdk-pyについては以前書いた記事を参考にしてください。

Workflowを組む

release-drafter実行後のoutputをnotion-sdk-pyからAPIに送る本文に加えるだけです。

# This is a basic workflow to help you get started with Actions

name: publish-release
defaults:
  run:
    shell: bash
# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "master" branch
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
      - name: update release
        id: release_drafter
        uses: release-drafter/release-drafter@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - name: Run publish-draft
        run: |
          sudo -H pip install -U pipenv
          PYTHON_BIN_PATH="$(python3 -m site --user-base)/bin"
          PATH="$PATH:$PYTHON_BIN_PATH"
          pipenv sync
          pipenv run python publish-draft.py
        working-directory: ./notion
        env:
          NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
          DUMP_BODY: ${{ steps.release_drafter.outputs.body }}

publish-draft.py

import os
from notion_client import Client
from pprint import pprint

notion = Client(auth=os.environ["NOTION_TOKEN"])
result = notion.blocks.children.append('XXXXXXXXXXXXXXXXXXXXXXXXX', 
   children=[
    {
      "object": "block",
      "type": "code",
      "code": {
        "rich_text": [{ 
            "type": "text", 
            "text": {
                "content": os.environ['DUMP_BODY'] 
            }
        }],
        "language": "plain text"
      },
    }]
  )
pprint(result)

リリースノート部分が識別しやすくなるようにcodeブロックを指定しています。必要に応じてlanguageの指定を変えるとよいでしょう。

注意点

幾つかパターンを変えつつ行ってみたところ、API仕様による制約がありました

  • API仕様制約により常にブロック最下段への追加となる
  • 既存ブロックの単純移動は不可能

文章だと分かりづらいので実例を上げると、下図1のような構成にてTestとコードブロックの間に新しくコードブロック挟もうとすると下図2のようになります。

図1

図2

Testの小ページ扱いにて間への挟み込みとはなりません。常に小ページの最下に追加される新規ブロックとして扱われるということです。

あとがき

意外と手軽にできました。ネックがあるとすれば、リリースノートで最新を常に最上段に上げたい場合はDBにて各リリースノートを個別レコード扱いにする必要があります。追加日付で並べるわけです。

NotionAPIがブロックの間への挟み込みに対応してくれればリリースノートで最新順に並べて追加することも可能になります。今後に期待しましょう。