🦔

GitHub Actions × Notion でリードタイムとデプロイ頻度を可視化する

2025/01/16に公開

Four Keys の指標の一部である リードタイムデプロイ頻度 をモニタリングするためには、Pull Request の作成日時やマージ日時を記録して分析する方法が効果的です。GitHub Actions を使い、Notionへ自動的にPR情報を蓄積する手順を紹介します。

やりたいこと

  • Pull Request が main ブランチにマージされたタイミングで GitHub Actions をトリガー
  • PR のタイトル、URL、作成日時、マージ日時、ラベルなどの情報を Notion に蓄積
  • リードタイム(PR 作成からマージまでの時間)と デプロイ頻度(一定期間内のマージ回数)を後から把握できるようにする

事前準備

1. Notion データベースを用意する

  1. Notion で新規にデータベースを作成し、以下のカラムを持たせる
    • 名前(Title)
    • GitHub(URL)
    • タイプ(Multi-select)
    • 作成日時(Date)
    • 完了日時(Date)
    • 最終更新日時(Date)
  2. 作成したデータベースの URL から データベースID を取得する。

2. Notion Integration とトークンの準備

  1. インテグレーション で新しいインテグレーション作成し、内部インテグレーションシークレット を取得する。
  2. 上記で作成したデータベースを開き、右上のメニューの 「接続」 で、作成したインテグレーションと接続をする。

3. GitHub リポジトリで Secrets を登録

  • リポジトリの 「Settings」 > 「Secrets and variables」 > 「Actions」 から、以下を登録する:
    • NOTION_TOKEN : 内部インテグレーションシークレット
    • NOTION_METRICS_DATABASE_ID : データベースID

GitHub Actions のワークフロー

name: Push Metrics to Notion

on:
    pull_request:
    types:
        - closed
    branches:
        - main

jobs:
    push-to-notion:
    timeout-minutes: 1
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    steps:
        - name: Send PR Info to Notion
        env:
            NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
            NOTION_DATABASE_ID: ${{ secrets.NOTION_METRICS_DATABASE_ID }}
        run: |
            LABELS=$(echo '${{ toJSON(github.event.pull_request.labels) }}' | jq -c '[.[] | {name: .name}]')
            echo "Labels: $LABELS"
            curl -X POST 'https://api.notion.com/v1/pages' \
            -H "Authorization: Bearer $NOTION_TOKEN" \
            -H "Content-Type: application/json" \
            -H "Notion-Version: 2022-06-28" \
            --data '{
            "parent": { "database_id": "'"$NOTION_DATABASE_ID"'" },
            "properties": {
                "名前": {
                    "title": [
                        {
                            "text": {
                                "content": "${{ github.event.pull_request.title }}"
                            }
                        }
                    ]
                },
                "GitHub": {
                    "url": "${{ github.event.pull_request.html_url }}"
                },
                "タイプ": {
                    "multi_select": '"$LABELS"'
                },
                "作成日時": {
                    "date": {
                        "start": "${{ github.event.pull_request.created_at }}"
                    }
                },
                "完了日時": {
                    "date": {
                        "start": "${{ github.event.pull_request.merged_at }}"
                    }
                },
                "最終更新日時": {
                    "date": {
                        "start": "${{ github.event.pull_request.head.repo.pushed_at }}"
                    }
                }
            }
            }'

このワークフローのポイント

発火のタイミング

on:
    pull_request:
    types:
        - closed
    branches:
        - main
jobs:
    push-to-notion:
    timeout-minutes: 1
    if: github.event.pull_request.merged == true
...

Pull Request がクローズされて main ブランチにマージされたときにのみ実行し、if: github.event.pull_request.merged == true でマージされた PR だけを対象にします。

ラベルの取得

LABELS=$(echo '${{ toJSON(github.event.pull_request.labels) }}' | jq -c '[.[] | {name: .name}]')
ラベル情報を取得して Notion のマルチセレクトで登録しています。

NotionAPIの利用

curl -X POST 'https://api.notion.com/v1/pages' \
            -H "Authorization: Bearer $NOTION_TOKEN" \
            -H "Content-Type: application/json" \
            -H "Notion-Version: 2022-06-28" \
...

Notion の Create a page エンドポイントを使い、curl でデータを送信しています。


記録したデータの分析

  • リードタイムの算出

    • 「作成日時」と「完了日時」の差分を確認。
    • 平均値や中央値を指標として利用することで、リリースの速度や改善点を分析できます。
  • デプロイ頻度の把握

    • 期間(週や月など)ごとの完了日時を集計し、PR のマージ頻度を可視化。
    • 定期的にトラッキングすることで開発フローの継続的改善に役立ちます。

まとめ

  • GitHub Actions と Notion API を連携するだけで、Four Keys における主要指標の一部(リードタイムやデプロイ頻度)を効率よく記録・可視化できます。
  • Pull Request マージのタイミングをフックすることで、抜け漏れなくデータが蓄積されます。
あしたのチーム Tech Blog

Discussion