LoginSignup
15
16

More than 5 years have passed since last update.

Drone+fig でCIテストしてみる

Last updated at Posted at 2014-11-24

アプリケーションを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を利用しています。
理由は後述。

drone.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するだけなので同期する必要は無いですしね。

fig.yml
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出来たらいいな〜、と思いました。

上記に上げたようにいくつか課題も残っていますが、
もう少し検証し使えるところまで持って行けたらな〜と考えています。

15
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
16