GitHubに1コマンドでいろいろPUTできるツールghputを作った

ghput pr-comment ghput issue-comment のデフォルトの挙動について注意点を追記しました

最近はGitHubやGH:Eといったサービスのリポジトリと、そのリポジトリと連携するCI/CD環境がある前提で、様々なパイプラインを作ることが普通になってきています。

git push や Pull Request をトリガーにCI/CD環境で実行されるのもテストの実行だけではなく、master mergeのタイミングでのプロダクションデプロイやプロビジョニング、その前段階としてPull Requestタイミングでのdry-runやplanの実行など。

GitHubは便利ですし、それと連携するCI/CD環境があるとその2つだけで様々なものの自動化ができて便利です*1

そんなGitHub+CI/CDな環境で使えるであろう ghput というツールを作りました。

github.com

使い方

インストールはこちらにある通りです。

MacだとHomebrewでインストールできます。

$ brew install k1LoW/tap/ghput

ghput は「GitHubにいろいろPUTできる」ツールなのでその名前にしたのですが、どう使えるのかわかりにくいので以下に例で示します。

例1: Pull Requestのイベントトリガーで terraform plan などのCIの実行結果をそのPull Requestに貼り付ける

インフラの構成やIAMをTerraformCodenize toolsを使ってコードにして、それをGitHubで管理するというプラクティスは良く取られると思います。

インフラのコードをGitHubで管理しているのですから、おそらく構成変更はPull Requestベースで行われるでしょう。

そのPull RequestをトリガーにCIで terraform planmiam --apply --dry-run を実行。そして実行結果を確認してからマージするというサイクルの構築は容易に考えられます。

その実行結果を毎回CIのWeb UIで確認するのではなく、Pull Requestにコメントで貼り付けてあると視認性もあがり記録もGitHubに残り便利です(そしてそのようなものを書いている方は多そうです)。

ghput pr-comment を使うと、1からGitHub連携のスクリプトを書くよりかは簡単に実現できます。

例えば terraform plan の結果を github.com/myname/myrepo の #2 の Pull Requestにコメントするには以下のようなコマンドをCIで実行すればOKです。

$ terraform plan | tee plan.txt
$ cat plan.txt | sed -n -e "/---/","/---/p" | \
GITHUB_TOKEN=XXXXXxxxxxXXxxxx \
ghput pr-comment \
--owner myname \
--repo myrepo \
--number 2 \
--header='```\n' \
--footer='\n```'

ghput pr-comment は標準入力をPull Requestにコメントします。terraform plan の出力をそのままコメントすると表示が崩れるので、コードブロックにするために --header--footer で囲っています。

例えばRubyならOctokitですぐに書ける内容ですが、CI環境にRubyを用意するのがどうしても難しいときなどに便利です。

もしIssueにコメントしたいときは ghput issue-comment で可能です。

ghput pr-comment ghput issue-comment のデフォルトの挙動の注意点

ghput pr-commentghput issue-comment はデフォルトでは「前回のコメントを削除して、新規コメント登録する」という動きをします。

これは、Pull Requestでコミットを積むようなユースケースを想定している(CI経由でコメントされまくるのがイヤだ)からなのですが、これは --key オプションを使うことで変更できます。

ghput pr-commentghput issue-comment--key で指定される値で一意を保とうとします。

なので、

  • どんどんコメントを積み重ねて欲しい場合は --key=$RANDOM などとしてkeyをユニークにする
  • A、B2種類のコメントそれぞれ最新だけ残したい場合は、--key=A --key=B などとしてコメントする

といった形で使い分けてください。

例2: 1コマンドでGitHubリポジトリにcommitして、CIで次のアクションを実行する

私は「1コマンドでGitHubリポジトリにcommitできる」と、面白いことができると考えています。

例えば

  • 定期的に各サーバのインストール済みパッケージ一覧を1つのリポジトリに集約してcommit。CIで脆弱性チェック。
  • データベースのスキーマ情報を tbls out -t json -o schema.jsonJSON化しcommit。CIで tbls doc json:///path/to/schema.json を実行してドキュメント生成。
  • メインはCIのテンポラリな実行環境としての利用。empry commitでイベント発火して実行。発火の記録はコミットログとして残る。

など。

ghput commit を使うと、事前のgit cloneなどなしにリポジトリにcommitができます。

$ GITHUB_TOKEN=XXXXXxxxxxXXxxxx \
ghput commit \
--owner myname \
--repo myrepo \
--branch master \
--file file.txt \
--path path/to/file.txt 
--message 'Commit file !!'

--file --path 指定がなければ empty commit になります。

GitHub+CI/CDを前提にする

GitHubはもはやインフラですし、それと連携するCI/CD環境もそうなってきていると思います。

GitHub1つではなくGitHubとCI/CI環境の2つを前提として考えるといろいろ面白い仕組みが作れそうです。

その時にghputが使えると嬉しいですし、ghput自体ももう少しPUTできるものを増やそうかなと思っています。

*1:つまり、GitHub ActionsがGH:Eに来ることを切望しています