GitHub Actions の services で options に docker コマンドのオプションは渡せますが、 docker image の entrypoint に対する引数が指定できないので、 mysqld の起動時にしか指定できない設定を変更するのに苦労しました。

確認環境

2021年1月25日時点で https://github.com/znz/test-20210125/blob/c45451e2a1443d80b2cd2bb49d15d5be3a1a7f01/.github/workflows/test.yml の設定を使って確認しました。

その後の変更で指定できるようになっているかもしれませんが、確認していません。

設定方法

services で mysqld を使う方法を調べていてみつけた

options: >-
  --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

をつけました。 health check 関係の設定をしておくと、ちゃんと起動を待ってから steps の実行に進んでいるように見えます。

docker cp ./mysql/conf.d/test.cnf ${{ job.services.mysql.id }}:/etc/mysql/conf.d/ のように /etc/mysql/conf.d に設定ファイルをコピーで送りこんで、 docker restart ${{ job.services.mysql.id }} でリスタートして、 以下のように再起動待ちをすることで実現しました。

for sleep in 0 ${WAITS:- 1 2 4 8 15 25 100}; do
  sleep "$sleep"
  health_status=`docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" ${{ job.services.mysql.id }}`
  if [ 'starting' != "$health_status" ]; then
    exit 0
  fi
done
exit 1

試行錯誤した点

docker で指定するコンテナ ID として services で指定した mysql は使えず、 context から ${{ job.services.mysql.id }} のように取り出す必要がありました。

services の options で -v を使って steps と共有するディレクトリをマウントできるのですが、 uses: actions/checkout@v2 でチェックアウトするよりも前に services が起動するので、 起動時に参照してほしいファイルの共有には使えませんでした。 services 実行中に読み書きするファイルの共有には使えそうです。

act が services の実行に対応していない (設定ファイルのパースには対応していて何も使われていない) ので、 GitHub 上で試行錯誤するしかありませんでした。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published