GitHub Actionsのワークフローで使い捨てのMySQLを利用する(サービスコンテナ)

CI/CD
この記事は約4分で読めます。

はじめに

GitHub Actionsのワークフローで使い捨てのMySQLを利用するためのメモです。
MySQLはジョブの開始時にサービスコンテナとして都度新規のものを立ち上げ、ジョブの終了時に破棄します。(ジョブ内の各ステップでは同一のコンテナを使用します)

JUnitでMySQLを利用したい場合は、Testcontinersを利用した方がポータビリティも高くていいと思います。
今回紹介する方法は、ステップをまたいだ結合テストなどに使えるかもしれません?

環境
  • GitHub Actions
  • ランナー:Ubuntu 20.04(GitHubホストランナー)
  • MySQL:8.0, 5.7, 5.6(DockerHub公式イメージ)

ひとまず、後ほど解説するワークフローのymlの全体像と、

https://github.com/norio-io/example-github-actions-with-ephemeral-mysql/blob/main/.github/workflows/example.yml

それをGitHub Actionsで動かした結果です。

https://github.com/norio-io/example-github-actions-with-ephemeral-mysql/actions/runs/1033904732

解説

ジョブ定義の例です。(ymlファイル全体はこちら

ポイント
  • 3行目:ランナーはGitHubホストランナーの場合は、Ubuntuを指定する必要あり。(本記事ではこのパターン)
  • セルフホストランナーの場合は、LinuxマシンかつDockerをインストールしておく必要あり。
  • 4−5行目:servicesキーワードを使用することで、ジョブ実行時にDockerコンテナが立ち上がる。(本記事の例では「db」というラベル/名前をつけています)
  • 7−8行目:ランナーマシン上(Dockerのホスト)から接続する場合は、コンテナのポートを公開しておく必要あり。(本記事ではこのパターン。ローカルホストの3306ポートをコンテナの3306ポートに繋ぐようにしているので、「localhost:3306」として接続可能。)
  • 別のDockerコンテナ内から接続する場合は、ポート番号は不要で、ラベルで接続可能。
  • 9−13行目:MySQLコンテナの環境変数を設定。詳細はDockerHubのMySQL参照。
  • 10行目:MYSQL_ROOT_PASSWORDにてrootユーザのパスワードを設定。これがないと、後述のヘルスチェック失敗?
  • 11行目:MYSQL_DATABASEでデータベース名を指定することで、コンテナ作成時に指定した名前のデータベースを作成してくれる。
  • 12−13行目:MYSQL_USERMYSQL_PASSWORDを指定することで、コンテナ作成時root以外のユーザを作成。このユーザはMYSQL_DATABASEで指定したデータベースに対する権限あり。なお、使い捨てかつワークフローのDocker上という特性上、ここで設定するパスワードに対し神経質になる必要はないと思ってしまっています。
  • 14−18行目:ハマりポイント。コンテナのヘルスチェックを定義しておく。これがないと、コンテナの準備が整う前にワークフローが進んでしまい、接続エラーなどでジョブが落ちる模様。ググるとよく出くわす解決策。
  • 20-21行目:デバッグ用途。MySQLのコンテナがhealthyになっていることを確認できます。
  • 22−25行目:ランナーマシン上からのMySQL利用例。rootユーザとuser1ユーザでそれぞれMySQLに接続し、データベースの一覧を取得しています。
  • 23,25行目:地味にハマりポイント。–protocol=tcpを指定しておかないと、ローカルホストにアクセスする際はソケットファイル(mysql.sock)を見にいってしまい、接続できない。
  • 23,24行目:誤記と思うかもですが、パスワードを指定する-pオプションについて、パスワードとの間にスペースは含めません

参考

GitHub ActionsのPostgreSQLサービスコンテナについての公式ドキュメント。ほぼこれを参考にしました。

PostgreSQLサービスコンテナの作成 - GitHub Docs
ワークフローで利用するPostgreSQLサービスコンテナを作成できます。 このガイドでは、コンテナで実行されるジョブか、ランナーマシン上で直接実行されるジョブのためのPostgreSQLサービスの作成例を紹介します。

GitHub Actionsのサービスコンテナについての公式ドキュメント。サービスコンテナ全般の概要はこちら。

サービスコンテナについて - GitHub Docs
サービスコンテナを使って、データベース、Webサービス、メモリキャッシュ、あるいはその他のツールをワークフローに接続できます。

DockerHubのMySQLの公式。コンテナのオプションなどはこちらを参照。

mysql - Official Image | Docker Hub
MySQL is a widely used, open-source relational database management system (RDBMS).

冒頭で少し触れたTestcontainersについてもリンクしておきます。

Testcontainers
Testcontainers is an opensource framework for providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can r...

コメント

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