hero_picture
Cover Image for Bitbucket PipelinesでDocker Composeプロジェクトをインテグレーションテストする

Bitbucket PipelinesでDocker Composeプロジェクトをインテグレーションテストする

はじめまして。小國です。

今回は、Docker Compose で構築されたプロジェクトを、Bitbucket Pipelines を使ってインテグレーションテストする方法をご紹介したいと思います。

はじめに

シーズのプロジェクトの開発環境・手法は、主に以下のような構成となっています。

  • VCS に Git を使い、Bitbucket にホスティングしている
  • 各プロジェクトは Docker Compose を使い、ローカル環境を構築し、開発を行っている
  • PHPUnit などを使って、テストケースを書いている

Bitbucket Pipelines で Docker Compose を使うには

Bitbucket には Pipelines という CI/CD サービスがあり、Docker を使ったテストが行なえます。

ですが、Pipelines で Docker Compose を使うためには、自身で Docker Compose バイナリを作成しなければなりません。

参考: https://ja.confluence.atlassian.com/bitbucket/run-docker-commands-in-bitbucket-pipelines-879254331.html

今回は、Docker Compose バイナリの作成・公開し、サンプルプロジェクトを使って、Pipelines で PHPUnit のテストを実行するまでを行います。

やってみましょう

主な流れは以下のようになります。

  1. Docker Compose バイナリの作成と、作成したバイナリを Docker Hub に公開
  2. サンプルプロジェクトの作成
  3. bitbucket-pipelines.yml の作成
  4. Bitbucket で Pipelines の有効化

Docker Compose バイナリの作成と、作成したバイナリを Docker Hub に公開

なお、https://hub.docker.com/r/seedsstd/seeds_bitbucket_pipelines にほぼ同様のイメージを公開していますので、こちらを使用する方は、このステップは不要です。

  • Docker Compose バイナリの作成
1$ mkdir seeds_bitbucket_pipelines && cd seeds_bitbucket_pipelines
2$ cat <<EOF > Dockerfile
3FROM docker:stable
4# Add python pip and bash
5RUN apk add --no-cache py-pip
6RUN apk add --no-cache python-dev libffi-dev openssl-dev gcc libc-dev make
7RUN apk add --no-cache bash
8# Install docker-compose via pip
9RUN pip install --no-cache-dir docker-compose
10EOF
  • 作成したバイナリを Docker Hub に公開
1docker build -t <YOUR_ACCOUNT>/seeds_bitbucket_pipelines:stable .
2docker push <YOUR_ACCOUNT>/seeds_bitbucket_pipelines:stable

<YOUR_ACCOUNT> には、自身の Docker Hub アカウント、またはオーガニゼーションを指定してください。

1docker build -t seedsstd/seeds_bitbucket_pipelines:stable .
2docker push seedsstd/seeds_bitbucket_pipelines:stable

サンプルプロジェクトの作成

サンプルプロジェクトを作成ます。ファイル構成、内容は以下のとおりです。

1$ tree
2.
3├── composer.json
4├── composer.lock
5├── composer.phar
6├── docker-compose.yml
7├── php-apache
8│   └── Dockerfile
9└── tests
10└── SampleTest.php
112 directories, 6 files
  • composer.json
1{
2"name": "seeds-std/blog_bitbucket_pipelines",
3"authors": [
4{
5"name": "SEEDS Co.,Ltd",
6"email": "info@seeds-std.co.jp"
7}
8],
9"require": {},
10"require-dev": {
11"phpunit/phpunit": "^8.3"
12}
13}
14
  • docker-compose.yml
1version: "3"
2services:
3web:
4build: php-apache # php7.2-apache に git が入っていなかったため作成
5volumes:
6- ./:/var/www/html
7
  • php-apache/Dockerfile
1FROM php:7.2-apache
2RUN apt-get update -y && apt-get install -y git
  • tests/SampleTest.php
1<?php
2class SampleTest extends \PHPUnit\Framework\TestCase
3{
4/**
5     * @return void
6     */
7public function testTrueIsTrue()
8{
9$this->assertTrue(true);
10}
11}
12

ここでのポイントは docker-compose run --rm web bash -c "php composer.phar install && vendor/bin/phpunit tests/SampleTest.php" というような形で、ホスト側から PHPUnit のテストが実行できることです。

ためしに、実行してテストが通ることを確認しましょう。

1$ docker-compose run web /bin/bash -c "php composer.phar install && vendor/bin/phpunit tests/SampleTest.php"
2Do not run Composer as root/super user! See https://getcomposer.org/root for details
3Loading composer repositories with package information
4Installing dependencies (including require-dev) from lock file
5Nothing to install or update
6Generating autoload files
7PHPUnit 8.3.5 by Sebastian Bergmann and contributors.
8.                                                                   1 / 1 (100%)
9Time: 545 ms, Memory: 4.00 MB
10OK (1 test, 1 assertion)

良さそうですね。

bitbucket-pipelines.yml の作成

以下のような bitbucket-pipelines.yml を作成し、リポジトリの直下に含めます。

内容は、上記で作成した Docker Compose バイナリを使い、そのホストからコンテナを起動しテストする内容になっています。

1image: seedsstd/seeds_bitbucket_pipelines:stable
2options:
3docker: true
4default_script: &default_script
5- docker-compose run --rm web /bin/bash -c "php composer.phar install && vendor/bin/phpunit tests/SampleTest.php"
6- docker-compose down
7pipelines:
8default:
9- step:
10script: *default_script
11

Pipelines の有効化

最後に、Bitbucket の画面から Pipelines を有効化します。

Pipelines を有効化すると、以下のように bitbucket-pipelines.yml で指定したテストが実行されます。

テストが全て正常に終わり、以下のようになればおkです。

最後に

Bitbucket Pipelines で Docker Compose を使用したプロジェクトのテストを実行することができました。