kkamegawa's weblog

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

Visual Studio Team Services CI/CDアドベントカレンダー:複数段階でビルドする(6日目)

はじめに

この記事はVisual Studio Team Services Advent Calendar 6日目の記事です。

qiita.com

VSTS/TFSでは、一つのビルドで、特定のリポジトリのソースをビルドする、ということが基本になっています。もちろん、複数のリポジトリを明示的にgit cloneもできますが、一つのリポジトリに複数の種類のソースが入っているとテンプレートでは難しいこともあります。

工夫すればいいのですが、はっきりと分離できなくて、どこまでがどのビルドかわかりづらい。そんな時に使えるのがマルチフェーズビルドです。

Sprint 123で提供が始まったばかりなので、正直今のままではまだ使いづらいのですが、将来機能強化されたらもうちょっと良くなると思います。

docs.microsoft.com

複数エージェントフェーズの作り方

f:id:kkamegawa:20171206061507p:plain

簡単です。Processのところの ... をクリックして、"Add agent phase"を選択します。デフォルトではPhase 1が追加されています。

f:id:kkamegawa:20171206061508p:plain

もう一つはデフォルトでagent phaseという名前になっていますが、わかりやすい名前に変えてください。エージェントフェーズで複数のビルドエージェントの最大数を指定することもできます。既定は無制限です。エージェントをあまり多く使いたくない場合、明示的に制限します。

ビルドタスクを追加します(略)。

f:id:kkamegawa:20171206061511p:plain

今回は同じリポジトリに.NET Coreとデスクトップアプリソリューションが入っているとします。余談ですが、同じcsprojであってもdotnet coreビルドタスクではデスクトップ版のcsprojがビルドできないので、こういうのはやらないほうがいいです。もちろん、Visual Studioタスクでソリューションを指定すればいいのですが、ここは例ということで。

f:id:kkamegawa:20171206061510p:plain

ビルドすると、Phase 1(.NET Core)とDesktop Phase(.NET Desktop)が別々のフェーズとしてビルドされています。ソースは最初にダウンロードしたものを共有するので、異なるフェーズで別々にダウンロードすることはありません。

また、ビルド単位が一つなので、artifactsも一つです。

エージェントを使わないビルドフェーズ

f:id:kkamegawa:20171206061509p:plain

フェーズ追加するところにAdd agentless phaseというものがあります。これはビルドエージェントを呼び出さない(VSTS内部で実施してしまう)フェーズになります(たぶん)。

待ち時間やREST API呼び出しタスクがあるので、例えば、REST APIを呼び出して特定のサーバーに対してデプロイ前のビルド通知を行うとか、システム内で特定の設定を変更する、といったケースが考えられます…が、私がまだ理解できてないのか、このフェーズエラーになってしまいます。ドキュメントもまだない(リンク先はRelease機能用でした)ようで、ちょっと確認します。

将来の予定

複数段階のビルドができる、ということですぐに思いつくのはこの辺でしょう。

  • 各フェーズを並列ビルドしたい
  • 異なるリポジトリを一つのビルド定義で実施したい
  • LinuxとWindowsのビルドをそれぞれ実行したい
  • フェーズ単位でartifactを受け渡したい

…残念ながら現時点ではどれもできません。

docs.microsoft.com

  • Ability to select a different queue in each phase.
  • Ability to consume output variables from one phase in a subsequent phase.
  • Ability to run phases in parallel. (For now, all the phases you define run sequentially).

将来作業予定のバックログに積まれているのはこの辺だそうです。この辺はいろいろフィードバックが上がっています。

今も頑張ればREST API使って、別のビルド定義呼び出すということはできるはずなので、しばらくはその辺でしのぐしかないでしょうかね。

将来が楽しみな機能の一つ、ということでマルチフェーズビルドの紹介でした。