パイプとGitHub CLIでIssueもPullRequestsもこれ一本!ISUCONハック後編

「MakeとGitHub CLIで初回Pushまでを最速に。ISUCONハック前編」の続きです。

techblog.cartaholdings.co.jp

前編では、初回Pushまでの流れを説明してきました。 後編では一歩進んで、Issue管理やその他Tipsについて紹介していきます。

この記事を読むと学べること

  • Shellのパイプを使って、CLIからGitHub Issueにコメント
  • PRマージ後のmainを手元で動かす方法

競技中のログをGitHub CLIで楽する

さて、ここまでで初動のPushをGitHub CLIで行う方法を紹介しました。 次はGitHub CLIで楽に競技中のログをIssue追記する方法を紹介します。

ISUCONの競技中、ログを取ることは非常に重要です。 またそのログをチームと上手く共有し、次なる一手を考える必要があります、

その際にGitHubのIssueが便利なので、GitHub CLIでIssueを操作していきましょう。

まずはIssueを作成してみましょう。以下のように対話形式でIssueを作成することが出来ます。

$ gh issue create

Creating issue in yamachu/gh-cli-de-isucon11q-practice

? Title Hello from GitHub CLI
? Body <Received>
? What's next? Submit
https://github.com/yamachu/gh-cli-de-isucon11q-practice/issues/1

Issue自体は予めGitHubのUIで作っておくこともあるので、作成自体はあまり使うことがありません。ISUCONではIssueのコメントの追加を行うことが多いです。

https://cli.github.com/manual/gh_issue_comment

ここでIssueコメントの使い方を見てみると、-Fオプションで2つの入力方法が使い分けられることが分かります。

  • -F <ファイル名>: ファイル入力
  • -F - : 標準入力

これを使うと、例えばログをそのままIssueに転記することが可能になります。

$ cat なんかすごいログ | gh issue comment ${issue_number} -F -
# or
$ gh issue comment ${issue_number} -F なんかすごいログ

これで、一度ファイルに書き出してあれば標準入力から入力もできますし、ファイル入力も可能になります。

私は特に一時ファイルもいらないかな…というスタンスであるため、以下のようなMakefileのターゲットを用意し、ログを転記するようにしています。

前提として、ターゲット内でプロセス置換という機能を使っているため、Makefile内でSHELLをbashに指定しています。

SHELL=/bin/bash
ISSUE=1

# isucon11qの認証情報、他の競技になったら書き換えます
mysql/client:
   @mysql -h 127.0.0.1 -P 3306 -u isucon isucondition -pisucon

mysql/query: QUERY=
mysql/query:
  echo "$(QUERY)" | $(MAKE) mysql/client

mysql/query/gh: QUERY=
mysql/query/gh:
  $(MAKE) mysql/query QUERY="$(QUERY)" | tee >(gh issue comment $(ISSUE) -F -)

ポイントとして、teeを使うことで、ターミナルに表示させながらIssueに転記を行うことを可能にしています。

また、競技最初に必ず見るテーブル一覧などをIssueに転記するようにしています。

$ make mysql/query/gh QUERY="show tables\G"

この様にGitHub CLIで容易にIssueのコメントを追加することが出来ることは覚えておくと良いでしょう。

PullRequestをGitHub CLIで楽する

ISUCONで複数人で行う場合、サーバ上やローカル上など参照するmainの差分もバラバラになっていることが多発します。個々人が試している施策をPR単位で管理するチームも多いでしょう。

今自分が触っているブランチに、チームメンバーが試したPRをlocalでmergeし、手元で動かせると便利ですよね。

つまり、GitHub CLIを使えば、いつもGUIでやってるPRのmerge結果を手元で試すことが出来るわけです。

そのやり方を紹介します。

baseブランチとPRをマージした後のブランチを refs/pull/:prNumber/merge とよびます。
参照: https://qiita.com/sonots/items/16df445132e704198e3e

これにすぐにcheckout出来るようなaliasをGitHub CLI上に作りましょう。

GitHub CLIにはalias機能が存在し、これを上手く使うことでいくつかのコマンドをまとめて実行することが出来ます。

上記のことを実現するには

$ gh alias set --shell mpr '!git fetch origin pull/"$1"/merge && git checkout FETCH_HEAD'

こんな感じのaliasを作成します。 ここでは mpr (merged pull requestと勝手に名付けました)というaliasを作成しています。

$ gh mpr 1

とすることで、 PullRequest番号1番のPullRequestをmergeした後のブランチ(refs/pull/1/merge)にcheckoutすることが出来ます。

この施策をmainにmergeした状態でどうなるかな?

をこれで簡単に確認することが出来ます。

ISUCONにおいても普段の業務でも、結構使えるaliasなのではないでしょうか。

まとめ

以上、ISUCONでGitHub CLIを活用する方法を紹介しました。 ここに載せたのはGitHub CLIの機能のごく一部であり、私も使ったことがない機能もたくさん存在します。 普段の業務でも使えるtipsもいくつか載せたので、ぜひともGitHub CLIを使い倒してみてください。

またそこで得られた知見を、ぜひともブログで発信したり、Xなどで @y_chu5 に教えてくれると嬉しいです。

それではISUCON13、楽しみましょう!

おまけ

今回使用したMakefileをGistにて公開しておきます。

https://gist.github.com/yamachu/d65ca3ddb277633d0e2e92f511a3f589#file-makefile