環境
- CircleCI 1.0
- PHP 7.1
- Laravel 5.4
- MySQL 5.7
やりたいこと
Bitbucket の任意のリポジトリにプッシュがある度に PHPUnit を実行し、テスト結果を表示したい。
※今回は Bitbucket だが、GitHub でもやり方はほとんど同じと思われる。
方法
CircleCI を使う。
手順
CircleCI に登録し、Bitbucket と連携する
-
CircleCI にアクセスし、
Sign UP
する -
Authorize Bitbucket
を押下して、Bitbucket と連携する - ビルドしたいリポジトリ(プロジェクト)を選択する
circle.yml を作成する
project-name/circle.yml
machine:
environment:
DB_HOST: 127.0.0.1
DB_DATABASE: circle_test
DB_SLAVE1: 127.0.0.1
DB_SLAVE2: 127.0.0.1
DB_USERNAME: ubuntu
DB_PASSWORD:
php:
version: 7.1.0
database:
override:
- php artisan migrate --env=testing
test:
override:
- vendor/bin/phpunit -d memory_limit=512M
解説
environment:
- 環境変数を設定し、元から
.env
(ここでは.env.testing
)で設定している環境変数を上書く- こうすれば CircleCI でビルドされるときに、
config/database.php
にenvironment:
の環境変数が適用され、コンテナ内(Localhost)のDBにアクセスされる - この対応をしないと
php_network_getaddresses: getaddrinfo failed: Name or service not known
などのエラーになり失敗する - DB名やユーザー名は CircleCI のデフォルト値
- こうすれば CircleCI でビルドされるときに、
config/database.php
'mysql' => [
'read' => [
'host' => [
env('DB_SLAVE1', ''),
env('DB_SLAVE2', ''),
],
],
'write' => [
'host' => env('DB_HOST', ''),
],
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', ''),
'username' => env('DB_USERNAME', ''),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
],
database:
- コンテナ内のDBにテーブルを作成するため、マイグレーションを実行している
test:
- 重いテストではメモリ不足で落ちるため、
memory_limit=512M
に上限を上げている
CircleCI を動かす
-
circle.yml
が作成できたら、リポジトリに追加するためにコミットしてプッシュする - プッシュすると自動で CircleCI が動いてビルドされ、青色の
RUNNING
になる - 正常にビルドされれば緑色の
SUCCESS
になる
ビルドが失敗する場合
Debug via SSH
タブの Retry this build with SSH enabled
を押下すると、CircleCI のコンテナに 30 分だけ SSH できるようになる。
この機能を利用してデバッグする。
おまけ
-
[ci skip]
をコミットメッセージに入れると CircleCI のビルドをスキップできる。 -
文言変更などの軽微な修正時に使えそう。
-
環境変数は CircleCI の画面(GUI)の
Environment Variables
からでも設定できる -
circle.yml
と GUI の両方で設定した場合は、circle.yml
の方が反映されるもよう