GitHub Actions 上で MySQL のシステム変数をカスタマイズする #GitHub #Actions #MySQL
概要
GitHub Actions の Workflow では、 Services として MySQL が利用できる。
character_set_server
などのシステム変数を変更する方法についてまとめる。
採用した方法: SQL ファイルでグローバル変数を書き換える
Workflow で使う MySQL は基本使い捨てになるため、グローバル変数を書き換える方式にした(ボツ案は後述)。
グローバル変数の書き換えは再起動時に失われるが、そもそも使い捨てであることを考えると、この方式が一番シンプルになると思われたため。
- MySQL :: MySQL 8.0 Reference Manual :: 5.1.9 Using System Variables
- MySQL :: MySQL 8.0 Reference Manual :: 5.1.8 Server System Variables
下記はチェックアウトして、直下の SQL を流すだけのサンプル。
jobs: php: runs-on: ubuntu-latest services: mysql: image: mysql ports: - 3306:3306 env: MYSQL_ALLOW_EMPTY_PASSWORD: yes steps: - uses: actions/checkout@v3 - run: | mysql -u root --protocol tcp < setup.sql
SQL は下記のような感じになる。
SET @@GLOBAL.character_set_server = 'utf8mb4'; SET @@GLOBAL.collation_server = 'utf8mb4_general_ci';
ちなみにプロトコルを指定しているのは、 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
とか言われて怒られるため。
詳細は公式ドキュメント参照。
MySQL :: MySQL 8.0 Reference Manual :: 4.2.4 Connecting to the MySQL Server Using Command Options
この方式で最低限 SQL ファイルは構成管理されるが、あくまでユニットテストなどを流すために利用する使い方を想定しており、本番用の設定は別で管理するのを前提にしている。
採用しなかった方法①: 設定ファイルで書き換え
my.cnf のような設定ファイルを別途用意する方法も当初は考えたが、下記の理由で採用を見送った。
- Workflow のジョブは MySQL サービスが立ち上がった後に動く
- my.cnf の反映は大抵再起動が必要
再起動して、かつサービスがレディになるのを改めて待つのは複雑になったり Workflow の実行時間が伸びてしまうのに抵抗があった。
採用しなかった方法②: options
MySQL の公式イメージを純粋に使用する場合、 CMD を上書きすることで設定ファイルなしのパラメータ変更方法( Configuration without a cnf file
)が紹介されている。
https://hub.docker.com/_/mysql
ただし、GitHub Actions の services では CMD の変更方法は提供されていないようだ。
options (jobs.<job_id>.services.<service_id>.options
) で docker create の option は設定できるため、ENTRYPOINT の上書きでどうにかならないか試行錯誤してみたが、どうも行き詰まったので諦めた。