kkamegawa's weblog

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

Hosted VS2017エージェントを使ってXamarinプロジェクトを継続的インテグレーションする

追加でこういう質問を受けたので、調べてみました。結論から言えばできます。もちろん、C# 7の機能を使っていても、対応するNuGetパッケージを入れていれば大丈夫です(一緒に生成されるライブラリプロジェクトに追加して確認)。

f:id:kkamegawa:20170411212250p:plain

一つだけ注意点として、NuGet Restoreタスクで使用するNuGetを明示的に3.5以上にしてください。ここでは4.0を指定していますが、Hosted VS2017であれば入っているので、大丈夫です。

f:id:kkamegawa:20170411212245p:plain

テンプレートから作っただけのXamarin.Formsアプリですが、こんな風にビルドできます。どうも"Visual Studio 2017"のHosted Agentなので、元からXamarinをはじめ、VS 2017に入っている機能は全部入っているようです。

f:id:kkamegawa:20170411214322p:plain

もう一つ、直接の問題ではありませんが、どうもHosted VS2017 AgentにはGit LFSが入っていないようです。フィードバックしていますので、そのうち治ると思います。

(2017/4/22更新)
4/19にVSTSの更新が入ったので、確認してみたところ、Hosted VS2017にGit LFS入ったようです。正しくビルドできました。

f:id:kkamegawa:20170422003445p:plain

C# 7.0のプロジェクトをVSTSで継続的インテグレーションする

前振り

という話があったので、ちょっと書いてみます。

C# 7.0プロジェクトを作る

f:id:kkamegawa:20170411062240p:plain

こんな風にC# 7.0の新機能であるタプルを書いてみます。

引用:ufcpp.net

もちろん素のVS2017ではエラーになるので、NuGetでValueTupleを追加します。

f:id:kkamegawa:20170411062239p:plain

ビルド定義作成

VSTSにプッシュしたら、VSTSのビルド定義を作ります。注意点は二つ。

  • Hosted AgentにVS2017を選ぶ
  • Visual Studio 2017を選択する。

f:id:kkamegawa:20170411062236p:plain

Visual Studio 2017を選びます。

f:id:kkamegawa:20170411062233p:plain

OptionsにあるエージェントからHosted VS2017を選びます。

ビルドしてみる

f:id:kkamegawa:20170411062231p:plain

Hosted VS 2017では成功します。

f:id:kkamegawa:20170411062254p:plain

普通のHosted Agentを選択すると失敗します。ちょっと前までVS2017というHosted Agentがなかったのですが、Side by Sideで動かすより、VS2017はしばしば更新されるから別にしたんでしょうかね。

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 のところを適切に変更してください。

TFS用のSQL Server照合順序の注意点

www.visualstudio.com

www.visualstudio.com

SQL Serverセットアップ時にサーバーの照合順序を決めますが、TFSをインストールする場合、選択できるサーバー照合順序には制限があります。

  • アクセントを区別する(_AS)
  • 大文字小文字を区別してはならない(_CI)
  • バイナリ(BIN)および、バイナリ照合順序(BIN2)を指定してはならない

でも、ここには書かれていないもう一つ制約事項があります。

  • 補助文字(_SC)を使用してはならない。

いわゆるサロゲートペアの文字ですね。これをシステムデータベースの照合順序に指定していると、TFSのセットアップに失敗します(フィードバック済み)。

SQL Server v.Nextでは_VSSという照合順序もついかされるそうですが、こちらもおそらくサポートされないのではないかなと思います。SQL Serverをインストールする場合、気を付けてください。

もしも_SCつきでインストールしてしまった場合、サーバー照合順序の再構築が必要になります。これをやるとセキュリティで登録済みのアカウント、チューニングパラメータとかきれいさっぱり消えます。

サーバーの照合順序の設定または変更

SQL Server 2016ではメディアを使わなくなっただけ便利になりましたが、それでも重要な作業変更なので、気を付けてください。私もWSUSを既にインストールしていたので、ログインユーザーが消えてちょっと焦りました。

番外編として、TFSからVSTSに移行する場合、日本語の照合順序は使用しないでください。移行できません。SQL_Latin1_General_CP1_CI_AS か Latin1_General_CI_ASじゃないといけないようです。もしも将来的にVSTSへの移行とか考えている場合(とはいえ、TFSはオンプレの絶対要件があるから少ないかもしれませんが)、注意してください。