Edited at

CircleCI + Bitbucket + Laravel(PHPUnit) で自動テスト

More than 1 year has passed since last update.


環境


  • CircleCI 1.0

  • PHP 7.1

  • Laravel 5.4

  • MySQL 5.7


やりたいこと

Bitbucket の任意のリポジトリにプッシュがある度に PHPUnit を実行し、テスト結果を表示したい。

※今回は Bitbucket だが、GitHub でもやり方はほとんど同じと思われる。


方法

CircleCI を使う。


手順


CircleCI に登録し、Bitbucket と連携する



  1. CircleCI にアクセスし、Sign UP する


  2. Authorize Bitbucketを押下して、Bitbucket と連携する

  3. ビルドしたいリポジトリ(プロジェクト)を選択する


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.phpenvironment: の環境変数が適用され、コンテナ内(Localhost)のDBにアクセスされる

    • この対応をしないと php_network_getaddresses: getaddrinfo failed: Name or service not known などのエラーになり失敗する

    • DB名やユーザー名は 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 を動かす



  1. circle.yml が作成できたら、リポジトリに追加するためにコミットしてプッシュする

  2. プッシュすると自動で CircleCI が動いてビルドされ、青色のRUNNING になる

  3. 正常にビルドされれば緑色の 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の方が反映されるもよう