はじめに
みなさんはローカルの開発環境はdocker-composeで管理していますか?
私はもう新しく作っているプロジェクトは全て、docker-composeで作っています。
imageを指定して簡単に起動でき、サービス間の通信もdepends_onで指定するだけでOKなのはすごく助かります。
CircleCIではv2になってからDockerをサポートするようになり、簡単にサービスを立ち上げることができるようになりました。
そこで感じたのが、開発環境で使っている docker-compose.yml
をそのままCircleCIでも使用できれば、わざわざCircleCI用の定義を書かなくてよくなるのでは?、ということです。
結果
できました。つまり、 開発環境=テスト環境(CircleCI上)を実現できました!
これで、開発環境とテスト環境でのサービス(MySQL etc)のバージョンが違ったとか、開発環境だとうまく動くのにテスト環境だとうまく動かないっていうのがなくなると思います!
公開しているリポジトリに実際のCircleCIのconfigがあるので、興味がある方は使用してみてください。
行ってるステップは以下の通りです。
- docker composeをインストールし指定の場所にファイルを移動させます
- いつも通りdocker composeを起動させます
- 一度stopさせているのは、原因はよくわからないんですが一回目の起動時は、うまくサービスが起動できないからです
- 二度目の起動を行います
- rspecを実行します
- docker composeをdownさせます
version: 2
jobs:
build:
machine:
image: circleci/classic:edge
working_directory: ~/repo
steps:
- checkout
- run:
name: Install Docker Compose
command: |
curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
chmod +x ~/docker-compose
sudo mv ~/docker-compose /usr/local/bin/docker-compose
- run:
name: docker-compose up
command: |
set -x
docker-compose up --build -d
- run:
name: docker-compose stop
command: |
set -x
docker-compose stop
- run:
name: docker-compose up
command: |
set -x
docker-compose up -d
- run:
name: test
command: |
mkdir /tmp/test-results
TEST_FILES="$(circleci tests glob 'spec/**/*_spec.rb' | circleci tests split --split-by=timings)"
docker-compose exec rails_api bin/rspec --format progress \
--format RspecJunitFormatter \
--out /tmp/test-results/rspec.xml \
$TEST_FILES
- run:
name: docker-compose down
command: docker-compose down
まとめ
これでまた一つ管理することが減ったので、DXの改善になったのではないでしょうか!是非、お試しください。