Codeshipについてのまとめ

2017-03-08
Docker
Codeship

https://codeship.com/

基本情報

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
2
$ docker-compose up -d
ERROR: Circular dependency between ... and ...

composeのv1で相互参照するには、Ambassador patternを使う手があります。これをやるには container_name の設定が必要なのですが、Codeship Proの未対応コマンドリストに載っているので無理ポ。

自分の場合はseleniumを使ったテストでしたが、普通にやると循環参照が発生してしまいます。下図のバツ印のlinksが出来ないとテスト出来ません。

Circular dependecy

悩んだ結果、テスト用にコンテナを複製することで、循環参照問題をクリアしました。

Normal dependecy

コンテナのアップタイミングを制御する方法がない

Codeship Proでは、インフラの設定ファイルcodeship-services.yml とCIプロセスを記述する codeship-steps.yml の2つがあります。CIプロセスは、対応するサービスがアップ次第実行されるので、serviceに依存関係があるとCIプロセスの実行が失敗してしまいます。しかも、composeの文法がv1でdepends_onが使えないため、serviceの立ち上がりを待たせることが出来ません。

下記は私がやった方法ですが、CIプロセスとしてテストを実行する前に、実行に必要なサービスのダミーのCIプロセスを記述することで、テストの実行前に依存関係のあるコンテナが立ち上がるのを待ちます。

codeship-steps.yml

1
2
3
4
5
6
7
8
9
10
11
12
- type: serial
name: deployment
steps:
- name: nginx
service: nginx
command: echo up
- name: selenium
service: selenium
command: echo up
- name: dusk
service: test_runner
command: sh run_test.sh

ただし、もう1つ問題があってserviceがアップしてもservice内のプロセスが実行OKな状態になるまでには、タイムラグがあるので、serviceが立ち上がったとしても実行NGになる可能性があります。そこで別途タスクランナーのshellを作成してcurlで対象serviceの対象プロセスが実行待ちになることを確認するようにしました。

run_test.sh

まとめ

色々とツラミはあるのですが、composeのv2もロードマップに載っているということなので、しばらく使ってみようと思っています。また新しい情報が出たら試してみます。