GitHub Issue Timeline APIでProjectの状態にとどまった時間を取得する

GitHubにはIssueのタイムラインを取得できるTimeline APIがあります。Issueのコメントだけではなく、たとえば「いつ、どのラベルを付与したか」や「いつ、どのProject Columnに移動したか」などを取得できます。(GitHubドキュメント に記載の通り、GitHub Project に関する情報を Timeline APIで取得する機能は開発者プレビュー段階とのことで、 リクエストヘッダに Accept: application/vnd.github.starfox-preview+json を付与することで取得できます)

たとえばこんなかんじのコマンドでリクエストできます。

curl \
  -H "Accept: application/vnd.github.mockingbird-preview+json" \
  -H "Accept: application/vnd.github.starfox-preview+json" \
  "https://api.github.com/repos/{owner}/{repo}/issues/{issue_id}/timeline"

こんなレスポンスが返ってきます。(一部を抜粋しています)

[
  {
    "id": 5272014742,
    "event": "converted_note_to_issue",
    "created_at": "2021-09-08T12:34:49Z",
    "project_card": {
      "id": 68365408,
      "url": "https://api.github.com/projects/columns/cards/68365408",
      "project_id": 13191782,
      "project_url": "https://api.github.com/projects/13191782",
      "column_name": "TODO"
    }
  },
  {
    "id": 5272041752,
    "event": "moved_columns_in_project",
    "created_at": "2021-09-08T12:39:42Z",
    "project_card": {
      "id": 68365408,
      "url": "https://api.github.com/projects/columns/cards/68365408",
      "project_id": 13191782,
      "project_url": "https://api.github.com/projects/13191782",
      "column_name": "Doing",
      "previous_column_name": "TODO"
    }
  },
   {
    "id": 915208714,
    "created_at": "2021-09-08T12:48:10Z",
    "updated_at": "2021-09-08T12:48:10Z",
    "author_association": "NONE",
    "body": "コメント",
    "performed_via_github_app": null,
    "event": "commented",
  },
  {
    "id": 5287257709,
    "event": "labeled",
    "created_at": "2021-09-11T06:22:04Z",
    "label": {
      "name": "label1",
      "color": "EAA6C8"
    }
  },
  {
    "id": 5287262270,
    "event": "closed",
    "created_at": "2021-09-11T06:29:45Z"
  }
 ]

event パラメータによって「なにが行われたか」が分かります。たとえばこんなかんじ。

event 何が行われたか
labeled ラベルが付与された
unlabeled ラベルが外された
added_to_project プロジェクトに追加された
converted_note_to_issue プロジェクトカードをIssueにした
moved_columns_in_project プロジェクトカードを移動した

また、各イベントのオブジェクトには created_at パラメータが存在するので、eventパラメータと組み合わせると、ラベルが付与されていた時間や、プロジェクトのある状態にとどまった時間を集計することができます。

これらを行うGitHub Actionsを書いてみました。

github.com

たとえば、私は自身のGitHub Projectで趣味開発のタスク管理をしていたりしますが、このActionsを導入することで、なににどれくらい時間がかかっているかを簡単に確認できるようになります。

こんなかんじに使います。Issueが閉じられたタイミングで、ラベルが付与された時間やプロジェクトにかかった時間をコメントします。

name: issue-closed

on:
  issues:
    types:
      - closed

jobs:
  closed:
    runs-on: ubuntu-latest
    steps:
      - name: Report
        id: report
        uses: piyoppi/actions-labeled-duration@abf85a23b076409eb646c7319d72c3a9e7167e27
        with:
          labels: label1,label2  # 集計対象のラベル(Optional)
          project_columns: TODO,Doing # 集計対象のプロジェクトカラム名(Optional)
          issue_comment: '⌛このIssueの作業にかかった時間は以下の通りです'  # Issueのコメント(Optional)

実行するとこんなかんじ になります。

ちまちまと使いながら手を入れていこうと思っています。ではでは。