kkamegawa's weblog

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

.NET CoreアプリをVSTSで継続的インテグレーションする(Windows版)

はじめに

昨日dotnetConf関西で行ったセッション資料ではCI/CDの細かいやり方はのせていませんでしたので、ブログで詳細の解説を行います。 CIそのものはメニューのBuild & Releaseから構築します。この記事では新しいUIで説明していますが、以前のUIでもあまり関係ありません。
長くなったので、Linux版は別にします。

VSTSとビルドエージェント

VSTSには内蔵のビルドエージェント(Hosted Agent)があります。Hostedは今のところWindowsのエージェントのみになっているので、LinuxやMac環境でビルドする場合、独自のビルドサーバーを用意する必要があります。
ビルドエージェントは一台までであれば無料で接続できます。httpsのoutboundだけ通信できていればいいので、Firewallがある環境でも大体大丈夫です。

有料($15/月)支払って、一つのプールに二台以上のビルドエージェントを運用すると、並列でビルドができるようになります。並列可能ということ以外にも、エージェントを占有するので、占有しているエージェントではリポジトリのクローンが頻発しなくなるはずです。
原則1台1エージェントですが、登録するときにエージェントの名前を変えれば、一台のサーバーに複数のエージェントが登録できます。例えば、TFSとVSTSそれぞれ登録するとかもできます。サーバーの性能次第ですが、複数のVSTS/TFSを使っているときは試してみてください。

エージェントの対応OS

  • .NET CoreがサポートするWindows
  • Ubuntu 14.04/16.04(サービスとして動かす場合は16.04必須)
  • Red Hat Enterprise Linux 7.x
  • OS X 10.10/10.11

TFS 2015に接続する場合、WindowsではTFSに付属しているエージェントを使ってください。TFS "15"ではPAT(Personal Access Token)をサポートするので、.NET Core版のエージェントが使用可能になります。
VSTSのエージェントはソースも公開されています。

github.com

Windows(Hosted)で.NET Coreアプリをビルドする

では、実際にビルド定義を作ってみましょう。ASP.NET Core MVCアプリケーションを作ってコミットしておきます。
Visual Studioのテンプレートを使ってもいいですが、大部分を削除することになります。

NuGetの復元タスクを追加

f:id:kkamegawa:20160919120827p:plain

Add build stepからUtilityにあるCommand Lineを追加します。

NuGetパッケージを復元する
Tool: "c:\Program Files\dotnet\dotnet.exe"
Arguments : restore Working Folder : Project.jsonのあるフォルダ

ビルドタスク

ビルド用のCommand LineをAdd build stepで追加します。

Tool: "c:\Program Files\dotnet\dotnet.exe"
Arguments : build -c $(BuildConfiguration) Working Folder : Project.jsonのあるフォルダ

※:BuildConfigrationはVariablesでreleaseと作っておいてください(Visual Studioのテンプレートから作った場合は作られています)

f:id:kkamegawa:20160919141406p:plain

テストプロジェクトのNuGetパッケージを復元する

テストプロジェクトのNuGetパッケージ復元のCommand LineをAdd build stepで追加します。

Tool: "c:\Program Files\dotnet\dotnet.exe"
Arguments : restore Working Folder : テストプロジェクトのProject.jsonがあるフォルダ

テストの実行

テスト実行用のCommand LineをAdd build stepで追加します。

Tool: "c:\Program Files\dotnet\dotnet.exe"
Arguments : test -xml TestResult.xml Working Folder : テストプロジェクトのProject.jsonがあるフォルダ

Visual Studioでビルドする場合と異なり、プロジェクト単位でdotnet restoreを実行する必要があるので気を付けてください。

-xml にはテスト結果を出力するxmlファイルを指定します。テストプロジェクトごとに異なる名前にしてください。後で集計することができなくなります。

dotnetコマンドはフルパスで指定しなくても実行できますが、ビルド時に警告が出るので、フルパスを指定するほうが無難です。

テスト結果をVSTSにアップロード

f:id:kkamegawa:20160919120828p:plain

Add build stepで"Publish Tests Results"タスクを追加して、ビルド結果をVSTSにアップロードします。VSTEST以外にもXUnit,NUnit,JUnit(Javaなので.NET Coreには関係ないですが)などに対応しています。

