🦔
GitHub Actions × Notion でリードタイムとデプロイ頻度を可視化する
Four Keys の指標の一部である リードタイム と デプロイ頻度 をモニタリングするためには、Pull Request の作成日時やマージ日時を記録して分析する方法が効果的です。GitHub Actions を使い、Notionへ自動的にPR情報を蓄積する手順を紹介します。
やりたいこと
- Pull Request が
main
ブランチにマージされたタイミングで GitHub Actions をトリガー - PR のタイトル、URL、作成日時、マージ日時、ラベルなどの情報を Notion に蓄積
- リードタイム(PR 作成からマージまでの時間)と デプロイ頻度(一定期間内のマージ回数)を後から把握できるようにする
事前準備
1. Notion データベースを用意する
- Notion で新規にデータベースを作成し、以下のカラムを持たせる
- 名前(Title)
- GitHub(URL)
- タイプ(Multi-select)
- 作成日時(Date)
- 完了日時(Date)
- 最終更新日時(Date)
- 作成したデータベースの URL から データベースID を取得する。
2. Notion Integration とトークンの準備
- インテグレーション で新しいインテグレーション作成し、内部インテグレーションシークレット を取得する。
- 上記で作成したデータベースを開き、右上のメニューの 「接続」 で、作成したインテグレーションと接続をする。
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 マージのタイミングをフックすることで、抜け漏れなくデータが蓄積されます。
Discussion