この記事のゴール
以下をすべて自動化する
- Linux用、Mac用、Windows用のバイナリのクロスコンパイル
- コンパイルされたバイナリの配布
- ビルドにバージョン情報を埋め込む
↓このような感じで、バイナリが配布できるようになる。
やりかた
ビルドにはDrone.ioを使う。Drone.ioの使い方については、以前書いた記事「Go言語:自分のライブラリをGitHubで公開する方法+drone.ioで継続的インテグレーション - Qiita」にて解説しているので見てほしい。
Drone.ioの設定は次のようになる。なお、配布を自動化するために、Drone.ioのArtifactsページにて artifacts/*/*
を設定する。ここでのサンプルは、http://github.com/suin/drone-golang-ci-example をビルドしている。
# 設定
APP_NAME="my-app"
APP_OS="linux darwin windows"
APP_ARCH="386 amd64"
# Go1.3.1をダウンロードする
pushd ~/
curl -s -o go.tar.gz https://storage.googleapis.com/golang/go1.3.1.linux-amd64.tar.gz
tar xzf go.tar.gz
export GOROOT=~/go
export PATH=$GOROOT/bin:$PATH
go version
popd
# goxをインストールする
go get github.com/mitchellh/gox
gox -build-toolchain -os="$APP_OS" -arch="$APP_ARCH"
# gitのコミットからバージョンを採番する
APP_VERSION=$(git log --pretty=format:"%h (%ad)" --date=short -1)
echo APP_VERSION is $APP_VERSION
# クロスコンパイルする
gox -os="$APP_OS" -arch="$APP_ARCH" -output="artifacts/{{.OS}}-{{.Arch}}/$APP_NAME" -ldflags "-X main.version '$APP_VERSION'"
find artifacts
クロスコンパイルはgoxを使う。goxでGoをクロスコンパイルする - Qiitaを参照。Drone.ioに最初から入っているgo1.2ではgoxのbuild-toolchainが失敗する。なので、go1.3.1をダウンロードして入れる。
ビルド時にgitのリビジョン番号をバージョンとして埋め込む。バージョンをビルド時に埋め込む方法については、「Go言語: ビルド時にバージョン情報を埋め込みたい - Qiita」にて解説した。
リンク
この記事で作ったdrone.ioのサンプル → https://drone.io/github.com/suin/drone-golang-ci-example/files