GitHub Actions → Recorder で自分のリポの DORA / Code メトリクスを蓄積する
自分の Recorder PAT を GitHub Secret に置いて、Deploy / LeadTime / Lines を 毎マージ・毎日 POST するパターン。動かしながら Recorder API の感触をつかむための 試運転メモ。NASEBANAL 内部でも同じ構成 (System User 版) を全 10 リポで運用しています。
このレシピで取得・記録できるもの
GitHub Actions から Recorder に POST して、自分のリポジトリの DORA メトリクスとコードメトリクスを蓄積するパターンです。動かしながら Recorder API の感触をつかむための試運転メモとしても使えます。
<MyApp>/DORA/Deploy— 1 日あたりのデプロイ回数 (daily cron)<MyApp>/DORA/LeadTime— PR 作成からマージまでの時間 (per merge)<MyApp>/Code/Lines— リポ全体の総 LOC (per merge)<MyApp>/Code/PushDelta— マージで足し引きされた行数 (per merge)
メトリクス名の <MyApp> の部分は自由に命名してください (例: MyTeam/...、Frontend/...)。Recorder 上の「タグ」として独立して並ぶので、後から複数アプリ・複数チームを並べて比べたいときの名前空間として使えます。
前提
- Recorder のアカウント
- 自分の GitHub リポジトリ (workflow を設置するため)
セットアップ手順
1. Recorder の PAT を発行
Settings → API Tokens で PAT を発行します。トークン文字列は 発行時のダイアログでしか表示されない ので、その場でコピーしてください。
2. GitHub Secret に登録
リポジトリの Settings → Secrets and variables → Actions で RECORDER_PAT という名前で 1. のトークンを登録します。
# gh CLI を使う場合
gh secret set RECORDER_PAT --repo your-org/your-repo3. workflow ファイルを配置
.github/workflows/post-on-deploy.yml (マージごとに走る):
name: Post DORA metrics on deploy
on:
push:
branches: [main]
permissions:
contents: read
pull-requests: read
jobs:
post:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Compute and post LeadTime + Lines
env:
RECORDER_PAT: ${{ secrets.RECORDER_PAT }}
APP_PREFIX: MyApp # 自由に命名
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# PR open → merge の経過時間 (分)
PR_NUM=$(gh pr list --state merged --base main --limit 1 --json number --jq '.[0].number')
if [ -n "$PR_NUM" ]; then
OPENED=$(gh pr view "$PR_NUM" --json createdAt --jq '.createdAt')
MERGED=$(gh pr view "$PR_NUM" --json mergedAt --jq '.mergedAt')
LEAD_MIN=$(( ($(date -d "$MERGED" +%s) - $(date -d "$OPENED" +%s)) / 60 ))
curl -sS -X POST https://api.recorder.nasebanal.com/api/v1/records \
-H "Authorization: Bearer $RECORDER_PAT" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$APP_PREFIX/DORA/LeadTime\",\"unit\":\"min\",\"data_type\":\"integer\",\"chart_type\":\"line\",\"value\":$LEAD_MIN}"
fi
# リポ全体の LOC
LINES=$(git ls-files | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}')
curl -sS -X POST https://api.recorder.nasebanal.com/api/v1/records \
-H "Authorization: Bearer $RECORDER_PAT" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$APP_PREFIX/Code/Lines\",\"unit\":\"lines\",\"data_type\":\"integer\",\"chart_type\":\"line\",\"value\":$LINES}".github/workflows/post-daily.yml (1 日 1 回 cron):
name: Post deploy count daily
on:
schedule:
- cron: '5 0 * * *' # 毎日 00:05 UTC
workflow_dispatch:
jobs:
post:
runs-on: ubuntu-latest
steps:
- name: Count yesterday's deploys
env:
RECORDER_PAT: ${{ secrets.RECORDER_PAT }}
APP_PREFIX: MyApp
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
SINCE=$(date -u -d 'yesterday 00:00' +%Y-%m-%dT%H:%M:%SZ)
UNTIL=$(date -u -d 'today 00:00' +%Y-%m-%dT%H:%M:%SZ)
COUNT=$(gh run list --workflow deploy.yml --created "$SINCE..$UNTIL" --json status --jq 'map(select(.status=="completed")) | length')
curl -sS -X POST https://api.recorder.nasebanal.com/api/v1/records \
-H "Authorization: Bearer $RECORDER_PAT" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$APP_PREFIX/DORA/Deploy\",\"unit\":\"count\",\"data_type\":\"integer\",\"chart_type\":\"bar\",\"value\":$COUNT}"4. 動作確認
PR をマージする前に、まず手元から 1 件 POST して通ることを確かめましょう。
export RECORDER_PAT="ステップ 1 で控えたトークン"
curl -sS -X POST https://api.recorder.nasebanal.com/api/v1/records \
-H "Authorization: Bearer $RECORDER_PAT" \
-H "Content-Type: application/json" \
-d '{"name":"MyApp/DORA/Deploy","unit":"count","data_type":"integer","chart_type":"bar","value":1,"comment":"smoke test"}'Recorder のタグ一覧に MyApp/DORA/Deploy が現れていれば成功です。あとは PR をマージすれば post-on-deploy.yml が走り、本物のメトリクスが入り始めます。
サンプル出力
1〜2 週間データが溜まると、Recorder 上ではこんな具合に時系列でメトリクスを並べられます (これは NASEBANAL 内部の nb-recorder リポの実データなので、タグ名は System/... プレフィックスですが、自分で使う場合は <MyApp>/... で並びます)。

左軸が Code/Lines (青)、右軸が Code/BranchDensity (黄)。LOC は単調増加で、ブランチ密度が緩やかに下がっていれば「コードは増えているが if 分岐の密度は薄まっている = 構造的に整理が追いついている」と読めます。
⚠️ シークレットの取扱い
- PAT 文字列は 発行時のダイアログでしか表示されません。再表示はできません
- PAT は GitHub Secret 経由でだけ使い、ローカルにファイル保存しないでください
- 漏洩が疑われたら Recorder の Settings → API Tokens から失効させ、新しい PAT を発行 → GitHub Secret を上書きしてください