15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-25

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

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

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

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

image.png

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で確認するとエラーなくテストが実行できたことが確認できます。
image.png
image.png
image.png
image.png
やったぜ

参考

GitHub Actionsを利用してLaravelのテストを自動化してみた - Qiita
https://qiita.com/kai_kou/items/4f850f7308eb0d3e0b48

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

15
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?