アプリケーションをfig化すると
fig upするだけで同じ環境をすぐに構築することが出来ますよね。
つまり、CIでテストする環境もfig使うとそのまま動くのでは…と思い試してみました。
fig / Droneについてのref
構成概要
OSS版Droneを利用します。
Droneのscript内で普通にfigを実行し、
動的にDockerコンテナ起動した上でテストを実行しています。
Dockerコンテナは普通にDroneと同じく、ホストOS上にコンテナを起動しています。
サンプルプロジェクト
https://github.com/toritori0318/drone-fig-ci-sample
上記は fig公式 のサンプルアプリケーション+テストファイルを追加したものです。
fig run.... で直接テストを実行出来るようにしています。
.drone.yml
DOCKER_HOST はホストOS上で実行されているDockerのホストIPを指定します(ifconfigで確認しましょう)。
また、 FIG_FILE ではdrone用に少しだけカスタマイズしたfig.ymlを利用しています。
理由は後述。
image: toritori0318/dockerfile-fig
env:
- PATH=$PWD/bin:$PATH
- DOCKER_HOST=tcp://xxx.xxx.xxx.xxx:4243
- FIG_FILE=fig-drone.yml
script:
- echo 'start!'
- fig ps
- fig build web # docker buildを行う
- fig up -d # dockerコンテナ起動
- fig run --rm web make test-unit # テスト実行
- fig stop # コンテナ停止
- fig rm --force # コンテナ削除
- echo 'end!'
fig-drone.yml
volume同期を行うとエラーになってしまうので、volume部分をコメントアウトしています。
アプリケーションコードは Dockerfile でAddしたものをそのまま利用しています。
CIするだけなので同期する必要は無いですしね。
web: # サービス名です。この名前でコンテナにアクセスできます
build: . # ./Dockerfileを用いビルドする
command: python app.py # ビルド後のコンテナで実行するコマンド
ports:
- "5000:5000" # ポートフォワード設定。フォーマットは <ホスト側ポート>:<コンテナ側ポート>
# volumes:
# - .:/code # ボリューム設定。ローカル「.」を コンテナ「/code」に同期
links:
- redis:redis # リンク設定。フォーマットは <サービス名>:<エイリアス名>
environment:
- PYTHONPATH=./
redis:
image: redis
実際に行ってみて良いと思ったところ
ローカルの環境がそのまま動く
ローカルでDockerコンテナ起動してテストした環境が
なにもせずともCIでほぼ同じ環境で動かせる、というのは良いですね。
クラスタを考慮した環境も簡単に用意できる
単体のアプリケーションだけでなく、figで複数クラスタを起動して
全体の受け入れテストを動かしてみる、ということも可能です。
毎回きれいな環境で動かせる
Dockerコンテナなので、毎回一からきれいな環境を(しかも高速に)構築しつつ
CIを回せるのは◯。
実際に行ってみてイマイチと思ったところ
Drone用のfig.ymlを用意する必要がある(かもしれない)
ローカルで開発するときにはファイル同期したいのでvolumesを指定すると思いますが
Drone上から実行するとエラーになってしまいます。
そのため別にfig.ymlファイルを用意する必要がありますが、それが多少面倒かも。
(figファイル一枚だけで済むと考えれば、それはそれで楽なのですが)
途中でエラーになったときにゴミコンテナが残る
figコンテナ起動後にテストエラーになったりfigエラーになったりするとゴミが残ります。
一応、cronなどで定期的にコンテナをクリーンにする、という方法で回避できます。
テストの詳細が表示されない
現時点の方法だとDroneのログ上にテストの詳細が表示されないので、
テスト失敗時に原因がわからないという…(割とクリティカル)
もしかしたら回避する方法があるかもしれないので、もう少し模索してみます。
まとめ
Drone+figでCIテストする、というのを試してみました。
せっかくfigでポータブルに環境構築できるので
それをほぼそのまま利用しつつCI出来たらいいな〜、と思いました。
上記に上げたようにいくつか課題も残っていますが、
もう少し検証し使えるところまで持って行けたらな〜と考えています。