GitHub Actionsを使ってLaravelアプリケーションをCI/CDする | SEEDS Creators' Blog | 株式会社シーズ

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 のようです。

ワークフローは以下のようになりました。先程のからの変更点は以下のとおりです。

  • 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