GitHub Actions 上で MySQL のシステム変数をカスタマイズする #GitHub #Actions #MySQL

概要

GitHub Actions の Workflow では、 Services として MySQL が利用できる。

character_set_server などのシステム変数を変更する方法についてまとめる。

採用した方法: SQL ファイルでグローバル変数を書き換える

Workflow で使う MySQL は基本使い捨てになるため、グローバル変数を書き換える方式にした(ボツ案は後述)。

グローバル変数の書き換えは再起動時に失われるが、そもそも使い捨てであることを考えると、この方式が一番シンプルになると思われたため。

下記はチェックアウトして、直下の 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 の実行時間が伸びてしまうのに抵抗があった。

nao-y.hatenablog.com

採用しなかった方法②: 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 の上書きでどうにかならないか試行錯誤してみたが、どうも行き詰まったので諦めた。

docs.github.com

その他参考