接受的答案很好。
这是一个更新,它是MsBuild的内联任务,并针对新的TFS2012 Api进行了更新。
它还返回构建结果:
<UsingTask TaskName="QueueBuild" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<tfsServer ParameterType="System.String" Required="true" />
<teamProject ParameterType="System.String" Required="true" />
<buildDefinition ParameterType="System.String" Required="true" />
<buildResult ParameterType="System.Boolean" Output="true" />
</ParameterGroup>
<Task>
<Reference Include="mscorlib" />
<Reference Include="Microsoft.TeamFoundation.Build.Client" />
<Reference Include="Microsoft.TeamFoundation.Build.Common" />
<Reference Include="Microsoft.TeamFoundation.Client" />
<Reference Include="Microsoft.TeamFoundation" />
<Using Namespace="System.Diagnostics" />
<Using Namespace="Microsoft.Build.Framework" />
<Using Namespace="Microsoft.TeamFoundation.Client" />
<Using Namespace="Microsoft.TeamFoundation.Build.Client" />
<Using Namespace="Microsoft.TeamFoundation.Build.Common" />
<Code Type="Fragment" Language="cs">
<![CDATA[
// set up support for logging
TaskLoggingHelper loggingHelper = new TaskLoggingHelper(this);
// Log Variables
loggingHelper.LogMessageFromText("Custom Task QueueBuild Starting", MessageImportance.High);
loggingHelper.LogMessageFromText("tfsServer = " + tfsServer , MessageImportance.High);
loggingHelper.LogMessageFromText("teamProject = " + teamProject , MessageImportance.High);
loggingHelper.LogMessageFromText("buildDefinition = " + buildDefinition , MessageImportance.High);
// Get the team foundation server
var tfs = new TfsTeamProjectCollection(new Uri(tfsServer));
// Get the IBuildServer
IBuildServer buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer));
// Get the build definition for which a build is to be queued
IBuildDefinition buildDef = buildServer.GetBuildDefinition(teamProject, buildDefinition);
// Create variable for queuedBuild and queue the build
var queuedBuild = buildServer.QueueBuild(buildDef);
loggingHelper.LogMessageFromText("Waiting for newly queued build from Team Project : " + teamProject + " : and Build Definition : " + buildDefinition + " : to complete", MessageImportance.High);
loggingHelper.LogMessageFromText("Pinging queuedBuild : " + queuedBuild + " : every 5 seconds to confirm when build is complete", MessageImportance.High);
// Wait for the completion of newly queued build - Will ping build every 5 seconds to confirm completion for a max of 5 hours
queuedBuild.WaitForBuildCompletion(TimeSpan.FromSeconds(5), TimeSpan.FromHours(5));
loggingHelper.LogMessageFromText("Queued Build : " + queuedBuild.Build.BuildNumber + " has now completed", MessageImportance.High);
loggingHelper.LogMessageFromText("Returning to original build", MessageImportance.High);
this.buildResult = queuedBuild.Build.Status == BuildStatus.Succeeded;
loggingHelper.LogMessageFromText("Build result:" + buildResult, MessageImportance.High);
return true;
]]>
</Code>
</Task>
</UsingTask>
以及如何调用它:
<QueueBuild tfsServer="http://tfsServer:8080/tfs/Collection" teamProject="TeamProject" buildDefinition="MyBuild">
<Output TaskParameter="buildResult" PropertyName="buildResult" />
</QueueBuild>