CircleCI

先日素振りがてら、個人の小さな Rails リポジトリを Dockerize しました。
https://github.com/masutaka/github-organization-watcher/pull/45

現在クローズドβの CircleCI 2.0 は Docker 前提らしいので、これも素
振りがてら移行してみました。
https://github.com/masutaka/github-organization-watcher/pull/48

CircleCI 2.0 はここから申請すれば、すぐ使えるようです。
https://circleci.com/beta-access/#request-access

移行前の印象

(1) 1.0 では宜しくやってくれたけど、2.0 は circle.yml に全部書く必
要があるみたい。面倒そう。

(2) とは言え、Dockerfile や docker-compose.yml があるし、ちょっと
やれば動くだろう。

(3) Alpine Linux の Docker Image 使えば、1.0 よりは速くなるのかな。

移行後の感想

(1) 予想に違わない面倒くささ・・・! オートマがマニュアルになった感じ。

(2) 使えませんでした /(^o^)\ 参考にはなったけど。

(3) 速い・・・!!!(移行前: 01:38 、移行後: 00:30
両方ともキャッシュあり状態です。Alpine Linux もそうかもしれないけ
ど、とにかくキャッシュのリストアが速かったです(後述)。あと、
CircleCI のビルドが全体的に高速です。

circle.yml

circle.yml は 1.0 から 2.0 に移行して、このようになりました。同じ
ディレクトリにある Dockerfile や docker-compose.yml は使っていません。
https://github.com/masutaka/github-organization-watcher/pull/48/files

docker-compose を使うことも出来るそうなので、あとで試すかも。
Using docker-compose - CircleCI

実装の流れ

2.0 はローカルで circleci コマンドが使えるので、インストールします。
Running Jobs Locally - CircleCI

circleci コマンドはこの Docker イメージのラッパースクリプトでした。
Dockerfile は公開されていないようです。
https://hub.docker.com/r/circleci/picard/

checkout や restore_cache など、一部の命令はスキップされますが、
だいたい同じように動きます。

この辺を参考にしながら、実装していきました。
https://circleci.com/docs/2.0/
https://circleci.com/docs/2.0/language-ruby/

ローカルで試していた時は “apk add” が遅くて、Docker Hub に CI 専用
のイメージを置いて使ってましたが、CircleCI 上だと気にならないくら
いの速さだったので、今は ruby:2.4.0-alpine をそのまま使っています。

ハマったところ

Downloading cache archive…
Unarchiving cache…
Error untarring cache: exit status 1

restore_cache で↑これが発生して ハマりました。

どうやら、Alpine Linux だと、tar と gzip がなくて失敗するそう です。
インストールしましょう。

ここに必要なコマンドが書いてありました。はい、マニュアル読め奴ですね。
Building Custom Images for Docker Executor - CircleCI

キャッシュはこの辺りが参考になりました。ありがとうございます。

すごいと思ったところ1

circle.yml にはこのように指定しました。

docker:
  - image: ruby:2.4.0-alpine
    environment:
      RDB_URL_BASE: postgres://postgres:@localhost
  - image: postgres:9.5-alpine

起動されたコンテナには Ruby が入っており、PostgreSQL も起動してい
るように見え、どうやっているんだろうと思っていたら、

Choosing an Executor Type - CircleCI

It’s also possible to specify multiple images. When you do this,
all containers will run in a common network. Every exposed port
will be available on localhost from a primary container .
(snip)
In a multi-image configuration job, steps are executed in the
first container listed (main container).

最初に書いたイメージがプライマリとして起動されるようです。Every
exposed port … とか書いてあるので、PostgreSQL も起動しているよう
に見えたのは気のせいだったのかな…?

すごいと思ったところ2

キャッシュした /usr/local/bundle のリストアがめっちゃ速いです。

Restore bundler cache のところ見ると、たったの 2 秒です。
https://circleci.com/gh/masutaka/github-organization-watcher/172

まとめ

  • CircleCI 2.0 は高速だった
  • circle.yml に全部書く必要があるのは面倒
  • Dockerize の次にやるには良いお題

追記(2017-04-14):
Docker イメージもキャッシュさせてみました。
https://github.com/masutaka/github-organization-watcher/pull/49

このリポジトリだと高速化の恩恵はありませんでしたが、高速化のために
CI 用の Docker イメージを用意するくらいになると効果あると思います。

追記(2017-04-16):

Warning: Either git or ssh (required by git to clone through SSH) is
not installed in the image. Falling back to CircleCI’s native git
client but this is still an experiment feature. We highly recommend
using an image that has official git and ssh installed.

checkout step で上記 Warning が出ていたので、修正しました。
https://github.com/masutaka/github-organization-watcher/pull/52

Required tools である git と ssh client をインストールすることで、
いい感じのシェルスクリプトが使われるようです(詳細は上記 PR 参照)。