データベースとサービス コンテナ

Bitbucket Pipelines では、ビルド パイプラインから複数の Docker コンテナを実行できます。アプリケーションのテストと運用で、パイプラインで追加サービスが必要になる場合、追加のコンテナを起動する必要がある場合があります。この追加サービスには、データ ストア、コード分析ツール、およびスタブ Web サービスなどが含まれます。

このような追加サービスやその他のリソースは、bitbucket-pipelines.yml ファイルの definitions セクションで定義します。これらのサービスはその後、サービスを必要とする任意のパイプラインの構成で参照されます。

パイプラインの実行時、bitbucket-pipeline.yml のステップで参照されているサービスが、パイプライン ステップ内で実行されるようにスケジューリングされます。これらのサービスは、ビルド コンテナとネットワーク アダプタを共有するほか、localhost でオープンなポートを共有します。ポート マッピングやホスト名は不要です。たとえば、Postgres を使用している場合、localhost のポート 5432 に接続するだけでテストを行えます。デバッグを行う場合、Pipelines の UI でサービスのログを確認できます。

Pipelines では、ビルド ステップあたりのサービス コンテナは最大 5 つに制限されます。サービス コンテナへのメモリの割り当て方法については以下のセクションを参照してください。

チュートリアル

次のチュートリアルでは、サービスを定義する方法、それをパイプラインで使用する方法について説明します。

はじめる前に

Pipelines のサービスには次の制限があります。

  • 1 ステップあたり最大 5 サービス

  • メモリ制限は次に記載のとおりです

  • パイプライン結果のサービスやログにアクセスするための REST API は提供していません。

  • サービスの起動を待機するためのメカニズムは提供していません

  • 小規模なサービスを大量に実行したい場合は、Docker run または docker-compose をご利用ください

  • ポート 29418 は使用できません

サービスの定義

サービスは、bitbucket-pipelines.yml ファイルの definitions セクションで定義されます。

たとえば、次の例では 2 つのサービスを定義しています。redisライブラリ イメージ redis を Docker ハブ (バージョン 3.2) から使用し、databaseDocker Hub の公式 MySQL イメージ (バージョン 5.7) を使用します。

variables セクションでは、リテラル値または既存のパイプライン変数として変数を定義できます。

1 2 3 4 5 6 7 8 9 definitions: services: redis: image: redis:3.2 mysql: image: mysql:5.7 variables: MYSQL_DATABASE: my-db MYSQL_ROOT_PASSWORD: $password

サービス メモリの制限

各サービス定義では、memory キーワード (メガバイト単位) を使用してサービス コンテナーにカスタムのメモリ制限を定義することもできます。

関連するメモリ制限および既定の割り当ては次のとおりです。

  • 標準ステップのメモリの合計は 4096 MB、大規模なビルド ステップ (サイズ: 2x を使用して定義可能) のメモリの合計は 8192 MB です。

  • ビルド ステップに割り当てられた合計メモリは、ビルド コンテナーとビルド ステップで定義されたすべてのサービス コンテナーに分配されます。ビルド コンテナーは、ビルド ステップで定義されたスクリプトを実行します。サービスがある場合は、サービス コンテナーによって実行されます。

  • サービス コンテナーに割り当て後、残りのメモリはビルド コンテナーに割り当てられます(次の例をご参照ください)。サービスが定義されていない場合は、ビルド ステップに割り当てられたすべてのメモリがビルド コンテナーに割り当てられます。

  • ビルド コンテナーには最低 1024 MB のメモリが必要です。このビルド コンテナーのメモリによって、ビルド プロセスと一部の Pipelines オーバーヘッド(エージェント コンテナー、ログなど)が網羅されます。これによって、サービス コンテナーに割り当てられるメモリは、1x/2x ステップでそれぞれ最大 3072/7128 MB になります。

  • サービス コンテナーは既定で 1024 MB のメモリを取得しますが、128 MB とステップの最大値(3072/7128 MB)の間で使用量を設定できます。

  • Pipelines での操作に使用される Docker サービスは、1024 MB の既定メモリを保持しています。ただし、[定義] セクションで組み込み Docker サービスのメモリ設定を変更することにより、この値を 128 MB と 3027/7128 MB の間の任意の値に調整できます。注:明示的に指定されていなくても、すべてのパイプに Docker サービスが必要です。 

