😇
GitHub Actionsでテストを走らせてからLaravelをHerokuにデプロイする
概要
テストを導入する際に調べたので記録として残しておきます。
環境
- 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