Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
58
Help us understand the problem. What is going on with this article?
@atotto

Go言語のビルド生活を drone.ioで幸せに暮らす #golang

More than 5 years have passed since last update.

Go Advent Calendar 2013 5日目の投稿です。

Qiitaに投稿するのは初めてな @atotto です。よろしくお願いします。

Go言語のビルド生活をdrone.ioで幸せに暮らす

はじめに

Goはクロスコンパイルがとても簡単です。実行ファイル形式で配布する場合、他の環境用にサクっとコンパイルして渡すことができます。
ただ、githubなどにコードは公開してるけど各環境用にコンパイルしたものをさっと配布したいなーと思うとちょっと面倒です。みんながGoのコンパイル環境をもっているとも限りませんし。そこで、CI(継続的インテグレーション)環境でクロスコンパイルしてバイナリを配布できるようにするしくみがないか探してみました。

やりたいことをまとめると:

  • リポジトリにあるコードをCI環境上でクロスコンパイルしておきたい
  • 成果物をダウンロードできるようにしておきたい

ということです。

この記事を読めば、drone.ioで自分のリポジトリをクロスコンパイルしたものを公開できるようになります。

drone.ioとは?

drone.ioTravis-CIBuildHiveと同じようにリポジトリと連携してCIしてくれるありがたいサービスです。drone.io 自体は1年ほど前から存在するサービスですが、今回はじめて使いました。
余談ですがdrone.ioのサービスはGoでできてます

手順

まずは drone.io に登録し、githubアカウントと連携します。これは特に説明しません。
New Projectから自分のリポジトリを選択し、続いて利用する言語を選択します。もちろんGoを選択。

select-go.png

今回、実験に使うリポジトリは https://github.com/atotto/fileserver です。単純なWebファイルサーバをGoで書いてあります。

設定する

次に設定です。

Build & Test

Build Script、もしくは、Setting→Build & TestのCommands内に以下を入れておきます:

# Cross Compiling http://docs.drone.io/golang.html
rm -rf /usr/local/go/src/pkg/appengine
rm -rf /usr/local/go/src/pkg/appengine_internal

pushd /usr/local/go/src
GOOS=windows GOARCH=amd64 ./make.bash --no-clean 2> /dev/null 1> /dev/null
GOOS=darwin  GOARCH=amd64 ./make.bash --no-clean 2> /dev/null 1> /dev/null
popd

GOOS=windows GOARCH=amd64 go get ./...
GOOS=darwin  GOARCH=amd64 go get ./...

mkdir artifacts
cp -r `go env GOPATH`/bin artifacts

基本的に、 Building Go Projectsに書かれている通りですが以下に補足します。

line:6-7のクロスコンパイルの設定は、GOOSとGOARCHの環境変数へ値をいれます。GoのドキュメントOptional environment variablesに詳しい組み合わせが書いてありますので、クロスコンパイルしたい環境はここから選んでみてください。

line:10-11で、go get ./...としているのは、自パッケージのサブディレクトリにあるものを含めるためです。ここではgo testを実施しません。

line:13-14で、artifactsのディレクトリに、ビルドした実行ファイル群をコピーしています。これは、次のArtifactsに関係します。
普通に実行ファイルをビルドすると $GOPATH/bin へ格納されますが、クロスコンパイルでビルドした実行ファイルは $GOPATH/bin/<GOOS>_<GOARCH> なディレクトリへ格納されます。例えば、GOOS=darwinGOARCH=amd64であれば、 $GOPATH/bin/darwin_amd64 へ実行ファイルが格納されることになります。

ちなみにここではgo testを割愛しています。

Artifacts

次に、Artifacts に以下を入れます。

artifacts/bin/*/*

こんな感じ。↓
Artifacts.png

これでartifactsに入っているファイル群を保存します。

ビルドする!

最後に、Build & TestにあったBuild Nowボタンをクリックしてビルドを開始します。

buildnow.png

すると、ビルドコンソールが表示され、、

buildconsole.png
※ スクリーンショット中は調子にのって他の環境用のクロスコンパイルまでやってます。

ビルドが終われば 以下のようにDownloads のタブに成果物が入っているはずです↓

downloads.png
※ スクリーンショット中は調子にのって他の環境用のクロスコンパイルまでやってます。

これで各環境用のバイナリができました!
通常はビルドボタンを押さずにgithubへpushしたことを契機に自動的にビルドしてくれます。

まとめ

drone.ioを使って気になったところは、GoのバージョンをUI上で指定できないところです。Travis-CIではGoのバージョンを指定することができますが、drone.ioではGoのリリース版のみ使える様子です。最新のreleaseやtip版が使いたいとか、rc版を使いたいといった場合は、CI上でGoコンパイラを再コンパイルしたり、コンパイラをダウンロードしたりする工夫が必要になります。

といってる間に、私の設定は最終的にこうなりました : https://drone.io/github.com/atotto/fileserver/admin

おしまい。

参考資料

宣伝

http://github.com/gophersjp/gohttp://golang.org/ のドキュメントの一部を翻訳しています(のんびり)。
もし興味のある方は twitter @atottogophersjp@gmail.com までメールください。

58
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
atotto
groove-x
世界のどこにもない、心を満たすロボットを。私たちGROOVE Xは2015年に設立したスタートアップです。私たちの考えるロボットは、人々の生活に潤いを与える存在として、人が一緒にいたくなるような新世代の家庭用ロボットです。便利さや機能性ではなく、家族や伴侶として愛される存在になれるかどうか。 GROOVE Xが追求するのはあなたの感性の領域に訴えるロボットです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
58
Help us understand the problem. What is going on with this article?