16

あるTFSビルドを別のビルドから呼び出したいシナリオがあります。最初のビルドがビルドを実行し、2番目のビルドがステージングを実行します。これにより、同じソリューションに対して複数のカスタムステージングを実行できるようになります。

2番目のビルドでexecタスクを使用してこれを実行し、tfsbuild.exeを呼び出して、最初のビルド定義からビルドをキューに入れることができます。しかし、誰かがより良い方法を知っているかどうか疑問に思っていましたか?

4

4 に答える 4

7

それはあなたが何をしようとしているのかによります。

1)ビルドとステージングを1つの操作として実行しますか?最終的に1つの統合ビルドレポート、1つのログファイル、サーバーのビルドキュー内の1つのジョブが作成され、すべてのステップが前のステップを実行したのと同じビルドエージェントによって順番に実行されますか?

もしそうなら、あなたは基本的に正しい道を進んでいます。> tfsbuild.exeにはアクセスしません<Execが、新しいビルド全体を実行すると多くのオーバーヘッドが発生し、潜在的な副作用が何であるかはわかりません。代わりに、<Call>タスクを使用して、ステージングスクリプトで定義されたmsbuildタスクを実行します。

2)「ビルドビルド」で実際に別の「ステージングビルド」をキューに入れますか?個別のレポート、ログファイル、およびキュー内のスポット?複数のビルドエージェントがある場合、並行して実行される機会はありますか?

もしそうなら、そして:

  • ステージング用の新しいビルド定義を作成します
  • Team Build APIを使用して、新しいビルド定義の[1つ/いくつか]をキューに入れるコードを元のビルド定義に追加します。 サンプルコード
  • 元のビルド定義からコアビルドに関係のないものをすべて削除します
  • 新しい「ステージング」定義に自動トリガー(時間間隔、チェックインイベントなど)がないことを確認してください
于 2009-07-24T20:19:36.903 に答える
5

