GoのバイナリをデプロイするためにGitHub ReleaseからDLするツールをGoで書いた

GoのバイナリをデプロイするためにGitHub Enterprise(以下、GHE)のReleaseにアップロードしておいたバイナリをダウンロードするツールをGoで書いた話をする。

背景

複数の開発が並行していてGitHubのブランチと本番・ステージ環境が対応付けできなかったり、一方はオンプレで一方はAWSでといった環境の違いによるネットワーク的な問題から、CIでテスト・ビルドまでは自動化できた一方でデプロイまでは自動化できなかった。このため、CIでのビルドで作成したGoのバイナリをGHEのReleaseにアップロードした後に、手動でデプロイ(本番環境からGHEのReleaseに登録されたバイナリをダウンロード)することにした。

ここで、GHEのReleaseからバイナリをダウンロードするツールが必要になったので最初はシェルスクリプトで書こうとしたが、GitHub APIを叩く必要があるためJSONの取り扱いをシェルスクリプトで行うのが面倒だと感じた。jqコマンドを使用すればいいことはわかっていたが、全てのサーバにjqコマンドをインストールしているわけではなかった。jqコマンドをインストールすればいいのだが、この時点でサーバのConfigurationが自動化されていなかったため、jqコマンドがインストールされていることを保証できなかった。

このため、単にGHEのReleaseからバイナリをダウンロードするだけなのだが、このためのツールをGoで書くことにした。一つのバイナリだけで動作するのが使い勝手がいいと思ったので。

比較

自分で作らずとも既にあるツールを使えばいいとも思ったが、いろいろと探してはみたがタグを目印にGitHub Releaseからバイナリをダウンロードするツールがなかった(見つけられなかった)。そもそもこのようなデプロイをする人はあまりいないだろうから誰も作っていないのかな。このため、自分でツールを作ることにした。

話は逸れるが、逆に、バイナリを作成してGitHubのReleaseにアップロードするためのツールはいくつか見つけた。

github.com

github.com

ghrd

作成したツールはこれ。実際には仕事で書いたものを一般的に使えるように一から書き直したので、背景で書いたツールと中身としては別物であるが。

github.com

使い方は以下の通り、タグを目印にGitHub Releaseから対象をダウンロードする。

ghrd -u [OWNER] -r [REPOSITORY] [TAG]

また、環境変数を指定することでGitHub Enterpriseでも使用できる。

作った後に考えたこと

自分はサーバサイドの開発をメインにしている。だが、今回デプロイ用のツールを書いたようにリリース・インフラにも手を出すことで、普段この辺りを運用しているインフラチームとの仕事が進めやすくなったように感じた。

以前読んだ記事( Full-stack developers ) で、フルスタックエンジニアは現実的ではないがフロントからインフラまでの各チームを横断的に動いて全体の生産性をあげる人が必要とされている(かなり意訳)、と書かれてあった。

まだまだスタート地点に過ぎないが、この記事に書かれてあるようなことを自分としてはやっていきたいと思うようになった。 今後は今回と反対側であるフロントサイド(モバイルを含む)にもチャレンジしていきたいとぼんやりだが考えている。