こんにちは小國です。少し前のことになりますが、弊社の 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
1name: Laravel
2
3on:
4 push:
5 branches: [ master ]
6 pull_request:
7 branches: [ master ]
8
9jobs:
10 laravel-tests:
11
12 runs-on: ubuntu-latest
13
14 steps:
15 - uses: actions/checkout@v2
16 - name: Copy .env
17 run: php -r "file_exists('.env') || copy('.env.example', '.env');"
18 - name: Install Dependencies
19 # composer.phar を使うようにする
20 run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
21 - name: Generate key
22 run: php artisan key:generate
23 - name: Directory Permissions
24 run: chmod -R 777 storage bootstrap/cache
25 - name: Create Database
26 run: |
27 mkdir -p database
28 touch database/database.sqlite
29 - name: Execute tests (Unit and Feature tests) via PHPUnit
30 env:
31 DB_CONNECTION: sqlite
32 DB_DATABASE: database/database.sqlite
33 run: vendor/bin/phpunit
MySQLでテストする
今度は DB に MySQL を使ってテストします。
実はこれにすごく嵌りました。MySQL の service を使う記事もあったのですが、これが思うように動かずで半ば諦めようと思っていました。
MySQL service を使ってみる(思うように動かず)
1 services:
2 mysql:
3 image: mysql:5.7
4 options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
5 ports:
6 - 3306:3306
7 env:
8 MYSQL_ROOT_PASSWORD: password
9 MYSQL_DATABASE: laravel
Failed の嵐
諦めかけたとき ubuntu-latest(Ubuntu 18.04.4 LTS)に MySQL がプレインストールされていることを知り、実行時間(料金)を考え、それを使うようにしています(結果オーライ)。なお、ubuntu-latest の MySQL は 5.7 のようです。
https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu1804-README.mdhttps://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runnersワークフローは以下のようになりました。先程のからの変更点は以下のとおりです。
- MySQL の起動とデータベースの作成
- phpunit.xml で DB_CONNECTION を testing を使用しているので合わせる(手元の設定に応じて使用してください)
.github/workflows/laravel.yml
1name: Laravel
2
3on:
4 push:
5 branches: [ master ]
6 pull_request:
7 branches: [ master ]
8
9jobs:
10 laravel-tests:
11
12 runs-on: ubuntu-latest
13
14 steps:
15 - uses: actions/checkout@v2
16 - name: Copy .env
17 run: php -r "file_exists('.env') || copy('.env.example', '.env');"
18 - name: Install Dependencies
19 run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
20 - name: Generate key
21 run: php artisan key:generate
22 - name: Directory Permissions
23 run: chmod -R 777 storage bootstrap/cache
24 - name: Setup Database
25 # MySQL の起動とデータベースの作成
26 run: |
27 sudo systemctl start mysql.service
28 mysql -uroot -h127.0.0.1 -proot -e 'CREATE DATABASE IF NOT EXISTS test;'
29 - name: Execute tests (Unit and Feature tests) via PHPUnit
30 # phpunit.xml で DB_CONNECTION を testing を使用しているので合わせる
31 env:
32 DB_CONNECTION: testing
33 DB_TEST_HOST: 127.0.0.1
34 DB_TEST_PORT: 3306
35 DB_TEST_DATABASE: test
36 DB_TEST_USERNAME: root
37 DB_TEST_PASSWORD: root
38 run: vendor/bin/phpunit
複数のPHPバージョンでテストする
最後に複数の PHP のバージョンでテストします。Travis CI のように行うのかなと思っていたのですが、こちらのアプリケーションを使うのが王道のようです。今回は Linux の PHP 7.2、7.3、7.4 のテストだけですが、その他 OS でもテストも行えるようです。
.github/workflows/laravel.yml
1name: Laravel
2
3on:
4 push:
5 branches: [ master ]
6 pull_request:
7 branches: [ master ]
8
9jobs:
10 laravel-tests:
11
12 name: Laravel (PHP ${{ matrix.php-versions }} on ${{ matrix.operating-system }})
13 runs-on: ${{ matrix.operating-system }}
14 strategy:
15 fail-fast: false
16 matrix:
17 operating-system: [ubuntu-latest]
18 php-versions: ['7.2', '7.3', '7.4']
19
20 steps:
21 - uses: actions/checkout@v2
22 # PHP のセットアップ
23 - name: Setup PHP, with composer and extensions
24 uses: shivammathur/setup-php@v2 #https://github.com/shivammathur/setup-php
25 with:
26 php-version: ${{ matrix.php-versions }}
27 extensions: mbstring, dom, fileinfo
28 # coverage: xdebug #optional
29 - name: Copy .env
30 run: php -r "file_exists('.env') || copy('.env.example', '.env');"
31 - name: Install Dependencies
32 run: php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
33 - name: Generate key
34 run: php artisan key:generate
35 - name: Directory Permissions
36 run: chmod -R 777 storage bootstrap/cache
37 - name: Setup Database
38 run: |
39 sudo systemctl start mysql.service
40 mysql -uroot -h127.0.0.1 -proot -e 'CREATE DATABASE IF NOT EXISTS test;'
41 - name: Execute tests (Unit and Feature tests) via PHPUnit
42 env:
43 DB_CONNECTION: testing
44 DB_TEST_HOST: 127.0.0.1
45 DB_TEST_PORT: 3306
46 DB_TEST_DATABASE: test
47 DB_TEST_USERNAME: root
48 DB_TEST_PASSWORD: root
49 run: vendor/bin/phpunit
テストは以下のようになり、複数の PHP のバージョンでのテストができました。
最後に
GitHub Actions を使って Laravel アプリケーションのテストを行いました。その他のワークフローと組み合わせたりするといろいろと考えられそうです。また、Tavis CI などのその他 CI/CD サービスとの使い分けなども見ていきたいと思います。