Go

gox して ghr するツール ggallin 作った

More than 3 years have passed since last update.

ggallin の機能

ggallin (ジージーアリン) は Go 用のクロスコンパイルツール gox と GitHub Releases へのリリースを行う ghr をラップしてコマンド一発でビルド・リリースを行ってくれるツールです。

より詳細には、ggallin release を実行すると以下の流れで各種コマンドが実行されます。

  1. gox によるクロスコンパイルで各種 OS 向けのバイナリがビルドされる
  2. ビルドされたバイナリを全て .zip に圧縮
  3. git push origin master
  4. ghr により、version.go に指定されたバージョンとしてリリースされる

ggallin の使い方

セットアップ

ggallin 自体は go get github.com/yuya-takeyama/ggallin なり GitHub Releases からバイナリをインストールするなりして入れられます。
(Homebrew に対応させられれば Mac でのインストールが楽になるのでそのうちやりたい)

gox と ghr は予めインストールしておく必要があります。
この辺りも ggallin の機能として提供できると便利そうですが、今の所実装できてません。

また、環境変数 GITHUB_TOKEN に GitHub API のトークンをセットしておく必要があります。
これは ghr が要求するものなので、詳しくはそちらの README.md を参照してください。

あとは go と git もインストールしている前提ですが、Go でツールを書いて GitHub に置いている人であればまぁ問題ないでしょう。

version.go の用意

バージョンを記入するファイルとして、version.go というファイルを作っておく必要があります。

中身は以下のような感じにします。

version.go
package main

const Version string = "0.0.1"

var GitCommit = ""

変数名もこれに合わせる必要があります。
定数 Version はリリース時に手動で書き換えておきます。

空の変数 GitCommit はビルド時に -ldflags オプションで動的にセットされます。

ビルド & リリース

基本的には以下のコマンドだけでリリースが実行できます。

$ ggallin release -u yuya-takeyama

-u オプションは GitHub ユーザ名を指定します。
ghr はデフォルトでは .gitconfiguser.name を GitHub ユーザ名として使用するようになっておりますが、そこが一致している人はあんまりいないように思うので、指定するのが無難でしょう。

なお、ghr の 2015/03/29 の現在のプレリリース版だと .gitconfiggithub.user を使用するようになっているので、そっちを設定しておくのもよいでしょう。

また、コンパイル対象の OS やアーキテクチャを使用するときは --arch, --os, --osarch というオプションを使うと、gox にそのまま渡されます。
例えば Linux と Mac (Darwin) だけを対象にするときは以下のようにします。

$ ggallin release -u yuya-takeyama --os="darwin linux"

ggallin は今の所設定ファイルには対応していないので、とりあえずは上記のようなコマンドを release.sh などとしてリポジトリにコミットしておけばよいでしょう。
とりあえずビルド・リリースをコマンド一発でできるようになりました。

ggallin の実装について

ggallin のクロスコンパイル・Zip 化の流れは ghr プロジェクト内のシェルスクリプトを参考にしています。
また、プロジェクトの初期化は cli-init により行われております。
両方の作者である deeeet さん (tcnksm さん) に感謝します :bow:

名前について

goxghr を組み合わせて All-in-One のツールとして提供する、というのと、パンクロックアーティスト G.G. Allin にちなみます。
(G.G. Allin はすごくエキセントリックなミュージシャンなので、ググるときはグロ注意)

ggallin を作るモチベーション

以前は、コマンドラインツールは基本的に Ruby で作ってきましたが、クロスコンパイル・デプロイの容易さから、最近はもっぱら Go で開発するようになりました。

そんな Go ですが、作ったツールをビルド・リリースするまでの流れを一気通貫で行ってくれるツールはなかなか見つかりません。
個人的にはこれまでツール開発は Ruby で行っており、Bundler を使えば rake buildrake release といったコマンドで簡単に gem をリリースすることができたので、その体験を Go にもそのまま持って来たいと思いました。

これでますます Go によるツール開発が楽になったので、これまでシェルスクリプトや Ruby で書いてきたものもどんどん Go にしていくつもりです。

まとめ

お前も Go 実装にしてやろうか!