次の例では、ビルド コンテナーにビルド ステップで使用可能な総メモリ(4096 MB)から 2048 MB のメモリが割り当てられています

  • Docker サービスには 512 MB のメモリが割り当てられています

  • Redis サービスには 512 MB のメモリが割り当てられています

  • MySQL サービスには 1024 MB の既定メモリが割り当てられています

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 default: # "Build step is allocated 4096 MB of memory" - step: services: - redis - mysql - docker script: - echo "Build container is allocated 2048 MB of memory" - echo "Services are allocated the memory configured. docker 512 MB, redis 512 MB, mysql 1024 MB" definitions: services: redis: image: redis:3.2 memory: 512 docker: memory: 512 # reduce memory for docker-in-docker from 1GB to 512MB mysql: image: mysql:5.7 # memory: 1024 # default value variables: MYSQL_DATABASE: my-db MYSQL_ROOT_PASSWORD: $password

次の例では、サービスが使用されていないため、ビルド コンテナーにビルド ステップで使用可能なすべてのメモリ(4096 MB)が割り当てられています。

1 2 3 4 5 6 default: # "Build step is allocated 4096 MB of memory" - step: script: - echo "Build container allocated 4096 MB of memory"

次の例では、パイプがサービス コンテナーとして扱われており、1024 MB の既定メモリが割り当てられています。ビルド コンテナーには、ビルド ステップで使用可能な総メモリ(4096 MB)から 3072 MB のメモリが割り当てられます。

1 2 3 4 5 6 7 8 9 10 11 12 default: # "Build step is allocated 4096 MB of memory" - step: script: - echo "Build container is allocated 3072 MB of memory" - echo "Pipe use Docker service that use 1024 MB of memory" - pipe: atlassian/scp-deploy:1.4.1 variables: USER: 'ec2-user' SERVER: '127.0.0.1' REMOTE_PATH: '/var/www/build/' LOCAL_PATH: '${BITBUCKET_CLONE_DIR}/*'

パイプラインでのサービスの使用

bitbucket-pipelines.yml ファイルの "definitions" セクションでサービスを定義したら、そのサービスを任意のパイプライン ステップで参照できます。

たとえば、次の例では redis サービスをステップで実行します。

1 2 3 4 5 6 7 8 default: - step: image: node script: - npm install - npm test services: - redis

プライベート イメージの使用

アクセスを制限するサービスを次の例のように定義できます。

1 2 3 4 5 6 services: redis: image:  name: redis:3.2 username: username@organisation.com password: $DOCKER_PASSWORD

異なるレジストリやフォーマットの Docker イメージを使用するためのその他の例については、「Docker イメージをビルド環境として使用する」をご参照ください。

完全な例

この bitbucket-pipelines.yml のサンプル ファイルは、サービスの定義と、パイプライン ステップでのサービスの使用方法の両方を示します。動作のブレイクダウンを後述しています。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 pipelines: branches: main: - step: image: redis script: - redis-cli -h localhost ping services: - redis - mysql definitions: services: redis: image: redis:3.2 mysql: image: mysql:5.7 variables: MYSQL_DATABASE: my-db MYSQL_ROOT_PASSWORD: $password

Bitbucket Pipelines でデータベースを使用してテストする

データベースをテストする際には、サービス コンテナを使用して、データベース サービスをリンクされたコンテナ内で実行することをおすすめします。Docker の Docker Hub では、一般的なデータベースに対応する多数の公式イメージが提供されています。

このページでは、次のデータベース タイプに接続するための bitbucket-pipelines.yml ファイルの例を示しています。

オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます。

Bitbucket Pipelines でサービスとデータベースを使用する」もご参照ください。

また、必要なデータベースを含む Docker イメージを使用することもできます。このページの「データベースを構成済みの Docker イメージを使用する」をご参照ください。

MongoDB

Docker Hub の Mongo イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - mongo definitions: services: mongo: image: mongo

MongoDB は 127.0.0.1:27017 で認証なしで利用できます。データベースに接続すると、MongoDB が代理で作成します。

MongoDB の既定構成は IPv4 の接続のみをリッスンしますが、Mongo 接続で localhost を使用するように構成している場合、Ruby などの一部のプラットフォームは既定で IPv6 経由での通信を行うことにご注意ください。接続先として localhost ではなく 127.0.0.1 を推奨しているのはこのためです。

MySQL – テスト ユーザー

