🗂
GitHubのアクティビティ分析ツールをRustで作ってみた
GitHubが提供するGraphQL APIを利用してGitHub上のアクティビティを分析するツールを作ってみました。
用途
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