😇

GitHub Actionsでテストを走らせてからLaravelをHerokuにデプロイする

2020/10/16に公開

概要

テストを導入する際に調べたので記録として残しておきます。

環境

  • PHP:7.4.x
  • Laravel:6.x
  • PostgreSQL:12.x

前提

  • テストの書き方については省略する
  • GitHubActionsでは環境に合わせてPostgreSQLを利用する

GitHubActions用の設定

テスト用のDB_CONNECTIONを準備する

ローカルの環境上、DB_DATABASE_TESTにしてますが、問題無いのであればDB_DATABASEでも大丈夫なはずです。

config/database.php

'connections' => [
    'testing' => [
        'driver' => 'pgsql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '5432'),
        'database' => env('DB_DATABASE_TEST', 'laravel_testing'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8',
        'prefix' => '',
        'prefix_indexes' => true,
        'schema' => 'public',
        'sslmode' => 'prefer',
    ],
]

PHPUnitの設定をする

ローカル用に「server」から「env」に書き換えてますが、
DB_CONNECTIONとDB_DATABASE_TESTの設定を間違わなければ動くはずです。

phpunit.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing" force="true"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="DB_CONNECTION" value="testing" force="true"/>
        <env name="DB_DATABASE_TEST" value="laravel_testing" force="true"/>
        <env name="MAIL_DRIVER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
    </php>
</phpunit>

GitHubAction用の環境変数設定用に.env.github準備する

.env.github

APP_NAME=Laravel
APP_KEY=
APP_URL=http://localhost

DB_CONNECTION=testing
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE_TEST=laravel_testing
DB_USERNAME=postgres
DB_PASSWORD=postgres

GitHubActions用の設定ファイルを準備する

公式からテンプレートが作成できますので、それを利用して少しカスタマイズします。

テンプレートを改変する

  • postgresの設定を追加する
  • 処理を見てみると.env.exampleを利用しているので、テストに必要な環境変数をまとめた.env.githubに書き換える
  • migrateとseedの実行を追加

.github/workflows/laravel.yml

name: Laravel

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:12
        env:
          POSTGRES_USER: 'postgres'
          POSTGRES_PASSWORD: 'postgres'
          POSTGRES_DB: 'laravel_testing'
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
        - 5432:5432
    steps:
    - uses: actions/checkout@v2
    - name: Copy .env
      run: php -r "file_exists('.env') || copy('.env.github', '.env');"
    - name: Install Dependencies
      run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist
    - name: Generate key
      run: php artisan key:generate
    - name: Directory Permissions
      run: chmod -R 777 storage bootstrap/cache
    - name: Execute Migration & Seed
      run: php artisan migrate:refresh --seed --force
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      run: vendor/bin/phpunit

これでPushしたタイミングとプルリクを出したタイミングでテストが走るようになります。

Heroku側の設定

GitHubのリポジトリと連携

アプリケーションの「Deploy」タブから下記の手順で設定します。

Deployの自動化

ブランチを選択して、「Wait for CI to pass before deploy」にチェックを入れます。

最後に

大変だろうと思って後回しにしていましたが、実際はこのような感じで簡単にCI/CD環境が構築できます。
参考になれば幸いです。

Discussion