Friday I/O です。
株式会社ワムウでは、毎週金曜日は 興味がある事柄に取り組み、その成果を何らかの形でアウトプットする日 としております。
はじめに
弊社ではローカル開発環境の構築に Docker
, Docker Compose
を主に使用しています。
最近他社の開発者の方と共同で開発を行う仕事が増えてきたので、Github とCircleCi を連携させて自動テストするようにしています。こうすることでテストが通ったコードだけ master へマージすることができるようになり、コード品質の担保につながります。
これまでのCircleCIでのテスト
これまで 案件を進める流れで CircleCI を利用する場合、
- ローカルでDocker開発環境構築
- CircleCI マシンで疑似テスト環境構築
と CircleCI のマシンでもまた環境構築するの?
と二度手間でしたが、
CircleCI 2.0 からジョブにDockerが使えるようになりました。
環境構築はDocker にまかせてCI側でビルド・テストできると便利だよねーということでやりました。
アプリケーションの構成
項目 | 名称 | バージョン |
---|---|---|
Language | PHP | 7.1 |
Framework | Laravel | 5.4 |
DB | MySQL | 5.7 |
こんな感じの構成でCircleCI上でビルド・テストします。
PHPと、MySQLは公式のDockerイメージを使用します。
結果
.circleci/config.yml
の記述は以下のような記述で環境の構築・テストすることができました。簡単。
---
version: 2
jobs:
build:
machine: true
steps:
- checkout
- run:
name: Build Docker Image
command: docker-compose build
- run:
name: Run tests
command: |
docker-compose run app-servie-name /bin/bash -c '\
cp .env.example .env && \
composer install --no-interaction && \
php artisan key:generate && \
./artisan migrate:refresh && \
./vendor/bin/phpunit -c phpunit.circle.xml'
何をやっているかポイントとなる部分を説明をすると
-
machine: true
CircleCI のVMを指定しています。ここの指定でDockerのイメージを指定することも可能ですが、その場合 volume のマウントができないためCircleCI のVM内でDocker を立ち上げるようにしています。 -
Run tests
内の記述について
ここではテストをしたい、コマンドの返りが欲しいので
docker-compose run {service-name} /bin/bash -c
でコンテナを起動します。
以降の処理はLaravelのお話で、アプリケーションのセットアップ、テストまでをずらっと書いてます。 -
phpunit.circle.xml
について
Laravel にphpunit.xml
が存在するのでコピーをして作成したものです。
xml内では、docker-compose.yml で指定しているDB名と同じDB名を記述する必要があります。
MySQL公式のDocker イメージが、起動時にDBが存在しない場合にMYSQL_DATABASE
環境変数の値でDBを作成するので、作成されたDBをテストDBとして利用するようにしました。
以下にサンプルファイルを用意したので参考までに
問題点
上記のCircleCIの設定だとDockerイメージのビルドに時間がかかるので
CircleCIが提供するキャッシュ機能について来週書きます。