はじめに
昨年後半からデータベースにSQLServerを使っているプロジェクトに携わっています。
TravisCIやCircleCIなどの代表的なCI as a ServiceはMySqlやPostgreSQLはサポートしていますが、SQLServerはサポートしていません。
- Setting up Databases - Travis CI
- Ubuntu 12.04 (Precise) - CircleCI#databases
- Ubuntu 14.04 (Trusty) - CircleCI#databases
ここで諦めずに、CircleCIでテスト自動化する方法を探っていきます。
Microsoft SQL Server on Linux for Docker Engine.を使う
はじめ、CIのコンテナに直接、SQL Server on Linuxをインストールする方法を考えました。
- Install SQL Server on Ubuntu - SQL Server vNext | Microsoft Docs
- SQL Server on Linux を試してみた | Developers.IO
が、CI as a Serviceでよく使われているUbuntuだと、16.04 and 16.10のみサポートしているとのことで、公式のDockerイメージを使うことにしました。
使用上の注意事項
mssql-server-linuxを使用するには、いくつか要件と制限事項があります。
要件
-
Docker Engine 1.8 以上
-
TravisCIは、バージョンを明示していないので、はっきりしたことは言えませんが、CircleCIは、1.8以上をサポートしています - Ubuntu 12.04 (Precise) - CircleCI#docker
- Ubuntu 14.04 (Trusty) - CircleCI#docker-engine
-
-
ディスク領域 4GB使用
-
メモリ 4GB 以上
-
下記の環境変数が必須
ACCEPT_EULA=YSA_PASSWORD=<YourStrong!Passw0rd>
制限事項(2017年1月15日現在)
ボリュームのマッピングに対応してません。
したがって、データの永続化ができません。
CIでテスト自動化する分には問題ありませんが、ローカルの開発環境にはほぼ使えないかと思います。
PHPで小さいアプリを作り、docker-composeで動かす
PHPでDBマイグレーションするだけの小さいアプリを作り、mssql-server-linuxコンテナとリンクするようにしました。
docker-compose.ymlは下記のとおりです。
# docker-compose.yml
mssql:
build: ./docker/mssql
env_file: ./docker/mssql/.env
ports:
- "1433:1433"
php:
build: ./docker/php
env_file: ./docker/php/.env
links:
- mssql
volumes:
- .:/data/
githubにレポジトリを公開してますので、詳細はそちらをご確認ください。
CircleCIで動かしてみる
circle.ymlは、最終的に下記のようになりました。
# circle.yml
machine:
timezone:
Asia/Tokyo
services:
- docker
dependencies:
override:
- docker-compose up -d
- docker-compose run php composer install
database:
override:
- docker-compose run php php app/bootstrap.php
test:
override:
- docker-compose run php vendor/bin/phpunit
docker-compose.yml のフォーマットは、Version 1のみサポート
CircleCIにおいて、Version 2は、現状、サポートされないので、Version 1で記述します。
-
Version 2は、composer 1.6 以上、および、docker engine 1.10 以上が必要
テスト
マイグレーションで投入した3件のレコードを取得して、件数があっているか確認するだけのテストをPHPUnitで実行します。
<?php
class Example extends PHPUnit_Framework_TestCase
{
/** @var PDO */
private $pdo;
public function setUp()
{
$container = require __DIR__. '/../app/container.php';
$this->pdo = $container['db'];
}
/**
* @test
*/
public function findRecords()
{
$sql = <<<SQL
SELECT * FROM [user] WHERE [id] in (1, 2, 3);
SQL;
$records = $this->pdo->query($sql)->fetchAll();
$this->assertCount(3, $records);
}
}
下記のように、OKが出れば成功です。
おわりに
とかくプロプライエタリなソフトウェアな印象が強いSQLServerですが、Microsoft SQL Server on Linuxの登場によって、UNIXベースのエコシステムに乗っけやすくなってきました。
Windows AzureでPHPを動かす場合であってもMySQLが選ばれてきたケースが多いと思いますが、今後はSQLServerが積極的に選ばれるかもしれませんね。
ではでは。