f:id:kkamegawa:20160919142327p:plain

テスト結果をVSTSにアップロードすると、このようにテスト結果の品質を追跡することができます。

LnuxもしくはOS/Xでビルドする場合、出力するXMLファイル名の大文字小文字に気を付けてください。

コードカバレッジも取れるはず…Visual Studioでは取れていますが、VSTSでは集計されていません。これは少し調査します。

パッケージの出力

パッケージ出力用のCommand LineをAdd build stepで追加します。

f:id:kkamegawa:20160919120829p:plain

出力パッケージを作ります。具体的にはproject.jsonで定義されているpublishの動作が実行されます。

docs.microsoft.com

Tool: "c:\Program Files\dotnet\dotnet.exe"
Arguments : publish src/{プロジェクト名} --configuration $(BuildConfiguration) --output $(PublishOutput) --framework $(NETCoreVersion)

注意点として、publishコマンドはデフォルトでデバッグ版を出力しています。--configurationで明示的にrelease版(ここではvariablesで指定しています)を指定してください。Azureではデバッグ版実行できない(エラーになる)はずなのですが、なぜかデバッグ版をデプロイしてもApp Serviceで動いてしまってます。長い間気づきませんでした。

Framework Runtimeは組み込むか、システムインストールを使用するかはご自由に。今回はシステム組み込みのランタイムを使用する前提でやっています。

f:id:kkamegawa:20160919142328p:plain

bin\$(BuildConfiguration)\ にあるアプリケーションの実体をコピーするタスクです。このタスクは非.NET CoreのASP.NET前提のタスクのようで、フォルダ構成をそのままコピーしてくれません。

IIS(Azure App Service)にデプロイする場合、これで問題ないのですが、Linuxにデプロイするとこのタスクでは実行時に「\bin\$(BuildConfiguration)\netcoreapp1.0\モジュール名」が存在しないというエラーになります。

特別にタスクを作るか、project.jsonのpublishOptionsにbin/releaseを含めるしかないように思います。今回はproject.jsonに入れています。あと、各種jsonファイルも入っていない場合、Linux(たぶんOS/Xも)実行失敗するので、jsonファイルを忘れないようにpublishOptionsに入れましょう。

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "appsettings.json",
      "project.json",
      "bin/release",
      "web.config"
    ]
  }

リリース作業用PowerShellスクリプト追加

f:id:kkamegawa:20160919120830p:plain

ここはApp ServiceにリリースするためのPowerShellスクリプトをリリース成果物としてコピーするタスクですビルド時にデプロイするなら不要です。

WebDeploy用zipファイル作成

f:id:kkamegawa:20160919120831p:plain

IIS(Azure App Service)にwebdeployでデプロイする場合、zipパッケージを作っておく必要があります。webdeployを使わない場合は不要です。

VSTSにリリース成果物を登録

f:id:kkamegawa:20160919120832p:plain

最後に成果物をVSTSにコピーします。特定のファイル共有にコピーするか、VSTSに保存します。ファイル共有はUNCでVSTSもしくはビルドエージェントからアクセスできる必要があります。

UNCで共有フォルダにコピーする場合、独自のビルドエージェントからになるでしょうね。

TFS "15" RC1公開

blogs.msdn.microsoft.com

Team Foundation Server "15" RC1 | Visual Studio

次期TFSのRC1が公開されています。現時点では、日本語優先にしているブラウザで見るとPreview版のリリースノートが表示されますが、一番下にあるロケール設定でUnited Statesに変更すると英語版が見えます。RC1で変更されたところだけ別に書かれているので、見比べると差分がわかります。

残念ながらRC1の日本語版は出ないようなので、次に期待ですかね…どうしても使いたい場合は英語OS,英語SQL Serverでインストールしてみてください。ブラウザが日本語受け入れる設定になっていれば、日本語UIで表示されます。

TFS "15"ではソフトウェアの要件が変わっています。

www.visualstudio.com

  • Windows Server 2016サポート(2008 R2までサポート)
  • SQL Server 2016サポート(例によってCU1入れたほうがいいでしょう)

SharePoint 2016サポートしないってのはちょっと意外ですが、将来のUpdateでやるんでしょうかね。

