【GitHub Actions】ServiesでMySQLサービスコンテナの作成

GitHub Actions

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の準備が整うまでに処理が進んでしまうと、接続エラーなどでジョブが落ちるので注意。

ワークフロー全体

  1. MySQLサービスコンテナの作成
  2. MySQL Clientのインストール
  3. 初期データの投入

上記のよく使用するパターンのワークフローを作成しておきました。

以下が全体のワークフローファイルになります。

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をそこそこ触って一通り知見が溜まったので、空いた時間で記事にしていこうと思います。

公式ドキュメントが機械翻訳っぽく、日本語が不自然でちょっと読みにくいので、この記事がお役に立てれば嬉しいです。(現在は人の翻訳は受けて付けていないみたいです、、)

オススメの関連商品

Note一覧

コメント

タイトルとURLをコピーしました