先日 GitHub に「開発中のためまだマージするべきでない」プルリクエストを作ることができる Draft Pull Request 機能が追加されました。
今の業務では複数人でモブプロしたりする関係で、開発途中のブランチを GitHub に push してひとまずプルリクエストを作ることが良くあります。従来は、そういったプルリクエストを作る都度 "wip" ラベルをつけたり [WIP]
とタイトルを変えたりとひと手間かかっていました。その手間を無くせるので、draft pull request は待望の機能です。
もうひとつ、業務ではプルリクエストは working tree から git neco review
という拡張コマンドで自動作成するようにしています。いちいち画面を触る必要がなくとても便利です。自然な考えとして、git neco draft
というコマンドを打てば draft pull request を自動作成したくなります。
長くなってきたので後の話を一行でまとめると、既存のいいライブラリがなかったので GitHub GraphQL API v4 を Go 言語からさくっと叩いて draft pull request を自動作成するツールを作ってめでたしめでたし、です。内容に興味がある人は続きをどうぞ。
GitHub の API は REST 形式の v3 と GraphQL の v4 があります。v4 が後発ですが、v3 もまだメンテナンスされている雰囲気です。
Go 言語用の API v3 クライアントとしては google/go-github が著名ですが、draft pull request を作ることはまだできないようです。
API v4 クライアントとしては shurcooL/githubv4 がある程度知られているようですが、v4 API は GitHub のほうでかなりの部分が developer preview 扱いで、pull request は draft はおろか通常の pull request 作成 API も preview になっています。shurcooL/githubv4 は preview を除いた schema 要素から自動生成されているので、pull request を作ることができません。
createPullRequest | GitHub Developer Guide
だからといって諦める手はありません。GraphQL は Web 向けの SQL みたいなもので、クライアントを作るのは一日もかけずチョイと作れます。GraphQL を知っていればですけど。
ま、そんなわけで pull request を draft も含めて作るよう GitHub の GraphQL API v4 クライアントを作りました。
neco/github.go at master · cybozu-go/neco · GitHub
簡単に実装を解説:
- L16-L18: preview 機能を使うには
Accept
ヘッダにこれらを指定する必要があります - L29-L31: 認証は personal access token を OAuth2 トークンとして使います
- L53: GraphQL は REST と違って呼び出し形式が統一されているので、HTTP の処理はこれだけです
- L85-L90:
createPullRequest
はレポジトリの内部 ID の指定が必要なので、内部 ID だけを取得するクエリです - L125-L143: これがプルリクエストを作るクエリです。GraphQL は楽々なのが伝わると思います。
これを使ったツールが git-neco
です。git は git-xxx
というコマンドが PATH にあれば git xxx
で呼び出してくれるので、git-neco
コマンドに PATH が通っていれば以下のように pull request を自動作成できます。
$ git neco draft (カレントブランチを git push して GitHub で draft pull request を作成) $ git neco review (同上。ただし draft ではない)
git-neco
にはその他マージ済みブランチのお掃除など便利な機能があるので、こちらも興味があればどうぞ。