公式ドキュメントに載ってないLaravel5.5のDuskをGitHubActionsでCIしたい

3 min read読了の目安(約3200字

背景

Laravel5.5 Dusk公式ドキュメントにGitHubActionsでのCIのやり方が載ってなくて、苦戦したので備忘録として。

前提条件

  • Laravel5.5 Duskをインストール済み

DuskTestCase.phpの設定

ここの設定は特に意識する必要なくだいたいデフォルトのままで良い

<?php

namespace Tests;

use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Laravel\Dusk\TestCase as BaseTestCase;

abstract class DuskTestCase extends BaseTestCase
{
    use CreatesApplication;

    /**
     * Prepare for Dusk test execution.
     *
     * @beforeClass
     * @return void
     */
    public static function prepare()
    {
        static::startChromeDriver();
    }

    /**
     * Create the RemoteWebDriver instance.
     *
     * @return \Facebook\WebDriver\Remote\RemoteWebDriver
     */
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--window-size=1920,1080',
            '--no-sandbox',
        ]);

        return RemoteWebDriver::create(
            'http://127.0.0.1:9515', DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY, $options
            ), 100000, 100000 // 最後の引数はタイムアウト用の設定
        );
    }
}

.github/workflows/dusk.yml(GitHubActionsの設定)

name: Testing Laravel Dusk with MySQL
on: [push, pull_request]
jobs:
  laravel:
    name: Laravel (PHP ${{ matrix.php-versions }})
    runs-on: ubuntu-latest
    ### 省略
    strategy:
      fail-fast: false
      max-parallel: 3
      matrix:
        php-versions: ['7.2'] # Laravel5.5なのでPHP7.2を指定
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Setup PHP, with composer and extensions
        uses: shivammathur/setup-php@master
        with:
          php-version: ${{ matrix.php-versions }}
          extension-csv: mbstring, dom, fileinfo, mysql
          coverage: none
      - name: composer downgrade
        run: composer self-update --1
      - name: Copy .env
        run: cp .env.ci .env
      - name: install libsqlite3
        run: sudo apt-get install -y libsqlite3-dev
      - name: Install Composer dependencies
        run: composer install --no-scripts
      - name: Generate key
        run: php artisan key:generate
      - name: Clear Config
        run: |
          php artisan config:clear
          php artisan cache:clear
      - name: Run dusk tests
        run: |
          ./vendor/laravel/dusk/bin/chromedriver-linux &
          chmod -R 0755 vendor/laravel/dusk/bin/ & 
          php artisan serve & # php artisan serveを起動し、&でマイグレーションとseederを起動する
          php artisan migrate
          php artisan db:seed
          php artisan dusk
        env: # php artisan serveだと.envが正常に読まれないのでここで指定する
          APP_ENV: ci
          APP_URL: http://127.0.0.1:8000
          DB_CONNECTION: mysql
          DB_HOST: 127.0.0.1
          DB_PORT: 33306
          DB_DATABASE: test_db
          DB_USERNAME: root
          DB_PASSWORD: root

CI起動中のLaravel Duskのテストコードの注意点

php artisan serveのスレッド上でmigrationやseederなど実行するとDBとの接続ができないため、確定でDuskが落ちます。Seederなどはdusk起動前に実行しましょう(これに気づかず、Factoryの実行で落ちてめちゃめちゃハマりました)。

参考

GitHub Projectのどこか(Bookmark忘れてごめんなさい!!)