蛇ノ目の記

技術のことも。そうでないことも。

GitHub ActionsでのCIでMySQLの設定を変えたいときは?

久しぶりの技術ネタ。

TL;DR

  • shogo82148/actions-setup-mysqlがおすすめ
    • MySQLは5.6, 5.7, 8.0に対応。MariaDBは10.2~10.9に対応
    • my.cnfと同じ記法でmysqldの設定を書ける
    • MySQLコンテナの起動待機処理が含まれているので、mysqldの設定を変えても安心して使える

背景

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と同じ記法で書くことができる。また、その設定をコンテナに反映するための再起動待機処理も含まれている。

github.com

実際に案件で使っている記述は以下の通り。

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日くらい掛かってここまでたどり着き、ひとまずこのワークフローを使うことで決着がついた。

もし同じような問題にぶつかっている人がいるなら、この記事が一助になればいいなと思う。