GitHub ActionsでMySQLサービスコンテナの作成
Integrationテストなどで、使い捨てのMySQLサービスコンテナを作成して使用したいことがありましたので、記事としてまとめておきたいと思います。
作成方法
MySQLサービスコンテナの作成に必要な部分は以下。
services:
mysql:
image: mysql:5.7
env:
MYSQL_DATABASE: database
MYSQL_ROOT_PASSWORD: root
MYSQL_ALLOW_EMPTY_PASSWORD: yes
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
注意点は、optionsでコンテナのヘルスチェックをしているところ。
MySQLコンテナの準備が整うまで処理を待つようにします。
MySQLの準備が整うまでに処理が進んでしまうと、接続エラーなどでジョブが落ちるので注意。
ワークフロー全体
- MySQLサービスコンテナの作成
- MySQL Clientのインストール
- 初期データの投入
上記のよく使用するパターンのワークフローを作成しておきました。
以下が全体のワークフローファイルになります。
name: MySQL Sample Action
on: workflow_dispatch
jobs:
job:
services:
mysql:
image: mysql:5.7
env:
MYSQL_DATABASE: hoge
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_USER: hoge
MYSQL_PASSWORD: hoge
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install MySQL Client
run: |
sudo apt-get update -y
sudo apt-get -f install -o Dpkg::Options::="--force-overwrite"
- name: Seeding Initial Data
run: |
mysql -h 127.0.0.1 -uhoge -phoge -e "show databases;"
mysql -h 127.0.0.1 -uhoge -phoge hoge < ./sql/table.sql
mysql -h 127.0.0.1 -uhoge -phoge hoge < ./sql/data.sql
サンプルレポジトリ
サンプルレポジトリも作成しておきました!
実際のActionsで一連の流れも実行しているので細かい部分は、以下のレポジトリを見てもらえればと!
注意点
Self-Hosted Runner
業務でGHES(GitHub Enterprise Server)の「Self-Hosted Runner」で使用している際に、エラーが発生したので補足しておきます。
「Self-Hosted Runner」自体で発生するという問題ではなかったのですが、「Self-Hosted Runner」で独自でホスティングしている環境により、Charsetの問題が発生しました。
※通常の「GitHub Hosted」の「ubuntu-latest」などでは基本デフォでクライアント側の設定がされているので発生しませんでした。
発生エラー
steps内で、「./sql/data.sql」内で日本語データがあると発生。
steps:
...
- name: Seeding Initial Data
run: |
mysql -h 127.0.0.1 -uhoge -phoge -e "show databases;"
mysql -h 127.0.0.1 -uhoge -phoge hoge < ./sql/table.sql
mysql -h 127.0.0.1 -uhoge -phoge hoge < ./sql/data.sql
発生原因
クライアント側のCharsetが原因で発生していました。
今回の場合は、「Self-Hosted Runner」で独自でホスティングしている環境の部分の設定の影響もありました。
MySQLサーバー側のCharsetは特に問題ではなかったことに注意。
対応方法
SQLデータ投入の先頭で、「CHARSET utf8mb4;」を実行するようにする。
OS側の「Self-Hosted Runner」の方を弄れればその方法もあったかもしれませんが、弄れないのでこれでうまく行きました。
github-actions_services/sql/data.sql
/*
Initial Settings
*/
CHARSET utf8mb4;
INSERT INTO `hoge` (`id`, `name`, `description`, `created_at`, `updated_at`, `deleted_at`)
VALUES
(1, 'ほげ1', NULL, '2021-01-01 00:00:00', '2021-01-01 00:00:00', NULL),
(2, 'ほげ2', NULL, '2021-01-02 00:00:00', '2021-01-02 00:00:00', NULL),
(3, 'ほげ3', NULL, '2021-01-03 00:00:00', '2021-01-03 00:00:00', NULL),
(4, 'ほげ4', NULL, '2021-01-04 00:00:00', '2021-01-04 00:00:00', NULL);
まとめ
今回は、GitHub ActionsのServiesでMySQLサービスコンテナの作成方法を解説しました!
最近業務でGitHub Actionsをそこそこ触って一通り知見が溜まったので、空いた時間で記事にしていこうと思います。
公式ドキュメントが機械翻訳っぽく、日本語が不自然でちょっと読みにくいので、この記事がお役に立てれば嬉しいです。(現在は人の翻訳は受けて付けていないみたいです、、)
コメント