Docker + Travis CI で Codeception CI をしよう に引き続きの Travis CI ネタです。
EC-CUBE3 では、 Travis CI を使用して、ユニットテストを自動化しています。
どんなことをするかは .travis.yml に書かれていますが、コメントも乏しいので解説してみます。
各セクションの解説
git
git:
submodules: false
現在は、 git submodule を使用していないのですが、 submodule を取得しないよう、念のために false としています。
language
language: php
PHP のテストをしたいので php を指定しています。
cache
cache:
directories:
- vendor
- $HOME/.composer/cache
テストの準備を高速化するため、主に Composer 関連のファイルをキャッシュしています。
php
php:
- 5.3
- 5.4
- 5.5
- 5.6
- 7.0
- 7.1
PHP5.3.29 〜 7.1.x でテストを実行する設定です。
EC-CUBE3系 の最低動作環境は PHP5.3.9 ですが、 Travis CI ではサポートされないバージョンとなってしまいました。
matrix
Build matrix セクションは、PHP のバージョンや環境変数を掛け合わせてテストする設定です。
順番に解説します。
fast_finish
fast_finish: true
いずれかのテストに失敗したら、すぐにテストのジョブを失敗とマークする設定です。
include
include:
- php: 7.0.12 # for coverrage
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
sudo: required
dist: trusty
個別にテストに含める設定を記述します。
ユニットテストの実行後、 Coveralls を使用して、テストカバレッジを計測するための設定です。
phpdbg を使用してカバレッジレポートを出力 するのですが、 Travis CI では Ubuntu Trusty のイメージ を使用する必要があります。 (Precise のイメージは Segmentation fault になってしまいます...
また、ここでは php: 7.0.8
以降を指定する必要があります。PHP7.0.7 のバグのため カバレッジ出力時にエラーとなってしまうため、個別にマイナーバージョンまで指定しています。
exclude
exclude:
- php: 5.3
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- php: 5.4
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- php: 5.5
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- php: 5.6
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- php: 7.0
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- php: 7.1
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
ちょっと長いですが、 include で指定した phpdbg のテストを、各バージョンの PHP で実行しないようにする設定です。
allow_failures
allow_failures:
- env: DB=sqlite
- php: 7.1
- php: 7.0.12
env: DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
ここに記述したテストが失敗しても、ジョブ全体としては失敗と記録しません。
主に、開発用途や、実験的な環境を記述します。
SQLite3, PHP7.1, 前述のカバレッジ出力用のテストを設定しています。
env
env:
- DB=mysql USER=root DBNAME=myapp_test DBPASS=' ' DBUSER=root
- DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres
- DB=pgsql USER=postgres DBNAME=myapp_test DBPASS=password DBUSER=postgres PHP_SAPI=phpdbg
- DB=sqlite
.travis.yml で使用する環境変数のバリエーションを記述します。
主にデータベースの接続設定です。
install
install:
- gem install mime-types -v 2.99.1
- gem install mailcatcher
テストに使用するミドルウェア等をインストールする設定です。
メールの送受信をテストするための mailcatcher をインストールする設定を記述しています。
gem install mime-types -v 2.99.1
は、 gem の依存関係で mailcatcher のインストールに失敗しないようにする対策です。
before_script
before_script:
- CODENAME=$(lsb_release -c -s)
- if [[ $PHP_SAPI != 'phpdbg' ]] || [[ $CODENAME = 'trusty' ]]; then phpenv config-rm xdebug.ini ; fi
- if [[ $PHP_SAPI = 'phpdbg' ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini ; fi
- composer self-update || true
- composer install --dev --no-interaction -o
- php ./eccube_install.php $DB none
- mailcatcher
テスト実行前に、実行するスクリプトです。順番に解説します。
- CODENAME=$(lsb_release -c -s)
trusty の環境か、 precise の環境かを取得します。
- if [[ $PHP_SAPI != 'phpdbg' ]] || [[ $CODENAME = 'trusty' ]]; then phpenv config-rm xdebug.ini ; fi
xdebug を無効化して、テストを高速化します。
おそらく if 文の条件は不要ですが、歴史的な理由で残っています...
- if [[ $PHP_SAPI = 'phpdbg' ]]; then echo "memory_limit=-1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini ; fi
phpdbg は、とてもたくさんのメモリを使用するため、 memory_limit=-1
としています。
- composer self-update || true
念のため、 composer を最新化します。
- composer install --dev --no-interaction -o
- php ./eccube_install.php $DB none
composer install の実行後、 EC-CUBE をインストールします。
- mailcatcher
最後に mailcatcher を起動して、準備完了です!
script
script:
- if [[ $PHP_SAPI = 'phpdbg' ]] && [[ $CODENAME = 'trusty' ]]; then phpdbg -qrr ./vendor/bin/phpunit --coverage-clover=coverage.clover ; fi
- if [[ $PHP_SAPI != 'phpdbg' ]]; then phpunit ; fi
ユニットテストを実行するスクリプトです。
1行目は、 trusty の環境でのみ実行します。 phpdbg でカバレッジレポートを出力します。
2行目は、 phpdbg 以外の環境で PHPUnit を実行します。
テストの高速化のため、 vendor/bin/phpunit
を使用せず、 Travis CI にインストールされた phpunit を実行します。
after_script
after_script:
- if [[ $PHP_SAPI = 'phpdbg' ]]; then wget https://scrutinizer-ci.com/ocular.phar ; fi
- if [[ $PHP_SAPI = 'phpdbg' ]]; then php ocular.phar code-coverage:upload --format=php-clover coverage.clover ; fi
テスト実行後、メトリクス計測のため Scrutinizer へレポートを送信します
after_success
after_success:
- if [[ $PHP_SAPI = 'phpdbg' ]]; then php vendor/bin/coveralls -v -x coverage.clover ; fi
テストに成功した場合のみ、実行します。
phpdbg の環境のみ、 coveralls へカバレッジレポートを送信します。
after_failure
この行 のコメントをはずすと、テストが失敗した時に大量のログを表示してくれます。デバッグ用途には便利ですが、大量すぎて、ブラウザが固まってしまうこともあります。ご利用は計画的に...
まとめ
EC-CUBE3 のリリース当初は、比較的シンプルだった .travis.yml も、徐々に肥大化し、やってることも黒魔術化してきてしまいました。
Travis CI は、大変多機能で、工夫し甲斐があるのですが、頑張りすぎると、引き継ぎなどで苦労しそうです...
今回のアドベントカレンダーは、解説記事をまとめるのに良い機会でしたが、引き継ぎに困らないドキュメントを目指して、日々精進していきたいものです。