hacomono TECH BLOG

フィットネスクラブやスクールなどの顧客管理・予約・決済を行う、業界特化型SaaS「hacomono」を提供する会社のテックブログです!

GitHubAPIを使用してPullRequestにおける数値を取得する

こんにちは!hacomono開発チームの塩濱です。

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

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

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

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

GraphQL

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

GraphQL実行環境

一度実行環境を使って、どんな感じか試してみる

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

f:id:hacomono-tech:20210302083822p:plain

privateにアクセスするには?

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

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

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

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

docs.github.com

  • アクセストークンを自分で管理できて便利そう
  • セキュリティ上、GitHubが1年間このPersonalアクセストークンを使用しなければ勝手に削除してくれる
  • Personalアクセストークンを作り直すのが簡単そう

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

早速curlで特定のPullRequestの数値を取得できるか試してみる

  • ある特定の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されるまでの時間なども出せそうです。

取得したいものだけを簡易的に抜き出してみる

  • 以下のようなファイルを作成する
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"]}回"
  • 実行する
% test.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回

めちゃくちゃ簡易的ですが、欲しい情報を抜き出せました。

最後に

これを応用して、もっと簡単にできないか簡易的なツール作成とかしてみたいなと思ってみたり🤔

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