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 というツールを作りました。
使い方
インストールはこちらにある通りです。
MacだとHomebrewでインストールできます。
$ brew install k1LoW/tap/ghput
ghput
は「GitHubにいろいろPUTできる」ツールなのでその名前にしたのですが、どう使えるのかわかりにくいので以下に例で示します。
例1: Pull Requestのイベントトリガーで terraform plan
などのCIの実行結果をそのPull Requestに貼り付ける
インフラの構成やIAMをTerraformやCodenize toolsを使ってコードにして、それをGitHubで管理するというプラクティスは良く取られると思います。
インフラのコードをGitHubで管理しているのですから、おそらく構成変更はPull Requestベースで行われるでしょう。
そのPull RequestをトリガーにCIで terraform plan
や miam --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-comment
と ghput issue-comment
はデフォルトでは「前回のコメントを削除して、新規コメント登録する」という動きをします。
これは、Pull Requestでコミットを積むようなユースケースを想定している(CI経由でコメントされまくるのがイヤだ)からなのですが、これは --key
オプションを使うことで変更できます。
ghput pr-comment
と ghput 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.json
でJSON化し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できるものを増やそうかなと思っています。