GitHubのより良い活用方法を考えてみる

3 min read読了の目安(約3100字

GitHubを日頃から活用してますが、
あまり見える化しようとか考えてきたことがありませんでした。

コードを実装して、PR出して、指摘をもらい、修正して、mergeという、いつもの一連の流れから、
例えば、PR出してからmergeされるまでどれくらいコミットしたのか、はたまたどれくらい時間がかかったのか、など意識したことがなかったので、GitHubからデータを収集して今までの自分の活動履歴をしっかり振り返ってみたいと思った備考録、その1になります。

GitHubのデータをどうやって抽出する?

GitHubがしっかりAPIを用意してくれていました。

簡単に試せる実行環境も用意があります。

一度実行環境でどんな感じか試してみる

簡単に実行できました。
※privateにはこのままではアクセスできない。ゴニョゴニョが必要。

privateにアクセスしたい

認証なしだと、使えるAPIに制限があるっぽいので
GitHubの認証について色々調べました。

  • 基本的な認証
    • user_nameとpasswordで認証突破
  • OAuth2認証
    • 2パターンあって、ヘッダーかパラメーターに含ませればOK

上記がよくあるパターン?の認証方法で
今回僕が試そうと思うのは、Personalアクセストークンを使った認証になります。

Personalアクセストークンって?

参考記事:

https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token
  • アクセストークンを自分で管理できて便利そう
  • セキュリティ上、GitHubが1年間このPersonalアクセストークンを使用しなければ勝手に削除してくれる
  • Personalアクセストークンを作り直すのが簡単そう

上記からこちらを使ってAPIを叩いたり、色々試してみたいなと思いました!

早速curlで叩いてみる

  • ある特定のmergeされたPRを取得する
curl https://api.github.com/repos/hoge/hogehoge/pulls/919?access_token=Personalアクセストークン&state=merge
  • ちゃんと取れました!
<一部抜粋>

  "comments": 1,
  "review_comments": 31,
  "maintainer_can_modify": false,
  "commits": 49,
  "additions": 1538,
  "deletions": 129,
  "changed_files": 66

これでPR出してからmergeされるまでのコミット数など、
取りたい項目が取得できました。

その他にもPRが作成された時間や、mergeされた時間なども取得できたので
ここからPRだしてからmergeされるまでの時間なども出せそうです。

めちゃくちゃ簡易的にcurlで叩いた内容を整理する

  • 以下のようなファイルを作成
test.rb

require 'net/https'
require 'uri'
require 'json'
require 'date'

# 指定
puts 'ユーザーを入力してください'
user = gets.chomp.to_s
puts 'tokenを入力してください'
token = gets.chomp.to_s
puts 'pr_idを入力してください'
pr_id = gets.chomp.to_s

# アクセスするためのURLを生成
base_url = "https://api.github.com/repos/hoge/hogehoge/pulls/#{pr_id}?"

# GETリクエストを送信する
uri = URI.parse(base_url + '&state=mearge')

# HTTPSを使うための設定
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_NONE

# BASIC認証のための設定
req = Net::HTTP::Get.new(uri.path)
req.basic_auth(user, token)

# リクエスト送信
res = https.start do |x|
  x.request(req)
end

result = JSON.parse(res.body)

created_at = Date.parse(result["created_at"])
mearged_at = Date.parse(result["merged_at"])
date_diff = (mearged_at - created_at).to_i

# 取得したレスポンスを表示
puts '--------PR-DATA---------'
puts "タイトル: #{result["title"]}"
puts "ユーザー: #{result["user"]["login"]}"
puts "PR作成日時: #{result["created_at"]}"
puts "mearge日時: #{result["merged_at"]}"
puts "PRからmeargeまで: #{date_diff}日間"
puts "レビューコメント数: #{result["review_comments"]}回"
puts "PRからmergeまでのコミット数 #{result["commits"]}回"
  • 実行してみる
% text.rb
% ユーザーを入力してください
% user_name
% tokenを入力してください
% hogehoge_paersonal_token
% pr_idを入力してください
% 1420

=> 以下の結果が返ってきました!(数値は適用に変えてます。)

--------PR-DATA---------
タイトル: hogehoge機能
ユーザー: 名前
PR作成日時: 2020-11-01T06:31:42Z
mearge日時: 2020-11-19T06:24:06Z
PRからmeargeまで: 18日間
レビューコメント数: 8回
PRからmergeまでのコミット数 20回
  • めちゃくちゃ簡易的ですが、欲しい結果を取得できました!

最後に

もうちょっと工夫してより簡単に便利なツールを作成とかしてみたいなと思ってみたり🤔

(goをもっと勉強して、せっかくならgoで作成してみたい・・・
備考録その2をどこかのタイミングで出せれば・・・)

時間がある時に色々挑戦してみたいと思います!