2014-11-06 21 views
2

我想写一个MSBuild脚本,将排队另一个生成,然后将等待,直到构建完成,然后在排队的构建完成后,在脚本中处理进一步的步骤。我希望1st构建继续处于运行状态,直到此构建中的排队构建完成。是否有可能做这样的事情?脚本是否必须继续检查构建及其状态,或者排队的构建是否需要在完成到第一个构建时发回?MSBuild队列另一个构建,然后等待,直到构建完成

我不能找到任何可以帮助我在谷歌遗憾。以下是我用来排队构建的代码。

有关如何解决此问题的任何建议或反馈将不胜感激。

<MSBuild.ExtensionPack.Tfs2010.TeamBuild TaskAction="Queue" 
              TeamFoundationServerUrl="$(TeamFoundationServerUrl)" 
              TeamProject="Team_Proj" 
              BuildDefinitionName="Build_Def" 
              ContinueOnError="False" /> 

回答

2

我能够写的MSBuild自定义任务来实现这一点 - 请参阅下面的任务

引用下面的链接创建和使用这个任务的代码

参考链接: - http://blogs.msdn.com/b/msbuild/archive/2006/01/21/515834.aspx

public class QueueBuild : ITask 
{ 
    public IBuildEngine BuildEngine 
    { get; set; } 
    public ITaskHost HostObject 
    { get; set; } 

    [Required] 
    public string tfsServer 
    { get; set; } 

    [Required] 
    public string teamProject 
    { get; set; } 

    [Required] 
    public string buildDefinition 
    { get; set; } 

    public bool Execute() 
    { 
     // 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 
     TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(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); 

     return true; 

    } 
} 
2

接受的答案很好。
这是一个更新,它是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> 
相关问题