久しぶりの技術ネタ。
TL;DR
shogo82148/actions-setup-mysql
がおすすめ
背景
CircleCIのコンテナ使い放題のプランが2022年7月18日に終了すること受け、案件でCIをCircleCIからGitHub Actionsに移行することになった。
当初はDocker Hub公式のMySQLイメージmysql:5.7
を使っていたが、mysqldのデフォルト文字コード設定がUTF-8でないことからユニットテストがfailしてしまった。調べてみると、DockerHub公式のMySQLイメージではmysqlの設定を変えるのは難しいようだった。それを受け、文字コード設定を変更する方法を模索した。
設定ファイルをMySQLコンテナに送り込んで、手動でMySQLコンテナを再起動する
この方法ではDocker Hub公式のMySQLイメージmysql:5.7
を使う。
リポジトリに設定ファイルを置いて、workflow上でのリポジトリのチェックアウト後にdocker cp
を使ってその設定ファイルをMySQLコンテナにコピーする。その後、以下のようにしてコンテナ起動待機処理を入れる。
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
GitHub Actionsのservicesでmysqldで起動時にしか指定できないオプションを変更する - @znz blog
この方法でも一応の解決を見たが、workflowの中身がやや煩雑になることから別の方法を探すことになった。そうして見つけたのがshogo82148/actions-setup-mysql
。
shogo82148/actions-setup-mysql
を使う方法
このワークフローでは、mysqldの設定をmy.cnf
と同じ記法で書くことができる。また、その設定をコンテナに反映するための再起動待機処理も含まれている。
実際に案件で使っている記述は以下の通り。
steps: - uses: shogo82148/actions-setup-mysql@v1 with: mysql-version: '5.7' root-password: ${{ env.MYSQL_ROOT_PASSWORD }} my-cnf: | [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION [client] default-character-set=utf8mb4
冒頭にも書いたが、MySQLは5.6, 5.7, 8.0に、MariaDBでは10.2~10.9に対応してるので幅広く応用できそう。
GHA上でMySQLの設定を変える方法については、Webを探し回っても「これ!」というものがなかなか見つけられなかった(文字コードがasciiになっていても英語圏ではあまり困らないから?)
そして2~3日くらい掛かってここまでたどり着き、ひとまずこのワークフローを使うことで決着がついた。
もし同じような問題にぶつかっている人がいるなら、この記事が一助になればいいなと思う。