🦔
GitHub ActionsでMySQLを使う時のTips
この記事は、Lancers(ランサーズ) Advent Calendar 2023 の2日目の記事です。
モチベーション
GitHub ActionsのMySQLサービスに設定を反映したいケースがありました。
本稿ではその時に発見したソリューションをTipsとして紹介します。
tl;dr
- GitHub ActionsではMySQLの起動オプションを指定できない
-
docker cp
でcnf
ファイルを送り込んで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 cp
でcnf
ファイルを送り込んで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
を利用することで、上記の問題を解決できます。
上述の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