Go で GitHub v4 GraphQL API を使って draft pull request を自動作成

先日 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 にはその他マージ済みブランチのお掃除など便利な機能があるので、こちらも興味があればどうぞ。

neco/pkg/git-neco at master · cybozu-go/neco · GitHub