🗂

GitHubのアクティビティ分析ツールをRustで作ってみた

2024/11/30に公開

GitHubが提供するGraphQL APIを利用してGitHub上のアクティビティを分析するツールを作ってみました。

https://github.com/hirokisan/gh-lens

用途

GitHubのIssuesでタスク管理をしていたり、Pull Requestsを利用して開発しているチームを念頭に置いています。

チームや個人のアクティビティを手軽に把握するために使います。

準備する

使い方はREADMEに記載の通りですが、

CLIをインストールして、

$ cargo install gh-lens

環境変数にGITHUB_TOKENとしてPAT(personal access token)を設定します。

$ export GITHUB_TOKEN = xxx

例えば、ghコマンドを利用している場合には、下記のように手軽にPATを確認可能です。

$ gh auth token
xxx

Pull Requestsのアクティビティを分析する

$ gh-lens prs --help
Analyze pull requests

Usage: gh-lens prs [OPTIONS] --repo <REPO> --start-date <START_DATE> --end-date <END_DATE>

Options:
      --repo <REPO>              USERNAME/REPOSITORY
      --start-date <START_DATE>  %Y-%m-%d
      --end-date <END_DATE>      %Y-%m-%d
      --scope <SCOPE>            [default: team] [possible values: team, individual]
      --members <MEMBERS>        Specify when scope is individual e.g. USERNAME1,USERNAME2
      --period <PERIOD>          [default: all] [possible values: all, monthly]
  -h, --help                     Print help

以下を引数にして、コマンドを実行します。

  • 対象となるリポジトリ
  • 開始日
  • 終了日
$ gh-lens prs --repo hirokisan/gh-lens --start-date 2024-11-12 --end-date 2024-11-18 | jq .
{
  "start_date": "2024-11-12",
  "end_date": "2024-11-18",
  "prs_count": 1,
  "comments_count": {
    "sum": 0,
    "average": 0.0
  },
  "commits_count": {
    "sum": 2,
    "average": 2.0
  },
  "changed_files_count": {
    "sum": 13,
    "average": 13.0
  },
  "time_to_first_contacted": {
    "average": 0.0
  },
  "time_to_approved": {
    "average": 0.0
  },
  "time_to_merged": {
    "average": 260219.0
  },
  "prs_summaries": [
    {
      "url": "https://github.com/hirokisan/gh-lens/pull/1",
      "author": "hirokisan",
      "comments_count": 0,
      "reviewee_comments_count": 0,
      "reviewer_comments_count": 0,
      "commits_count": 2,
      "changed_files_count": 13,
      "created_at": "2024-11-15T12:17:52Z",
      "first_contacted_at": null,
      "approved_at": null,
      "merged_at": "2024-11-18T12:34:51Z"
    }
  ]
}

出力される指標は以下のような感じです。

  • 作成されたPR数
  • コメント数
  • コミット数
  • 変更ファイル数
  • 初回接触までの時間(秒)
  • 承認までの時間(秒)
  • マージまでの時間(秒)

これでPull Requestsに関するチーム全体のアクティビティを把握します。

個々人のアクティビティを把握する場合は、以下のように追加で引数を追加して実行します。

$ gh-lens prs --repo hirokisan/gh-lens --start-date 2024-11-12 --end-date 2024-11-18 --scope individual --members hirokisan | jq .
{
  "hirokisan": {
    "start_date": "2024-11-12",
    "end_date": "2024-11-18",
    "prs_count": 1,
    "comments_count": {
      "sum": 0,
      "average": 0.0
    },
    "commits_count": {
      "sum": 2,
      "average": 2.0
    },
    "changed_files_count": {
      "sum": 13,
      "average": 13.0
    },
    "time_to_first_contacted": {
      "average": 0.0
    },
    "time_to_approved": {
      "average": 0.0
    },
    "time_to_merged": {
      "average": 260219.0
    },
    "prs_summaries": [
      {
        "url": "https://github.com/hirokisan/gh-lens/pull/1",
        "author": "hirokisan",
        "comments_count": 0,
        "reviewee_comments_count": 0,
        "reviewer_comments_count": 0,
        "commits_count": 2,
        "changed_files_count": 13,
        "created_at": "2024-11-15T12:17:52Z",
        "first_contacted_at": null,
        "approved_at": null,
        "merged_at": "2024-11-18T12:34:51Z"
      }
    ]
  }
}

また、引数に--period monthlyを指定することで、期間を月次分割することも可能です。

月次のアクティビティの推移を把握する際に利用します。

Issuesのアクティビティを分析する

$ gh-lens issues --help
Analyze issues

Usage: gh-lens issues [OPTIONS] --repo <REPO> --start-date <START_DATE> --end-date <END_DATE>

Options:
      --repo <REPO>              USERNAME/REPOSITORY
      --start-date <START_DATE>  %Y-%m-%d
      --end-date <END_DATE>      %Y-%m-%d
      --scope <SCOPE>            [default: team] [possible values: team, individual]
      --members <MEMBERS>        Specify when scope is individual e.g. USERNAME1,USERNAME2
      --period <PERIOD>          [default: all] [possible values: all, monthly]
  -h, --help                     Print help

