概要
- 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