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の全体像と、

example-github-actions-with-ephemeral-mysql/example.yml at main · norio-io/example-github-actions-with-ephemeral-mysql
An example of GitHub Action which uses an ephemeral MySQL. - example-github-actions-with-ephemeral-mysql/example.yml at main · norio-io/example-github-actions-w...

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

Add example · norio-io/[email protected]
An example of GitHub Action which uses an ephemeral MySQL. - Add example · norio-io/[email protected]

解説

ジョブ定義の例です。(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の公式。コンテナのオプションなどはこちらを参照。

Docker

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

Testcontainers for Java

コメント

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