以下を引数にして、コマンドを実行します。

  • 対象となるリポジトリ
  • 開始日
  • 終了日
$ gh-lens issues --repo hirokisan/bybit --start-date 2024-01-01 --end-date 2024-10-31 | jq .
{
  "start_date": "2024-01-01",
  "end_date": "2024-10-31",
  "issues_count": 5,
  "assigns_count": 1,
  "comments_count": {
    "sum": 12,
    "average": 2.4
  },
  "time_to_closed": {
    "average": 339269.2
  },
  "issues_summaries": [
    {
      "url": "https://github.com/hirokisan/bybit/issues/190",
      "author": "id-petrov",
      "assignees": null,
      "participants": [
        "id-petrov",
        "hirokisan"
      ],
      "comments_count": 1,
      "created_at": "2024-10-28T20:10:43Z",
      "closed_at": "2024-10-29T05:39:09Z"
    },
    {
      "url": "https://github.com/hirokisan/bybit/issues/181",
      "author": "austymenko",
      "assignees": null,
      "participants": [
        "austymenko",
        "hirokisan"
      ],
      "comments_count": 5,
      "created_at": "2024-07-06T03:31:11Z",
      "closed_at": "2024-07-13T13:29:15Z"
    },
    {
      "url": "https://github.com/hirokisan/bybit/issues/175",
      "author": "apeman76",
      "assignees": null,
      "participants": [
        "apeman76",
        "hirokisan"
      ],
      "comments_count": 2,
      "created_at": "2024-06-12T14:13:08Z",
      "closed_at": "2024-06-23T07:57:42Z"
    },
    {
      "url": "https://github.com/hirokisan/bybit/issues/171",
      "author": "s-prosvirnin",
      "assignees": [
        "hirokisan"
      ],
      "participants": [
        "s-prosvirnin",
        "hirokisan"
      ],
      "comments_count": 2,
      "created_at": "2024-04-21T10:35:14Z",
      "closed_at": "2024-04-22T11:54:24Z"
    },
    {
      "url": "https://github.com/hirokisan/bybit/issues/160",
      "author": "biancheng347",
      "assignees": null,
      "participants": [
        "hirokisan",
        "biancheng347"
      ],
      "comments_count": 2,
      "created_at": "2024-01-25T09:18:51Z",
      "closed_at": "2024-01-25T10:01:03Z"
    }
  ]
}

出力される指標は以下のような感じです。

  • 作成されたIssue数
  • アサインが決まっているIssue数
  • コメント数
  • クローズまでの時間(秒)

これでIssuesに関するチーム全体のアクティビティを把握します。

個々人のアクティビティを把握する場合は、以下のように追加で引数を追加して実行します。

$ gh-lens issues --repo hirokisan/bybit --start-date 2024-01-01 --end-date 2024-10-31 --scope individual --members hirokisan | jq .
{
  "hirokisan": {
    "start_date": "2024-01-01",
    "end_date": "2024-10-31",
    "issues_count": 0,
    "assigns_count": 1,
    "comments_count": {
      "sum": 8,
      "average": 1.6
    },
    "time_to_closed": {
      "average": 423453.5
    },
    "issues_summaries": [
      {
        "url": "https://github.com/hirokisan/bybit/issues/190",
        "author": "id-petrov",
        "assignees": null,
        "participants": [
          "id-petrov",
          "hirokisan"
        ],
        "comments_count": 1,
        "created_at": "2024-10-28T20:10:43Z",
        "closed_at": "2024-10-29T05:39:09Z"
      },
      {
        "url": "https://github.com/hirokisan/bybit/issues/181",
        "author": "austymenko",
        "assignees": null,
        "participants": [
          "austymenko",
          "hirokisan"
        ],
        "comments_count": 3,
        "created_at": "2024-07-06T03:31:11Z",
        "closed_at": "2024-07-13T13:29:15Z"
      },
      {
        "url": "https://github.com/hirokisan/bybit/issues/175",
        "author": "apeman76",
        "assignees": null,
        "participants": [
          "apeman76",
          "hirokisan"
        ],
        "comments_count": 2,
        "created_at": "2024-06-12T14:13:08Z",
        "closed_at": "2024-06-23T07:57:42Z"
      },
      {
        "url": "https://github.com/hirokisan/bybit/issues/171",
        "author": "s-prosvirnin",
        "assignees": [
          "hirokisan"
        ],
        "participants": [
          "s-prosvirnin",
          "hirokisan"
        ],
        "comments_count": 1,
        "created_at": "2024-04-21T10:35:14Z",
        "closed_at": "2024-04-22T11:54:24Z"
      },
      {
        "url": "https://github.com/hirokisan/bybit/issues/160",
        "author": "biancheng347",
        "assignees": null,
        "participants": [
          "hirokisan",
          "biancheng347"
        ],
        "comments_count": 1,
        "created_at": "2024-01-25T09:18:51Z",
        "closed_at": null
      }
    ]
  }
}

また、引数に--period monthlyを指定することで、期間を月次分割することも可能です。

月次のアクティビティの推移を把握する際に利用します。

Discussion