はじめに
昨年後半からデータベースに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=Y
SA_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
が積極的に選ばれるかもしれませんね。
ではでは。