⚰️

Git branchの生存期間を計測するGithub Actionを作った

2022/10/10に公開

最近プロジェクトが始まってState of DevOpsやLeanとDevOpsの科学にあったメトリクスを測りたい衝動に駆られた結果、Github Acitonを作りました。

https://github.com/marketplace/actions/branch-lifetime

何をしてくれるか

Pull Requestイベントを前提にしており、呼び出すとPRに含まれるcommitログの最古の時間と現在時刻から生存期間をoutputとして返してくれます。雑につくったのでオプションは単純な1つしかありません。

on:
  pull_request:
    # if you want to check lifetime at only closing PR, remove 'opened' and 'synchronize'.
    types: [opened, synchronize, closed]

jobs:
  call-as-actions:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: gki/branch-lifetime@v1
        id: lifetime
        with:
          # You can set 'hour' or 'minute' as well. Default is 'hour'.
          unit: second
      - name: "Use output"
        run: |
          echo "${{ steps.lifetime.outputs.lifetime }}"
          echo "${{ steps.lifetime.outputs.unit }}"

なぜ作ったか

冒頭でもあげた通りなのですが、State of DevOpsや書籍「Accelerate」によると、今日のソフトウェアプロジェクトでは、以下の4つのメトリクスが非常に重要とされています。

  • デプロイメント頻度
  • サイクルタイム(変更リードタイム)
  • 平均復旧時間(MTTR)
  • 変更失敗率(Change Failure Rate

これらのどれかでも計測してみたいという思いはあるものの、プロジェクトの本番リリース(またはそれに準ずるような内部リリース)はまだ先で、これらをしっかり計測することはできません。とはいえ、なんとか同じような指標の1つをできるだけ早く追跡することができないか、と考えて「ブランチの生存期間」にたどり着きました。

この指標に対する仮説は以下の通りです。

  • サイクルタイム(変更リードタイム)は通常であればチケットのステータス遷移を追跡して実現するはず。
  • 一方でその時間の中にはブランチを切ってからPRのapproveをもらってマージするまでの時間(=ブランチ生存期間)が多分に含まれるはず。
  • であれば、ブランチ生存期間を測ることでほぼサイクルタイムに近しい指標が取れるのではないか。
  • もしブランチ生存期間の前後に問題がある場合でも、有益な情報になるはず
      - ブランチ生存期間が短いのにデプロイされない→手動デプロイなどが理由で月1デプロイになってないか?など

今後はどうする

まずは自分で使っていきます。上記の仮説も本当に仮説で自分自身でも検証できていません。
個人のプライベートでアプリやサービスを作ったりしていると正しい仮説のように思いますが、通常業務だともしかしたら他の指標のほうが有用かもしれません。
とにかく、使ってみないとそういった現実も見えてこないので実際に使って、その中でこのツールを改善して貢献できるところは普通にメンテできればと思います。

余談

shellで作ったらファイルが5個で作れました。(最初nodeベースで作ろうと準備したので.gitignoreだけnodeっぽい内容になってる)

 $ tree -a -I .git
.
├── .github
│   └── workflows
│       └── call-as-actions.yml
├── .gitignore
├── LICENSE.md
├── README.md
└── action.yml

何か改善リクエストやより良い実装提案があればこちらまでどうぞ。
https://github.com/gki/branch-lifetime

Discussion