GitHub Actionsを使ってLaravelアプリケーションをCI/CDする
こんにちは小國です。少し前のことになりますが、弊社の Git リポジトリーを Bitbucket から GitHub に移行しました。
https://www.seeds-std.co.jp/blog/creators/2020-06-17-105100/
以前は Bitbucket の Pipelines を使って Laravel アプリケーションの CI/CD を行っていたのですが、GitHub への移行に伴って GitHub Actions を使ってみました。
GitHub ActionsのLaravelのワークフローテンプレートを使ってテストする
GitHub Actions には Laravel アプリケーションのワークフローの雛形が用意されています。まずはそのワークフローを使ってみます。Actions タブから Laravel のワークフローを選んで commit すれば、ワークフローが作成できます。
以下がその YAMLファイルです。
master ブランチに push、pull request があったきにテストする内容になっています。デフォルトのワークフローからの変更点は、composer を Laravel アプリケーションに含んでいるので、こちらを使うようにしています。GitHub Actions の YAML ファイルの詳細については、こちらをご参照ください。
.github/workflows/laravel.yml
name: Laravel
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
laravel-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Copy .env
run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- name: Install Dependencies
# composer.phar を使うようにする
run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Create Database
run: |
mkdir -p database
touch database/database.sqlite
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: sqlite
DB_DATABASE: database/database.sqlite
run: vendor/bin/phpunit
MySQLでテストする
今度は DB に MySQL を使ってテストします。
実はこれにすごく嵌りました。MySQL の service を使う記事もあったのですが、これが思うように動かずで半ば諦めようと思っていました。
MySQL service を使ってみる(思うように動かず)
services:
mysql:
image: mysql:5.7
options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: laravel
Failed の嵐

諦めかけたとき ubuntu-latest(Ubuntu 18.04.4 LTS)に MySQL がプレインストールされていることを知り、実行時間(料金)を考え、それを使うようにしています(結果オーライ)。なお、ubuntu-latest の MySQL は 5.7 のようです。
- https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu1804-README.md
- https://docs.github.com/en/actions/reference/software-installed-on-github-hosted-runners
ワークフローは以下のようになりました。先程のからの変更点は以下のとおりです。
- MySQL の起動とデータベースの作成
- phpunit.xml で DB_CONNECTION を testing を使用しているので合わせる(手元の設定に応じて使用してください)
.github/workflows/laravel.yml
name: Laravel
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
laravel-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Copy .env
run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- name: Install Dependencies
run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Setup Database
# MySQL の起動とデータベースの作成
run: |
sudo systemctl start mysql.service
mysql -uroot -h127.0.0.1 -proot -e 'CREATE DATABASE IF NOT EXISTS test;'
- name: Execute tests (Unit and Feature tests) via PHPUnit
# phpunit.xml で DB_CONNECTION を testing を使用しているので合わせる
env:
DB_CONNECTION: testing
DB_TEST_HOST: 127.0.0.1
DB_TEST_PORT: 3306
DB_TEST_DATABASE: test
DB_TEST_USERNAME: root
DB_TEST_PASSWORD: root
run: vendor/bin/phpunit
複数のPHPバージョンでテストする
最後に複数の PHP のバージョンでテストします。Travis CI のように行うのかなと思っていたのですが、こちらのアプリケーションを使うのが王道のようです。今回は Linux の PHP 7.2、7.3、7.4 のテストだけですが、その他 OS でもテストも行えるようです。
.github/workflows/laravel.yml
name: Laravel
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
laravel-tests:
name: Laravel (PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }})
runs-on: ${{ matrix.operating-system }}
strategy:
fail-fast: false
matrix:
operating-system: [ubuntu-latest]
php-versions: ['7.2', '7.3', '7.4']
steps:
- uses: actions/checkout@v2
# PHP のセットアップ
- name: Setup PHP, with composer and extensions
uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, dom, fileinfo
# coverage: xdebug #optional
- name: Copy .env
run: php -r "file_exists('.env') || copy('.env.example', '.env');"
- name: Install Dependencies
run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Setup Database
run: |
sudo systemctl start mysql.service
mysql -uroot -h127.0.0.1 -proot -e 'CREATE DATABASE IF NOT EXISTS test;'
- name: Execute tests (Unit and Feature tests) via PHPUnit
env:
DB_CONNECTION: testing
DB_TEST_HOST: 127.0.0.1
DB_TEST_PORT: 3306
DB_TEST_DATABASE: test
DB_TEST_USERNAME: root
DB_TEST_PASSWORD: root
run: vendor/bin/phpunit
テストは以下のようになり、複数の PHP のバージョンでのテストができました。

最後に
GitHub Actions を使って Laravel アプリケーションのテストを行いました。その他のワークフローと組み合わせたりするといろいろと考えられそうです。また、Tavis CI などのその他 CI/CD サービスとの使い分けなども見ていきたいと思います。
参考サイト
https://medium.com/@ldarren/number-of-ways-to-setup-database-in-github-actions-2cd48df9faae