はじめに
この記事はVisual Studio Team Services Advent Calendar 6日目の記事です。
VSTS/TFSでは、一つのビルドで、特定のリポジトリのソースをビルドする、ということが基本になっています。もちろん、複数のリポジトリを明示的にgit cloneもできますが、一つのリポジトリに複数の種類のソースが入っているとテンプレートでは難しいこともあります。
工夫すればいいのですが、はっきりと分離できなくて、どこまでがどのビルドかわかりづらい。そんな時に使えるのがマルチフェーズビルドです。
Sprint 123で提供が始まったばかりなので、正直今のままではまだ使いづらいのですが、将来機能強化されたらもうちょっと良くなると思います。
複数エージェントフェーズの作り方
簡単です。Processのところの ... をクリックして、"Add agent phase"を選択します。デフォルトではPhase 1が追加されています。
もう一つはデフォルトでagent phaseという名前になっていますが、わかりやすい名前に変えてください。エージェントフェーズで複数のビルドエージェントの最大数を指定することもできます。既定は無制限です。エージェントをあまり多く使いたくない場合、明示的に制限します。
ビルドタスクを追加します(略)。
今回は同じリポジトリに.NET Coreとデスクトップアプリソリューションが入っているとします。余談ですが、同じcsprojであってもdotnet coreビルドタスクではデスクトップ版のcsprojがビルドできないので、こういうのはやらないほうがいいです。もちろん、Visual Studioタスクでソリューションを指定すればいいのですが、ここは例ということで。
ビルドすると、Phase 1(.NET Core)とDesktop Phase(.NET Desktop)が別々のフェーズとしてビルドされています。ソースは最初にダウンロードしたものを共有するので、異なるフェーズで別々にダウンロードすることはありません。
また、ビルド単位が一つなので、artifactsも一つです。
エージェントを使わないビルドフェーズ
フェーズ追加するところにAdd agentless phaseというものがあります。これはビルドエージェントを呼び出さない(VSTS内部で実施してしまう)フェーズになります(たぶん)。
待ち時間やREST API呼び出しタスクがあるので、例えば、REST APIを呼び出して特定のサーバーに対してデプロイ前のビルド通知を行うとか、システム内で特定の設定を変更する、といったケースが考えられます…が、私がまだ理解できてないのか、このフェーズエラーになってしまいます。ドキュメントもまだない(リンク先はRelease機能用でした)ようで、ちょっと確認します。
将来の予定
複数段階のビルドができる、ということですぐに思いつくのはこの辺でしょう。
- 各フェーズを並列ビルドしたい
- 異なるリポジトリを一つのビルド定義で実施したい
- LinuxとWindowsのビルドをそれぞれ実行したい
- フェーズ単位でartifactを受け渡したい
…残念ながら現時点ではどれもできません。
- 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使って、別のビルド定義呼び出すということはできるはずなので、しばらくはその辺でしのぐしかないでしょうかね。
将来が楽しみな機能の一つ、ということでマルチフェーズビルドの紹介でした。