kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

Visual Studio Team Services CI/CDアドベントカレンダー:データベースへのCI/CD(10日目)

はじめに

これはVisual Studio Team Servicesのアドベントカレンダー10日目の記事です。

qiita.com

CI/CDといえば、プログラムが主ですが、データベースにデプロイするときはどうしているでしょうか。Visual Studio 2017 Enterpriseに付属するReadyRollを使ってCI/CDをやってみましょう。Re

なお、VS2017に付属するReadyRollはCoreエディションなので、一部機能のみですが、SQLに対するIntelliSenceとかは使えます。SSDTに内蔵されているものよりも高機能に見えます。

www.red-gate.com

Pro/Communityエディション向けには体験版が用意されています。

marketplace.visualstudio.com

ReadyRollはSQL Server(SQL Database)専用ですが、開発しているRedGate社はMySQLやOracle DBに対応した製品も販売しているようです。

www.red-gate.com

RedGate ReadyRollとEntity Frameworkの違い

データベースの管理ではないですが、移行をサポートしたものとしてすぐに思いつくのはEntity FrameworkのCode Firstとの違いです。以前も書いたのでこちらをみてください。

kkamegawa.hatenablog.jp

ただ、VSTSと組み合わせると結構便利なこともあります。ちょっと見てみましょう。

拡張機能の追加

marketplace.visualstudio.com

まず、対象のVSTSにReadyRoll拡張機能を追加します。この拡張機能そのものは無償です。ライセンスはあくまでもクライアントのみにかかるようです。追加すると、ReadyRollのビルドタスクが表示されます。

ビルド定義を作る

f:id:kkamegawa:20171210172604p:plain

ReadyRollには専用のビルド定義が用意されています。こちらを選びます。

f:id:kkamegawa:20171210154152p:plain

こんな感じのビルド定義が用意されています。当然ですが、ビルドエージェントにはHosted VS2017か、Visual Studio 2017 Enterpriseがインストールされているプライベートエージェントをプールを選んでください。

f:id:kkamegawa:20171210154148p:plain

ターゲットのSQL Server(Database)を選んで接続情報を指定します。余談ですが、パスワードはAzure Key Vaultを使うこともできます。

f:id:kkamegawa:20171210154147p:plain

Variable GroupにKey Vaultを指定します。

f:id:kkamegawa:20171210154146p:plain

Key Vaultに登録したVariable Groupを参照しておけば、ビルド定義内でKey Vaultに登録しているパスワードをビルド内変数として参照できます。

f:id:kkamegawa:20171210154149p:plain

Visual StudioのビルドタスクもReadyRollように調整されています。ビルドを実行してみましょう。

f:id:kkamegawa:20171210154150p:plain

VSTSにReadyRoll拡張機能をインストールすると、Database diff scriptとDatabase scriptという項目ができています。ReadyRollプロジェクトをビルドすると、ここに表示されます。このキャプチャを取った11/26時点ではWindows 10 Fall Creators UpdateのEdgeではここが表示されないようで、Chromeでキャプチャを取りました。

f:id:kkamegawa:20171210154151p:plain

データベースに対して実行したスクリプトも表示されます。

ReadyRollでリリース

ビルドができたら次はリリースです。

f:id:kkamegawa:20171210154153p:plain

リリースでの成果物(Artifact)にReadyRollのビルド定義を指定します。

f:id:kkamegawa:20171210154154p:plain

リリースのタスクにReadyRoll deploy Database Packageがあるので、選択します。

f:id:kkamegawa:20171210154155p:plain

ビルドパッケージにはReadyRollで生成されたPowerShellスクリプトを指定します。

f:id:kkamegawa:20171210190710p:plain

このように、リリースも正常に行われています。

Visual Studioでの注意事項

f:id:kkamegawa:20171210190748p:plain

Visual StudioでReadyRollのプロジェクトを作ったときデプロイ先によって、プロジェクトのこの設定を変更してください。

特にSQL DatabaseとSQL Serverでは使えるSQLに差があります。具体的にはuse命令がSQL Databaseでは使えないので、SQL ServerのままだとSQL Databaseへのデプロイに失敗します*1

まとめ

ReadyRollを使った基本的なデプロイまで紹介しました。もちろん一回のデプロイで終わるわけはなく、継続的にリリースするときにはいろいろ考慮することがありますが、もうちょっと使いこなしてみて紹介できればと思います。

*1:最初これに気づかなかった…