これが私がこれを達成した方法です(http://sajojacob.com/2009/08/how-to-chain-tfs-builds/

TFSビルドをチェーンする方法は?投稿日:2009年8月5日投稿者:コメントなし↓

最近、同僚の1人@gdurziからこの質問がありました。TFSですぐにサポートできるほど簡単に聞こえますか?これにはあまりにも多くの癖があります。そして、これまで忠実なMSBuildタスクを使用してTFSBuild.exeを呼び出し、最初のTFSBuild.projから次のような新しいビルドをキューに入れることをお勧めします。

TFSBuild.exe start / queue%TFSSVR%%TEAMPROJECT%%BUILDTYPE%

TFSBuild.exeの使用に関する問題は、ビルドエージェントをコマンドライン引数として渡すことができないことです。これは、私たちにとって大きな問題でした。

特定のシナリオに基づいて実行できるアプローチはいくつかあるので、ここでシナリオを定義しましょう。コアプロジェクトをビルドするMain_Build TFSビルド定義があり、コンパイル/ビルド用に同じMain_Buildを実行する複数のステージングビルドを使用できるようにする必要があります。 、ただし、Main_Buildを呼び出すユーザーに基づいて展開用にカスタムステージングされます。クライアントごとにカスタムのビルド前およびビルド後のアクションが必要な複数のクライアントにロールアウトする製品がある場合に非常に便利です。したがって、TFS2008でビルドチェーンを実行する1つの方法があります。

手順1:ビルド定義ファイルに関連付けられた既定のビルドエージェントを使用してビルドをキューに入れるTeamFoundationオブジェクトモデルを使用してカスタムMSBuildタスクを作成しましょう。

キューイングのサンプルコード:QueueTFS.cs

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Build.Client;

// Get the team foundation server. 
TeamFoundationServer _tfsServer = TeamFoundationServerFactory.GetServer(_tfs); 

// Get the IBuildServer 
IBuildServer buildServer = (IBuildServer)_tfsServer.GetService(typeof(IBuildServer)); 

// Get the build definition for which a build is to be queued. 
IBuildDefinition definition = buildServer.GetBuildDefinition(teamProject, buildDefinition); 

// Create a build request for the build definition. 
IBuildRequest request = definition.CreateBuildRequest(); 
request.CommandLineArguments = "Pass any custom command line args here"; // Ex: Custom Targets file

// Queue the build. 
buildServer.QueueBuild(request, QueueOptions.None);

手順2:ここで、QueueTFS.dllを、ステージングビルド定義ファイルを作成するTFSの新しいフォルダーにコピーします。

次に、新しいMSBuildタスクを使用し、EndToEndIterationターゲットをオーバーライドする最小限のTFSBuild.projファイルを作成しましょう。これは、Main_Buildビルドをトリガーするステージングビルド定義になります。このTFSBuild.projを手動で作成し、プロジェクトファイルの場所をビルド定義UIから新しいフォルダーにポイントする必要があることに注意してください。

最小限のTFSBuild.projのサンプルコード:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> 
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TeamBuild\Microsoft.TeamFoundation.Build.targets" /> 
  <UsingTask TaskName="MyNewCustomTFSTask" AssemblyFile="QueueTFS.dll"/> 
  <Target Name="EndToEndIteration"> 
    <Message Text="About to trigger main build" Importance="high"/> 
    < MyNewCustomTFSTask TFS="http://TFSServer.com:8080/" TeamProject="TeamProject" BuildDefinition="Main_Build" TargetsFile="Custom.Target" XYZ="XYZ" /> 
    <!-- When everything is done, change the status of the task to "Succeeded" --> 
    <SetBuildProperties TeamFoundationServerUrl="$(TeamFoundationServerUrl)" BuildUri="$(BuildUri)" TestStatus="Succeeded" CompilationStatus="Succeeded"/> 
  </Target> 
</Project>

手順3:ビルド前およびビルド後のターゲット呼び出しを使用してMain_BuildTFSBuild.projファイルを編集します。

  <Target Name=“BeforeCompile“&gt;

    <CallTarget Targets=“Custom_PreBuild“/>    

  </Target>

  <Target Name=“AfterDropBuild“ Condition=“‘$(BuildBreak)’!=’true’“&gt;    

    <CallTarget Targets=“Custom_PostBuild“/>

  </Target>

Main_Buildを単独で実行する機能も必要でした。これをサポートするために、Main_Build TFSBuild.projに条件付きインポートを追加して、空のCustom_PreBuildおよびCustom_PostBuildターゲットを含むデフォルトのターゲットファイルをインポートします。$(CustomTarget)は、request.CommandLineArgumentsのステップ1でコマンドライン引数として渡すものです。

<Import Project="$(CustomTarget)" Condition="'$(CustomTarget)'!=''"/>
<!--Import CustomContoso.Target if no partner is passed in—&gt;
<Import Project="EmptyCustom.Target" Condition="'$(CustomTarget)'==''"/> 

ステップ4:Custom_PreBuildおよびCustom_PostBuildターゲットを使用してターゲットファイルCustom.TargetおよびEmptyCustom.Targetを作成すると、完了です。

ビルド手順の更新と、このブログ投稿の範囲外のその他のいくつかのマイナーな機能のサポートを追加しましたが、これで開始できることを願っています。

于 2009-08-05T18:26:59.377 に答える
1

その他の役立つリンクは次のとおりです。それは他の人を助けるかもしれません。

別のビルド定義を作成し、トリガーされる他のビルド定義を呼び出します。

http://blogs.objectsharp.com/post/2012/02/04/Create-a-Master-Build-that-c​​alls-other-Builds.aspx

http://blog.stangroome.com/2011/09/06/queue-another-team-build-when-one-team-build-succeeds/

子ビルドへの引数の受け渡し。

http://blog.stangroome.com/2014/02/19/queue-a-team-build-from-another-and-pass-parameters/

別のビルド定義をキューに入れるTFSビルド拡張

http://tfsbuildextensions.codeplex.com/

于 2014-04-24T19:41:15.330 に答える
0

ソリューションをステージング環境に展開しようとしていますか?その場合、適切な方法は、選択したビルド品質に基づいて異なるPowerShellスクリプトを実行するcodeplexのTFSDeployerを使用することです...

于 2009-07-27T07:23:25.877 に答える