hero_picture
Cover Image for GitHub Actionsを使ってLaravelアプリケーションをCI/CDする

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

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 サービスとの使い分けなども見ていきたいと思います。

参考サイト

https://ldarren.medium.com/number-of-ways-to-setup-database-in-github-actions-2cd48df9faae