天将奔烈

日々の記録や学習内容を書いていきます

github actions × Laravel × docker-composeでCI

CIを実行するに当たって既存のdocker-composeでPHPUnitを実行するようにしたのでメモ。

name: backend_CI

on:
  push:
    branches:
      - main
  pull_request:
    branches: 
      - main

jobs:
  app-tests:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

   # dockerコンテナを起動
    - name: docker-compose up
      run: docker-compose up -d
   
    - name: Copy Environment File
      run: docker-compose exec -T app cp .env.example .env
      
    - name: Install Dependencies
      run: docker-compose exec -T app composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
      
    - name: Generate key
      run: docker-compose exec -T app php artisan key:generate

    ## dbの起動を待機
    - name: Wait DB
      run : docker-compose exec -T db bash -c "mysqladmin --wait --count 60 ping -proot || exit 1"

    ## マイグレーション
    - name: migration
      run: docker-compose exec -T app php artisan migrate --seed
      
 ## test実行
    - name: Execute tests (Unit and Feature tests) via PHPUnit
      run: docker-compose exec -T app ./vendor/bin/phpunit

ポイントはDBの起動を待機するところで、これがないとDBの起動前に マイグレーションが実行されて下記のようにエラーが発生する事があるので要注意。

Failed to create mysql.mysql database, SQLSTATE[HY000] [2002] Connection refused

DBの起動待機時に実行している下記のコマンドとオプションを一つずつ解説すると

mysqladmin --wait --count 60 ping -proot || exit 1

-- wait オプションは接続が確率できない場合にコマンドの実行を中止せずに待機してからリトライする

--count 60 繰り返しの回数

ping サーバーが使用可能かどうかをチェック。

※リンク参照 dev.mysql.com