Docker Hub の MySQL イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - mysql definitions: services: mysql: image: mysql:5.7 variables: MYSQL_DATABASE: 'pipelines' MYSQL_RANDOM_ROOT_PASSWORD: 'yes' MYSQL_USER: 'test_user' MYSQL_PASSWORD: 'test_user_password'

MySQL への接続

上述の例を使用した場合、MySQL (バージョン 5.7) を次のように利用できます。

  • ホスト名: 127.0.0.1 (localhost の使用は避けます。一部のクライアントがローカルの "Unix socket" 経由での接続を試みるが、これは Pipelinesでは動作しないためです。)

  • ポート: 3306

  • 既定のデータベース: pipelines

  • ユーザー: test_user、パスワード: test_user_password(MySQL の root ユーザーにアクセスすることはできません)。

pipelines データベースにテーブルやスキームを入力する必要があります。基盤となるデータベースをさらに構成する必要がある場合、詳細について公式の Docker Hub イメージをご参照ください。

MySQL – root ユーザー

Docker Hub の MySQL イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - mysql definitions: services: mysql: image: mysql:5.7 variables: MYSQL_DATABASE: 'pipelines' MYSQL_ROOT_PASSWORD: 'let_me_in'

MySQL への接続

上述の例を使用した場合、MySQL (バージョン 5.7) を次のように利用できます。

  • ホスト名: 127.0.0.1 (localhost の使用は避けます。一部のクライアントがローカルの "Unix socket" 経由での接続を試みるが、これは Pipelinesでは動作しないためです。)

  • ポート: 3306

  • 既定のデータベース: pipelines

  • ユーザー: root、パスワード: let_me_in

pipelines データベースにテーブルやスキームを入力する必要があります。基盤となるデータベースをさらに構成する必要がある場合、詳細について公式の Docker Hub イメージをご参照ください。

PostgreSQL – 既定ユーザー

Docker Hub の Postgres イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - postgres definitions: services: postgres: image: postgres

PostgreSQL は localhost:5432 で、既定データベース "postgres"、ユーザー "postgres"、パスワードはなしで利用できます。postgres データベースにテーブルやスキーマのデータを入力するか、使用するデータベースを新しく作成する必要があります。基盤となるデータベース エンジンをさらに構成する必要がある場合、詳細について公式の Docker Hub イメージをご参照ください。

PostgreSQL – テスト ユーザー

Docker Hub の Postgres イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - postgres definitions: services: postgres: image: postgres variables: POSTGRES_DB: 'pipelines' POSTGRES_USER: 'test_user' POSTGRES_PASSWORD: 'test_user_password'

PostgreSQL は localhost:5432 で、既定データベース "pipelines"、ユーザー "test_user"、パスワード "test_user_password" で利用できます。pipelines データベースにテーブルやスキームを入力する必要があります。基盤となるデータベース エンジンをさらに構成する必要がある場合、詳細について公式の Docker Hub イメージをご参照ください。

Redis

Docker Hub の Redis イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 image: node:10.15.0 pipelines: default: - step: script: - npm install - npm test services: - redis definitions: services: redis: image: redis

Redis は localhost:6379 で認証なしで利用できます。

Cassandra

Docker Hub の Cassandra イメージを使用します。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 image: node:10.15.0 pipelines: default: - step: script: - npm install - sleep 10 # wait for cassandra - npm test services: - cassandra definitions: services: cassandra: image: cassandra variables: MAX_HEAP_SIZE: '512M' # Need to restrict the heapsize or else Cassandra will OOM HEAP_NEWSIZE: '128M'

Cassandra は localhost:9042 で利用できます。

データベースを構成済みの Docker イメージを使用する

データベース用に独立したコンテナを実行する手順 (推奨手順) の代替案として、データベースをインストール済みの Docker イメージを使用できます。Node や Ruby の次のイメージはデータベースを含み、他の言語やデータベース用に拡張可能です。

カスタム名の Docker サービスを定義する

また、「docker-custom」呼び出しを明示的に追加してカスタム名で「タイプ」を定義することで、docker サービスにカスタム名を使用できます。次の例をご参照ください。

カスタム名の Docker サービス:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 definitions: services: docker-custom: type: docker image: docker:dind pipelines: default: - step: runs-on: - 'self.hosted' - 'my.custom.label' services: - docker script: - docker info

    その他のヘルプ