kkamegawa's weblog

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

RedGate ReadyRollで継続的インテグレーションするときの注意点

ReadyRoll Core

Visual Studio 2017 Enterpriseには、RedGate社のReadyRollという、SQL Serverに対して構成の履歴や差分を比較するためのツールが付属しています(Proにはついていません)。フルライセンスはOracleに対応したり、より高度なことができるのですが、Visual Studio 2017にはCoreエディションという機能制限版となっています。

blogs.msdn.microsoft.com

SSDTと何が違うの?ということですが、FAQに載っています。

www.red-gate.com

SSDTはステートベース、ReadyRollはマイグレーションファースト、という説明で方向性が違う…らしいです。まだ私も使いこんでないので、ありがたい状況がよくわかってません。誤解を恐れずに言えば、EntityFrameworkのマイグレーションと同じことができると。単純なシナリオならSSDTでも問題ない、と書いていますね。

Octopus Deployと組み合わせることにより、複数のデータベースへのデプロイ、ロールバックも対応しています。

www.red-gate.com

Proバージョン

Visual Studio 2017に付属しているのはCore Editionなので、機能が結構制限されています。制限されているリスト(上のURLにも載っています)。

  • Work quickly and efficiently with code-based objects e.g. stored procedures (Programmable Objects feature)
  • Offline Schema Model for object-level history
  • Include static data alongside schema changes
  • Customize schema and data comparison options
  • Customize schema comparison filters
  • Generate a diff report of database changes
  • Generate a schema drift report
  • Generate a schema drift correction script
  • Easy deployment of CLR database objects
  • Visual Studio 2012/2013/2015 All Edition Support

VS Enterpriseで試してよさそうなら使ってみてもいいと思います。

継続的インテグレーション時の注意点

Visual Studio単体でビルド&デプロイするときはいいのですが、VSTSやTFSなどで継続的インテグレーションを実行するとエラーになります。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\ReadyRoll\ReadyRoll.Data.Schema.SSDT.targets(145,5): Error : An error occurred while attempting to verify your deployment scripts: A connection was successfully established with the server, but then an error occurred during the login process. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.)

原因はsqlprojファイルのReadyRollTargetPathがpackagesフォルダを参照していないためです。以下の手順で対処してください。

  1. ReadyRollプロジェクトを右クリックして、「アンロード」を選択。
  2. プロジェクトファイルが「利用不可」になるので、右クリックして、「編集」
  3. ReadyRollTargetsPath というセクションを探して、以下のように編集。

f:id:kkamegawa:20170408165807p:plain

<ReadyRollTargetsPath Condition="Exists('$(MSBuildThisFileDirectory)..\packages')">$([System.IO.Directory]::GetDirectories('$(MSBuildThisFileDirectory)..\packages', 'ReadyRoll.MSBuild.*')[0])\tools\ReadyRoll.Data.Schema.SSDT.targets</ReadyRollTargetsPath>

これで、sqlprojファイルを保存して、プロジェクトを右クリックから「再読み込み」してください。コミットすればVSTS/TFSでビルドできるはずです。これ実はチュートリアルには書いてなくて、ビルドの設定のところに書かれています。

https://documentation.red-gate.com/display/RR1/Build+components

注意点として、ドキュメントにも書かれていますが、ソリューションファイル(sln)が「親フォルダにない場合」このままコピペでは動きません(Visual Studioから普通に作ったら親フォルダにslnがあります)。..\packages のところを適切に変更してください。