← Cookbook トップへ

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-repo

3. 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>/... で並びます)。

Lines と BranchDensity の時系列チャート (Recorder)

左軸が Code/Lines (青)、右軸が Code/BranchDensity (黄)。LOC は単調増加で、ブランチ密度が緩やかに下がっていれば「コードは増えているが if 分岐の密度は薄まっている = 構造的に整理が追いついている」と読めます。

⚠️ シークレットの取扱い

  • PAT 文字列は 発行時のダイアログでしか表示されません。再表示はできません
  • PAT は GitHub Secret 経由でだけ使い、ローカルにファイル保存しないでください
  • 漏洩が疑われたら Recorder の Settings → API Tokens から失効させ、新しい PAT を発行 → GitHub Secret を上書きしてください