amakanのCIをShippableに移行した
https://amakan.net/ のこの辺の改善の続き。
- amakanをUnicornからPumaに移行した - ✘╹◡╹✘
- amakanでyarnを使うようにした - ✘╹◡╹✘
- amakanでRuby 2.3.3を使うようにした - ✘╹◡╹✘
- amakanを Ruby 2.3.3 から 2.4.0-preview3 に移行した - ✘╹◡╹✘
- amakanのフロントエンドを色々改善した - ✘╹◡╹✘
- amakanをSidekiqに移行した - ✘╹◡╹✘
- amakanの開発環境をDockerに移行した - ✘╹◡╹✘
- amakanの本番環境をDockerに移行した - ✘╹◡╹✘
- amakanをDocker化した感想 - ✘╹◡╹✘
CircleCIからShippableに移行した
amakanをDocker化した感想 - ✘╹◡╹✘ で触れた「CIのビルドに時間が掛かるようになった」という問題に対応するため、利用するCIサービスをCircleCIからShippableに移行した。他の候補としてTravisCI、Werckerなどを見たけれど、ShippableはDockerのキャッシュに上手く対応しているということで、これを選択した。
ビルドに掛かる時間が500秒から60秒になった
CIの中では、こういうことをやっている。
- Node.js用のDockerイメージをビルドする
- Node.js用のDockerイメージでテストを実行する
- Node.js用のDockerイメージでCSSとJavaScriptを生成する
- Rails用のDockerイメージをビルドする (直前で生成したCSSとJavaScriptを含めつつ)
- Rails用のDockerイメージでテストを実行する
- Rails用のDockerイメージをAmazon ECRにPushする
CircleCIからShippableに移行したことで、過去にビルドしたDockerイメージのキャッシュが再利用できるようになったので、それぞれのDockerイメージをビルドする部分が一瞬で終わるようになった。
Volumeを使おうとすると複雑
上述の処理を実現するために、これまで --volume $(pwd)/public/assets:/app/public/assets
というオプションを利用していたが、--volumes-from ${SHIPPABLE_CONTAINER_NAME}
というようにデータボリュームを用意する方法に変更する必要があった。--volume
オプションを指定してもホスト側とは何も共有されない (エラーも出ない) という挙動を元に原因を調べるのに時間が掛かった。
UIが分かりづらい
他のCIサービスと比べると、UIが見づらくて使いづらい。良い機能を提供していると思うので、余計に勿体無く感じる。
無料ではプライベートリポジトリは1つまで
無料では1つまでしかプライベートリポジトリが利用できないので、高速化したいamakanだけとりあえずShippableで運用してみている。
設定例
amakanのshippable.ymlです。
language: nonebuild:pre\_ci\_boot:options: -v /app/public/assets ci:- export DOCKER\_TAG=${ECR\_REPOSITORY\_URL}:${BUILD\_NUMBER} - docker build --file ./docker/node/Dockerfile --tag amakan\_node . - docker run amakan\_node yarn run test - docker run --volumes-from ${SHIPPABLE\_CONTAINER\_NAME} amakan\_node yarn run build - cp /app/public/assets/\* public/assets/ - docker build --file ./docker/rails/Dockerfile --tag ${DOCKER\_TAG} . - docker run ${DOCKER\_TAG} bundle exec rake test post\_ci:- \> if [["${BRANCH}" == "master"]]; then sudo docker push ${DOCKER\_TAG} fiintegrations:hub:- integrationName: ecr type: ecr region: ap-northeast-1 branches:only:- master notifications:- integrationName: email type: email on\_success: never on\_failure: never on\_pull\_request: never - integrationName: slack type: slack on\_failure: always on\_success: always recipients:- "#shippable"