基本情報
CI向けのサービスは2種類ある。
Codeship Basic
TravisやCircle CIと同様のサービス。ちなみに私は使ったことない。他のCIツールと同様で、Codeship用のデプロイ設定ファイルをリポジトリに追加して実行する。
Codeship Pro
docker composeとほぼ同様の設定ファイルと、CIのタスクを記述するファイルをリポジトリに追加する。docker composeで開発している人にとってはラーニングコストが低い。
料金
改定されるかもしれないが、2017/03/07現在だと下記の通り。
Codeship Basic
https://codeship.com/pricing/basic
Codeship Pro
https://codeship.com/pricing/pro
両方ともにPrivateリポジトリは月100ビルドまでは無料。Open Sourceプロジェクトも制限なし。なので、気軽に試してみることが出来ます。月初めにビルド数はリセットされます。
Codeship Proの使い勝手
ざっくりした感想です。Codeshipの設定ファイルサンプルは一番下にリンクを置いておくので見たい人はどうぞ。
良かった所
- dockerエンジンのバージョンが比較的新しい。2017年3月7日現在で1.12.6
- composeで作成した開発環境と同じものをCIで使える
- プロジェクトの作成や設定UIは十分に分かりやすい
- コンテナイメージのビルドキャッシュが使えるので、短時間でビルドできる
悪かった所
- composeの文法で使えないものが多い。参考
- コンテナの相互参照が難しい
- composeがv2文法に未対応
- コンテナのアップタイミングを制御する方法がない
良かった点については、特に説明不要かと思います。悪かった点について突っ込んで解説します。
コンテナの相互参照が難しい
Codeship Proのcomposeはv1なので、コンテナ間で参照を行う場合は links
を使います。そのため、循環した参照が必要になる場面でエラーが発生してしまいます。
1 | $ docker-compose up -d |
composeのv1で相互参照するには、Ambassador patternを使う手があります。これをやるには container_name
の設定が必要なのですが、Codeship Proの未対応コマンドリストに載っているので無理ポ。
自分の場合はseleniumを使ったテストでしたが、普通にやると循環参照が発生してしまいます。下図のバツ印のlinksが出来ないとテスト出来ません。
悩んだ結果、テスト用にコンテナを複製することで、循環参照問題をクリアしました。
コンテナのアップタイミングを制御する方法がない
Codeship Proでは、インフラの設定ファイルcodeship-services.yml
とCIプロセスを記述する codeship-steps.yml
の2つがあります。CIプロセスは、対応するサービスがアップ次第実行されるので、serviceに依存関係があるとCIプロセスの実行が失敗してしまいます。しかも、composeの文法がv1でdepends_on
が使えないため、serviceの立ち上がりを待たせることが出来ません。
下記は私がやった方法ですが、CIプロセスとしてテストを実行する前に、実行に必要なサービスのダミーのCIプロセスを記述することで、テストの実行前に依存関係のあるコンテナが立ち上がるのを待ちます。
1 | - type: serial |
ただし、もう1つ問題があってserviceがアップしてもservice内のプロセスが実行OKな状態になるまでには、タイムラグがあるので、serviceが立ち上がったとしても実行NGになる可能性があります。そこで別途タスクランナーのshellを作成してcurlで対象serviceの対象プロセスが実行待ちになることを確認するようにしました。
まとめ
色々とツラミはあるのですが、composeのv2もロードマップに載っているということなので、しばらく使ってみようと思っています。また新しい情報が出たら試してみます。