年中アイス

いろいろつらつら

CircleCI 2.0でGoのテスト触ってみた

CI周りを触ってみている中で、Dockerイメージが動くようになったという、CircleCI 2.0が気になったので触ってみました。ちなみに1.0も触ったことはないです。参考で見たページだと、2.0はBeta版の時期もありましたが、今は正式にリリースされています。

circleci.com

cstoreで試してみる

適当なプロジェクトとして、cstoreに入れてみることに。cstoreは、ライブラリとしてシンプルなのと、たまたまちょっとテスト書いてあったのでお試し対象に。

  • CircleCIで、Add Project -> .circleci/config.ymlがなくて失敗
  • プルリクで追加 -> 成功

の予定でしたが、Add Projectしたら、CircleCI1.0モードで動いて、一通りGoで行われるべきことが動いていました。1.0はCircleCI用の設定ファイルおかなくても、言語指定すると、ベースとなる動作(dependencyのgo get, go test ,go buildなど)が勝手に動くようです。これはこれで、ベースができてていいですね。

2.0は今の所、実行コマンドは自分で記述する必要があります。cstoreはライブラリかつ依存はシンプルだったので、go getしてgo testをやるだけの設定を作りました。

https://github.com/reiki4040/cstore/pull/2 https://github.com/reiki4040/cstore/pull/3

version: 2
jobs:
  build:
    working_directory: /go/src/github.com/reiki4040/cstore
    docker:
      - image: circleci/golang:1.9
    steps:
      - checkout
      - run: go get github.com/BurntSushi/toml
      - run: go get gopkg.in/yaml.v2
      - run: go test -v -race ./...

circleci CLIで事前確認ができるのをすっ飛ばして、プルリクしてマージして、インデントミスっているという愚。go getの追加とともに修正したのでプルリクが二つに分かれてます。

ローカルで事前確認

CircleCI 2.0はCLIを使って事前にテスト実行ができます。 インストールは公式参照

まず作成したconfig(.circleci/config.yml)をチェック。

circleci config validate

そのあと、ローカルでのテストビルド。

circleci build

実際にdocker imageを落としてきて実行してくれます。circleci/golangの1.9は400MBぐらいありました。

これを行えば、事前にチェックして、しょうもないミスは防げると思います。*1

ビルド結果

CircleCIサービス上のビルド結果は、誰でも見える*2ので、機密情報が出るようなのは避けましょう。そもそも書いてあったらPublicリポジトリの時点でアウトですが、何か外部から取ってきて出力みたいなのがあると、デバッグのつもりで漏洩しちゃいます。privateリポジトリは、見えないと思いますが扱ってないのでわからず。

通知

メールでビルドに関しての通知がきますが、Slackなどへの連携も可能です。 すべて通知するか、失敗(fail)と失敗後の成功(fixed)のみを通知するかを選べます。

Goのサンプル試して誤プルリクをやらかす

最初、公式のGoのサンプルを試してみてたんですが、fork後にコード少し改変して動かしてみるかーと思って、適当にやってたら、いつの間にか公式サンプルにプルリク出してしまっていました。びっくり。一言書いて、closeしました。

たぶんですが、CircleCIの画面上に、open pull requestと言うボタンがあり、不意にそれを押してしまって、自動でプルリクが作成されたのかなと。同様のことをしてしまったであろう人もいました。

料金

料金ページには、Linux向けは、1コンテナのシリアル実行で、月1,500分(25時間。30日で割ると約50分ぐらい)までのビルドであれば、ユーザやリポジトリの数を問わず無料(Freeプラン)で、ビルド時間が無制限になる有料プランは、$50/Month(2コンテナ, 2並列から)からのようです。*3

感想

Goでテスト書いて、それを実行するぐらいは簡単にできますね。Github認証で、すぐ試せるのも楽です。

前のCodeBuildでは、buildspec.ymlに実行する内容があり、動かすイメージはCodeBuild側の設定でした。CircleCIは、実行イメージと実行内容を.circleci/config.ymlに書いて、CircleCI側で実行マシンのスペック設定、実行の確認で少し異なります。今時点では使い込んでないので、どちらがどういいのかまでは、あまりわからず。

公式のGoサンプルでは、Goをビルドしてバイナリを作って、PostgreSQLのイメージとともに起動してテスト実行みたいな感じで作ってあったので、go testのコード単体ではなく、バイナリに対しての挙動テストも実行できるようです。*4

設定ファイル(.circleci/config.yml)が、docker composeと実行スクリプト的な役割になる感じなので、結構いろんなことができそうです。この他のコンテナを起動したりといった辺りは、CodeBuildにはないですね。

workflowの機能も付いているようなので、それも試してみたいところですが、とりあえずここまで。

参考

*1:CLIで完全にエミュレートできるのかは不明ですが、、、

*2:README.mdなどに付けられる、CircleCIのバッジからのリンク先

*3:publicリポジトリにCircleCIつけて、プルリクでsleepかけるテスト入れられて1500分超えたら、どうなるんだろ?

*4:Freeプランの1コンテナだと、サンプルはビルド+PostgreSQLのコンテナで2個になりそうですが、動くのかな・・・?