RC2は出ることが決まっていますが、RC3はRC2までのフィードバック次第、ということだそうです(でも最近の品質を見ると出さないといけないんじゃないかな…)。

テスト関係のUIがものすごく変わっていますね。もうほとんどTest Managerリッチクライアント必要なさそうな。より大規模環境での品質状態のトラッキングがやりやすくなっていますね(VSTSと同じですが)。また、Chrome拡張機能を使用した探索テストの強化が著しいですが、Edgeにも出してほしいものです。

コード検索が入ったけど、Elastic Search使っているとはちょっとびっくりです。これにより、コード検索を使う場合、TFSにもJava Runtimeが必要になります。Server JREでいいそうですが、OracleのサイトにはWindows版にもかかわらず、tar.gzしかなかったので、私はJDKを入れました。事前にJAVA_HOMEの環境変数を設定して、インストーラーが環境変数を認識できるようにしておかないと(つまり再起動しておかないと)インストーラーが失敗します。

Elastic Searchを疑うわけじゃないけど、Java使っているということで、wavedashとかhalfwidth kanaとか大丈夫なんかな…。ちょっと調べてみたいところです。

個人的にはNuGetパッケージサーバー機能がありがたいですね。オンプレミスでNuGet使いたい場合、もともと立てる方法はありますが、TFS使っているなら統合されていたほうが便利ですし。VSTS使っている人ならわかると思いますが、フィードを見せる見せないといったセキュリティが統合されているのは便利です。

TFS2015 Update3でSonarQube連携ができない場合の対処

TFSおよび、VSTSでビルド時にSonarQubeを呼び出すことにより、C#コードの静的解析及び、品質情報の管理を行うことができます。

Microsoft Azure - SonarQube と TFS による技術的負債の管理

SonarQube™ » Announcing SonarQube integration with MSBuild and Team Build

最初はうまく動いていたのですが、Update3のころからうまく動かなくなっていました。原因はConnectに報告するときに調べていたのですが、その通りだよということでした。

SonarQube Tasks Failed in non-english OS | Microsoft Connect

例によって、ビルドタスクのエンコーディングがANSIで、- がコードページISO-8859-1の文字だったおかげで、英語OS以外では動かないということです。

Invoke-BatchScript $bootstrapperPath -Arguments $arguments

根本対処はTFS 2015 Update4かTFS15(Preview)になるとのことなので、以下の回避策を使用します。

  • 各エージェントのtasks\SonarQubePreBuild\1.0.35フォルダにあるSonarQubePreBuild.ps1 をUTF-8に変更して、上記のように編集する。
  • クロスプラットフォーム用ビルドエージェントtfs toolを使って、1.0.36のビルドタスクをアップロードする

簡単なのは前者ですね。ビルドタスクにはそもそもこういう英語OS以外ではうまく動かないってのがたまに出てくるので、注意が必要です。

Visual Studio 2015 Update3適用後に拡張機能でエラーになった場合の対処(更新:パッチリリース)

Visual Studio 2015 Update3適用後にこんな現象が出ることがあります。

これはソリューションエクスプローラーですが、私はチームエクスプローラーで起きました。

f:id:kkamegawa:20160710133650p:plain

拡張機能のパッケージ読み込みに失敗したといわれます。原因はどちらも同じで、コンポーネント関係のキャッシュが壊れてしまうことです。一番よく出るのはUpdate 3適用直後です。私も一つの環境で起きて困りました。VSをアンインストールしても変わりません。

対処方法としては、Visual Studioを一度終了させて、%localappdata%\Microsoft\VisualStudio\14.0\ComponentModelCache フォルダをさっくり消してください。このフォルダはVisual Studioが自動生成するので消しても問題ありません。

一応報告はしています(あれ…出てこない…)。

(7/22追記)
7/20に公開された14.0.25424.00(KB3165756)でこの問題に対処したようですね。

Update for Microsoft Visual Studio 2015 Update 3 (KB3165756)

Issue 5
After you install Windows updates, you may see various package load failures when you start Visual Studio. Although this update fixes this issue, you can also delete the ComponentModelCache folder as a workaround.

他にもMSDNフォーラムで見かけたCMFCToolBarButtonのバグとかも直っているようです。