CircleCI 2.0でGoのテスト触ってみた
CI周りを触ってみている中で、Dockerイメージが動くようになったという、CircleCI 2.0が気になったので触ってみました。ちなみに1.0も触ったことはないです。参考で見たページだと、2.0はBeta版の時期もありましたが、今は正式にリリースされています。
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の機能も付いているようなので、それも試してみたいところですが、とりあえずここまで。