GitHub + CircleCIで継続的インテグレーション

前回の記事で、golangユニットテスト方法について述べた。現在ではコードを書くとユニットテスト、ビルド、統合テスト、デプロイなどを自動的に実行するCI(継続的インテグレーション)が重視されている。CIツールにはJenkinsが有名であり、CIサービスとしてはTravisCIが有名だろうか。ここでは無料で始めることができるCircleCIというサービスを利用する方法を述べる。ソースコード管理も無料で始めることができるGitHubを使うものとする。

GitHubに公開リポジトリを作るところまではググってください。今回は前回の記事のサンプルコードのfoo.goとfoo_test.goを引き続き使う。これらをGitHubの新規リポジトリにpushしておく。次はCircleCIでSign upする。GitHubアカウントでOAuthするのでこちらで新規にアカウントを取得する必要は無い。GitHubアカウントでログインするとリポジトリ選択画面が出るので選択すると即座にCIが実行され始める。以降、GitHubにpushするとそれがトリガーになりCIが走る。結果は次のように成功/失敗がダッシュボードに表示される。

f:id:matsum_go:20160413133010p:plain

CircleCIでは実行リソースをコンテナという単位で割り当てており、無料では1コンテナまで使用可能。実行性能を引き上げたければ有料で追加コンテナを購入する必要がある。

先ほどfoo.goとfoo_test.goのみをcommit&pushした状態に対してCIが実行されると結果はFailedとなる。CIの内容はブランチトップ階層にcircle.ymlというファイルを置くと指示できる。無ければデフォルトの定義で実行するようだが基本的には失敗するので、circle.ymlを自分で定義する必要がある。

circle.ymlのサンプル

machine:
  timezone:
    Asia/Tokyo

checkout:
  override:
    - git clone https://github.com/MatsuGitHub/MpegTsAnalyzer.git
    
test:
  override:
    - cd MpegTsAnalyzer
    - go test -bench . -benchmem

machineとかdependenciesの項目に公式サイトの説明によると次のようになっている。

machine: adjusting the VM to your preferences and requirements
checkout: checking out and cloning your git repo
dependencies: setting up your project’s language-specific dependencies
database: preparing the databases for your tests
test: running your tests
deployment: deploying your code to your web servers

machineの定義は独特だがcheckout~deploymentは単にコマンドを羅列するだけで、checkoutからdeploymentに向かって順に実行されていくだけに見える。どのコマンドをどこに記述するかは迷うこともあるかもしれない。
overrideはデフォルト定義を上書きする。他にpreやpostという定義ができ、preはoverrideの処理の前に、postはoverrideの処理後に実行される。それ以下にはコマンドを羅列する。今回はgit cloneでソースを引っ張ってきてgo testコマンドを実行するだけとした。CircleCIはJenkinsなどと同じく、過程のどこかで戻り値に0以外の結果が返ってくると失敗とみなす。