ggallin の機能
ggallin (ジージーアリン) は Go 用のクロスコンパイルツール gox と GitHub Releases へのリリースを行う ghr をラップしてコマンド一発でビルド・リリースを行ってくれるツールです。
より詳細には、ggallin release
を実行すると以下の流れで各種コマンドが実行されます。
-
gox
によるクロスコンパイルで各種 OS 向けのバイナリがビルドされる - ビルドされたバイナリを全て
.zip
に圧縮 git push origin master
-
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
というファイルを作っておく必要があります。
中身は以下のような感じにします。
package main
const Version string = "0.0.1"
var GitCommit = ""
変数名もこれに合わせる必要があります。
定数 Version
はリリース時に手動で書き換えておきます。
空の変数 GitCommit
はビルド時に -ldflags
オプションで動的にセットされます。
ビルド & リリース
基本的には以下のコマンドだけでリリースが実行できます。
$ ggallin release -u yuya-takeyama
-u
オプションは GitHub ユーザ名を指定します。
ghr
はデフォルトでは .gitconfig
の user.name
を GitHub ユーザ名として使用するようになっておりますが、そこが一致している人はあんまりいないように思うので、指定するのが無難でしょう。
なお、ghr
の 2015/03/29 の現在のプレリリース版だと .gitconfig
の github.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 さん) に感謝します
名前について
gox
と ghr
を組み合わせて All-in-One のツールとして提供する、というのと、パンクロックアーティスト G.G. Allin にちなみます。
(G.G. Allin はすごくエキセントリックなミュージシャンなので、ググるときはグロ注意)
ggallin を作るモチベーション
以前は、コマンドラインツールは基本的に Ruby で作ってきましたが、クロスコンパイル・デプロイの容易さから、最近はもっぱら Go で開発するようになりました。
そんな Go ですが、作ったツールをビルド・リリースするまでの流れを一気通貫で行ってくれるツールはなかなか見つかりません。
個人的にはこれまでツール開発は Ruby で行っており、Bundler を使えば rake build
や rake release
といったコマンドで簡単に gem をリリースすることができたので、その体験を Go にもそのまま持って来たいと思いました。
これでますます Go によるツール開発が楽になったので、これまでシェルスクリプトや Ruby で書いてきたものもどんどん Go にしていくつもりです。
まとめ
お前も Go 実装にしてやろうか!