CloudBuildでNode.jsアプリでJestテストの実行を行う際、テスト用mysqlコンテナにアクセスする方法の解決に時間がかかったので、メモとして残しておく。
目的
- 前提として、node.jsで作成したnode_appコンテナがあり、appコンテナのテスト実行で外部のmysqlコンテナにアクセスする。
手順
アプリコンテナからアクセスするmysqlコンテナを用意
- cloudbuildからは、docker-composeで事前に立ち上げるため、以下のyamlを作成
- CloudBuildからアクセスできるようにnetworks/externalにcloudbuildという名前で追記
version: '3'
services:
mysql:
container_name: "mysql"
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test_db
- TZ=Asia/Tokyo
ports:
- '3306:3306'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql/conf:/etc/mysql/conf.d/:ro
- mysqldata:/var/lib/mysql
networks:
default:
external:
name: cloudbuild
volumes:
mysqldata:
node.jsアプリのconfig設定
- node.jsアプリコンテナからテスト用mysqlコンテナにアクセスできるように設定
"test": {
"username": "root",
"password": "password",
"database": "test_db",
"host": "mysql",
"dialect": "mysql",
},
リンク
リンク
CloudBuildで実行させる処理を記載
- 事前に準備したmysqlコンテナをdocker-composeで起動させる
- テストを実行させるアプリコンテナをビルド
- docker runでテスト実行する
- docker runコマンドには、事前に準備したdocker-composeファイルnetworl/externalに記載した名前(cloudbuld)を–networkオプションにを指定すればOK
steps:
# test container setup
- name: 'docker/compose:1.23.2'
args: ['-f', 'docker-compose-cloudbuild.yml',
'up', '-d', '--build']
# build the container test image
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'asia.gcr.io/$PROJECT_ID/node_app:test', '.' ]
# test run
- name: 'gcr.io/cloud-builders/docker'
args: [ 'run', '--network=cloudbuild', 'asia.gcr.io/$PROJECT_ID/node_app:test',
'npm', 'run', 'test' ]