share facebook facebook facebook twitter twitter menu hatena pocket slack

2021.04.06 TUE

GitHub ActionsでLaravelのテストをするのにMySQLを利用する

甲斐 甲

WRITTEN BY 甲斐 甲

GitHub ActionsでLaravelテストするのにMySQLを利用するのにハマったのでメモ。

前提

こちらの記事で利用したLaravelプロジェクトとGitHub Actionsのワークフローをカスタマイズします。

手順

ワークフロー作成

以下のようにワークフローを作成します。

name: Laravel

on:
  push:
    branches:
    - main
    - feature/**
  pull_request:
    branches:
    - develop
    - main

jobs:
  laravel-tests:

    runs-on: ubuntu-latest

    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD:
          MYSQL_DATABASE: hoge_app
          MYSQL_USER: root
          MYSQL_PASSWORD:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10

    steps:
    - uses: actions/checkout@v2
    - name: cache vendor
      id: cache
      uses: actions/cache@v1
      with:
        path: ./vendor
        key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
        restore-keys: |
          ${{ runner.os }}-composer-
    - name: composer install
      if: steps.cache.outputs.cache-hit != 'true'
      run: composer install -n --prefer-dist
    - name: copy .env
      run: cp .env.example .env
    - name: generate key
      run: php artisan key:generate
    - name: migrate
      run: php artisan migrate
      env:
        DB_HOST: 127.0.0.1
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_HOST: 127.0.0.1
      run: vendor/bin/phpunit

MySQLの設定

servicesmysqlを定義します。環境変数は.envの内容を反映できないので、そのまま指定します。
GitHubのSecretsを利用するとパスワードはそちらから指定することもできますが今回はプロジェクトの.env.exampleの内容と同じにしています。

GitHubのSecretsを活用して、GitHub Actionsで安全に機密情報を扱う – Qiita
https://qiita.com/developer-kikikaikai/items/60b209c065f076dca7a1

optionsでMySQLが起動したかヘルスチェックするようにします。

    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD:
          MYSQL_DATABASE: hoge_app
          MYSQL_USER: root
          MYSQL_PASSWORD:
          MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10

マイグレーションとテスト

envDB_HOSTを指定します。開発環境だと.env.examplemysqlとDockerコンテナの名前を指定していますが、それだとGitHub上だと接続できません。

    - name: migrate
      run: php artisan migrate
      env:
        DB_HOST: 127.0.0.1
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      env:
        DB_HOST: 127.0.0.1
      run: vendor/bin/phpunit

ローカルで動作確認

こちらのツールを利用するとローカル環境で動作確認ができます。

nektos/act: Run your GitHub Actions locally 🚀
https://github.com/nektos/act#installation

1点ハマりどころがあり、GitHub Actionsが提供するサービスコンテナがnektos/actでは現状未実装となるため、ローカルとGitHubとで差異があります。

サービスコンテナについて – GitHub Docs
https://docs.github.com/ja/actions/guides/about-service-containers

Github actions – Services fails locally · Issue #247 · nektos/act
https://github.com/nektos/act/issues/173

ただ、ワークフローでDB_HOST: 127.0.0.1と指定することで、開発環境のMySQLへ接続できるので、開発環境のDockerコンテナを起動したまま、actコマンドを実行してあげるとローカル環境でもワークフローが実行できます。

> cd <プロジェクトのディレクトリ>
> ./vendor/bin/sail up -d
> act -P ubuntu-latest=nektos/act-environments-ubuntu:18.04

実行結果をみると、Run migrateは実行されているものの、マイグレーション自体は実行されていないことが確認できます。(開発環境でマイグレーションが実行済みの場合)

開発環境のDockerコンテナを落とすと、ワークフローがエラーになることも確認できます。

> ./vendor/bin/sail down
> act -P ubuntu-latest=nektos/act-environments-ubuntu:18.04

GitHub上で動作確認

ワークフローをGitHubリポジトリにpushしてワークフローが動作するか確認します。

> git branch feature/use-mysql-on-github-actions
> git checkout feature/use-mysql-on-github-actions
> git add .github/workflows/unittest.yml
> git commit -m 'Fix: GitHub ActionsのワークフローでMySQLを利用するようにしました。'
> git push git push --set-upstream origin feature/use-mysql-on-github-actions

GitHubで確認するとエラーなくテストが実行できたことが確認できます。

やったぜ

参考

GitHub Actionsを利用してLaravelのテストを自動化してみた – Qiita
https://cloudpack.media/56242

GitHubのSecretsを活用して、GitHub Actionsで安全に機密情報を扱う – Qiita
https://qiita.com/developer-kikikaikai/items/60b209c065f076dca7a1

nektos/act: Run your GitHub Actions locally 🚀
https://github.com/nektos/act#installation

Number of ways to setup database in Github actions | by Darren Liew | Medium https://medium.com/@ldarren/number-of-ways-to-setup-database-in-github-actions-2cd48df9faae

GitHub Actionsを使ってLaravelアプリケーションをCI/CDする | SEEDS Creators’ Blog | 株式会社シーズ https://www.seeds-std.co.jp/blog/creators/2020-08-19-233031/

Mysql service never comes up healthy in action – Code to Cloud / GitHub Actions – GitHub Support Community
https://github.community/t/mysql-service-never-comes-up-healthy-in-action/16890

元記事はこちら

GitHub ActionsでLaravelのテストをするのにMySQLを利用する

甲斐 甲

甲斐 甲

2018/7にJOIN。 最近の好みはサーバレスです。なんでもとりあえず試します。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。