🦔

GitHub ActionsでMySQLを使う時のTips

2023/12/01に公開

この記事は、Lancers(ランサーズ) Advent Calendar 2023 の2日目の記事です。

https://qiita.com/advent-calendar/2023/lancers

モチベーション

GitHub ActionsのMySQLサービスに設定を反映したいケースがありました。
本稿ではその時に発見したソリューションをTipsとして紹介します。

tl;dr

  • GitHub ActionsではMySQLの起動オプションを指定できない
  • docker cpcnfファイルを送り込んでMySQLを再起動するのは嫌だ
  • shogo82148/actions-setup-mysqlを使えば良い感じに設定を反映できるのでお勧め

GitHub ActionsではMySQLの起動オプションを指定できない

CircleCIでは下記のようにMySQLコンテナの起動オプションを指定することで設定を反映できます。

docker:
  - image: cimg/mysql:8.0.27
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      TZ: Asia/Tokyo
    command: [--character-set-server=utf8mb4, --collation_server=utf8mb4_bin]

ところが、GitHub ActionsのMySQLサービスではMySQLの起動オプションを設定できません。
そのため、cnfファイルを何らかの方法でコンテナ内に送り込み、MySQLを再起動することで設定を反映する必要があります。

docker cpcnfファイルを送り込んでMySQLを再起動するのは嫌だ

愚直に実現しようとすると、下記のようにdocker cpで設定ファイルを/etc/mysql/conf.d/に送り込み、再起動する形になります。

steps:
  - name: mysql_setup
    run: |
      set -eux
      docker cp ./config/test.cnf ${{ job.services.mysql.id }}:/etc/mysql/conf.d/
  - name: Restart mysql
    run: |
      set -eux
      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="{{.State.Health.Status}}" ${{ job.services.mysql.id }})
          [ "$health_status" != 'starting' ] && exit 0
      done
      exit 1

このアプローチは下記の理由から採用したくありません。

  • MySQLが再起動するのを待つ時間が無駄
  • オシャレじゃない

shogo82148/actions-setup-mysqlを使って設定を反映する

shogo82148/actions-setup-mysqlを利用することで、上記の問題を解決できます。

https://github.com/shogo82148/actions-setup-mysql

上述のCircleCIと同等の設定は下記のように書けます。

- uses: shogo82148/actions-setup-mysql@v1
  with:
    mysql-version: "8.0"
    my-cnf: |
      character-set-server = utf8mb4
      collation_server = utf8mb4_bin

まとめ

MySQLサービスの初期セットアップ時にcnfファイルを読み込ませる方法はないものかと探し回りずいぶん時間を使ってしまいました。
この記事が誰かの役に立てれば幸いです。

ランサーズ株式会社

Discussion