Blog
PFNの柏原です。Go言語製のソフトウェアのCI(Continuous Integration, 継続的インテグレーション)環境の構築方法(導入方法)について解説します。想定としてはgithub上にホストしているOSSプロジェクトのソースツリーをCIの対象とします。OSSのpublicリポジトリなため、無料で使えるサービスを利用対象とします。
紹介する各CIサービスすべてでGo言語を扱えますが、まず最初にサービスを利用する上で各サービスについて結論から述べます。その後、各CI環境(OS、Goバージョン)、設定ファイルの例を説明します。
今回はTravis CI、CircleCI、Codeship、AppVeyor の4つのサービスを紹介します。
結論から
結論から書きますと、Linux, OS X, Windowsの各種OSプラットフォームで同時にCIを動かしたいなら、Travis CI(Linux, OS X), CircleCI(Linux), AppVeyor(Windows)のような構成で利用するとよいでしょう。Travis CIはMulti-OS Featureがあるため、1つの設定ファイルでLinuxとOS XでCIを同時に実行できそうです。
Travis CIとCircleCIはどちらも同じくらい設定は簡単そうに見えます。Travis CIのほうが老舗でCircleCIは設定記述がモダンな印象があります(CircleCIの公開日を調べていませんが…)。CircleCIは所々モダンさを感じるところですが(設定記述の省力化)、かえって設定が省略されすぎており、また、ドキュメントから設定方法が探しづらい面もあります。その点のバランス加減は、採用者の好みがわかれるところでしょう。また、Travis CIはsudoコマンドが扱えるため、追加のバイナリパッケージをインストールできたりするのが便利かもしれません。ここはTravis CIがVMとコンテナ型の両方の形式をサポートしている強みです。
Codeshipはビルドログが非公開な点がOSSには向いてなさそうです。また、使い方・環境情報のようなドキュメントが他サービスと比べて少なく、比較したり調べづらいです。具体的にはCIの実行環境情報が少ないのが難しいところです。
Windowsも使うならAppVeyorがあります。必要そうなソフトウェアはおおよそ揃っているように見えます(Installed Software)。実行環境は64ビットCPU(x64)ですが32ビットバイナリも提供されています。他サービスとの細かい比較はしていませんが、必要十分な機能が揃っていると感じました。
特徴としてはTravis CIはVMベース/コンテナ型の両方を採用してるようです。CircleCIはコンテナ型、CodeshipはDockerらしい記述がドキュメントから見つかります。AppVeyorは特に見ていませんが、WindowsなのでVMベースみたいですね。
各サービスいずれも、ビルド結果の通知にはE-Mailやチャット(Slack、HipChat)などに対応しているようです。
Goリポジトリのサンプル
設定ファイルは後に貼り付けますが、リポジトリ及びバッジ(ビルドステータス)などを確認したい場合は以下のリポジトリを参照してください。わざとテストが失敗するようなコードを書いています。
- 各CIの設定ファイルを読みたいならこちら(.travis.yml, circle.yml, appveyor.yml, README.mdなど)。いくつかブランチも切っています
- 実行結果を見るならこちら
各サービスの提供OS環境
Linux、Windowsらの実行環境のCPUは64ビット(x86_64)の様子で、AppVeyor(Windows)は32ビット用のバイナリも提供しています。
Travis CIのOS Xのバージョンは調べていません。また、CircleCIはモバイル環境としてiOS, Androidに対応しています(Goへの対応は未確認です)。
サービス | サポートOS |
---|---|
Travis CI | Ubuntu 12.04 LTS, OS X, Ubuntu Trusty (beta) |
CircleCI | Ubuntu 12.04 LTS, iOS, Android |
Codeship | (おそらく)Ubuntu 14.04 |
AppVeyor | Windows Server 2012 R2 |
OSSにおけるリポジトリ数の制限
気になる、無料で扱えるリポジトリ範囲についてまとめます。AppVeyorが若干不明瞭ですが、基本的に無料プランではOSS(githubのpublicリポジトリ)に対するリポジトリ数は無限のようです。その代わり、ビルドの同時実行数が1であるといった制限があるようです。各サービス名にPricingへのリンクを張ったため、そちらや利用規約等を参考にして利用させてもらえればよいと思います。
サービス | 制限 |
---|---|
Travis CI | OSSは無料(リポジトリ数は無制限) |
CircleCI | OSSは無料(リポジトリ数は無制限) |
Codeship | OSSは無料(リポジトリ数は無制限) |
AppVeyor | OSSは無料 |
Go及びcgoの対応状況
最新状況と最新版についてのみ記述します。より古いGoのバージョンに対応しているかは各サービスのドキュメント等を参照してください。また、各環境ともcgoが使えることを確認しました。
サービス | バージョン | cgoが使えるか |
---|---|---|
Travis CI | 1.4.2 (beta: 1.5.1) | 使える |
CircleCI | 1.4系 | 使える |
Codeship | 1.4系 | 使える |
AppVeyor | 1.5.1, 1.4.2 | MSYS/MinGWと一緒に使えるのを確認 |
各サービスの設定例
各サービスとも、サインアップはgithubアカウントで行うことができます。自分の所属しているチームのリポジトリもしくは自分のリポジトリをCI対象として設定することができます。
Travis CI
下記のように記述した .travis.yml をリポジトリのトップに置きます。
language: go go: 1.4 notifications: email: false before_install: - go version install: - go get -t -d -v ./... - go build -v script: - go test -v -race ./...
CiecleCI
下記のように記述したcircle.ymlをリポジトリのトップに置きます。
machine: timezone: Asia/Tokyo
テストの設定をデフォルトのものから、自分で記述するものに置き換えたい場合は下記のようなセクションを追加してコマンドを記述します。
test: override: - go test -v -race ./...
Codeship
設定はウェブのUI上から行います。他サービスのようなYAMLファイルは記述しないようです。
AppVeyor
下記のように記述したappveyor.ymlをリポジトリのトップに置きます。cgoで32ビット用にするときは “C:\msys64\mingw64\bin” を “C:\msys64\mingw32\bin” に置き換えるとよいでしょう(実行未確認です。また、PATHにGo 32ビット版のパスを設定する必要もあります)。AppVeyorのウェブの設定画面からは、YAMLファイルをやめてBATファイルやPowerShellを実行するよう設定することもできそうなUIも見られました。
version: "{build}" os: Windows Server 2012 R2 clone_folder: c:\gopath\src\github.com\suma\ci-test-golang environment: GOPATH: c:\gopath install: - set PATH=C:\msys64\mingw64\bin;%PATH% - echo %PATH% - echo %GOPATH% - git submodule update --init --recursive - go version - go env - go get -v -t -d ./... build_script: - go test -v -race ./...
終わりに
Travis CI、CircleCI、AppVeyorが良さそうであるということ、各サービスの設定例・環境情報(Goバージョン、cgoへの対応)などを紹介しました。詳しくは最初に書いた通りです。
ビルドしたバイナリからのデプロイもしくはパッケージング、カバレッジの取得、ビルド通知方法、並行ビルド(Build MatrixやParallel Testなどと呼ばれる)など書きたいトピックはたくさんありますが、まだ試しきれていないため今回はここまでにしたいと思います。
カバレッジについては、coverallsというサービスががよさそうだと目星をつけています(Chainerでも使用しているようです)。