6
1

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 1 year has passed since last update.

GitHub ActionsでPHPUnitしたい!

Last updated at Posted at 2023-04-04

概要

  • GitHub Actionsのservicesでdocker on dockerする
  • マウントの設定が一手間かかる

GitHub Actionsでテストを実行する

GitHub Actionsでは runs-on の設定でジョブを実行する環境を設定できる。

しかし、テストを実行する際はアプリケーション稼働と同じ環境で実施したい。

servicesを使う

そこで、 services の設定でコンテナを起動し、そのコンテナ内部でテストを実行する。

services は以下のように設定できる。
アプリケーションのDockerfileやdocker-composer.ymlと同じように必要なコンテナをセットする。

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      php:
        image: public.ecr.aws/docker/library/php:9.0-fpm-alpine
        options: --name php --workdir /application --entrypoint php-fpm
        volumes:
          - /home/runner/work/project/project/application:/application
      db:
        image: mysql/mysql-server:5.7
        env:
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: database
          MYSQL_ROOT_HOST: '%'
        ports:
          - 127.0.0.1:3306:3306

マウントフォルダの問題

services の設定を使うと、 Set up job の次に Initialize containers というステップが追加される。
つまり、ソースコードのチェックアウトより先にマウント用のフォルダが作成されてしまう。

マウント用のフォルダに対してgit cloneやファイルのコピーをすると、 fatal: destination path '.' already exists and is not an empty directory. というエラーが発生してしまう。

そこでマウントしたときのオーナーを変える。

    steps:
      - name: chown user
        run: |
          sudo chown -R runner:docker application

あとはいつもどおりテストをする

composerのDLに時間がかかるようであればキャッシュしておくといい。

      - name: Composer Cache
        uses: actions/cache@v3
        id: composer-cache
        with:
          path: |
            /home/runner/work/project/project/application/vendor
          key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}"
          restore-keys: |
            "${{ runner.os }}-"

      - name: composer install
        run: |
          cd application
          composer install \
              --ignore-platform-reqs \
              --no-interaction \
              --no-plugins \
              --no-scripts \
              --prefer-dist

AWS SDKを使っていてかつテストでAws\MockHandlerを使用しているなら、適当な認証設定を追加する必要がある。

      - name: setup app
        run: |
          cd application
          cp .env.example .env

          # Aws\MockHandlerに必要、実際のAWS環境を使うテストができたら消すこと
          echo "AWS_ACCESS_KEY_ID=x" >> .env
          echo "AWS_SECRET_ACCESS_KEY=x" >> .env
          echo "AWS_SESSION_TOKEN=x" >> .env
          echo "AWS_COGNITO_USER_POOL_ID=x" >> .env

          docker exec php docker-php-ext-install -j$(nproc) pdo_mysql

      - name: execute test
        run: |
          docker exec php php artisan test
6
1
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
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?