TFS 2010 API:队列同步构建并获取每个排队构建的状态:"在代理上运行(等待构建代理)"

Roo*_*ian 5 c# tfs tfs2010 build-agent

可以同步排队构建吗?

我试过这样的事情:

CodeActivity:

[BuildActivity(HostEnvironmentOption.Agent)]
public sealed class QueueNewBuild : CodeActivity<BuildResult>
{
    // The Team Project that the build definition belongs to.
    [RequiredArgument]
    public InArgument<IBuildDetail> BuildDetail { get; set; }

    // The build definition to queue
    [RequiredArgument]
    public InArgument<String> BuildDefinition { get; set; }

    protected override BuildResult Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the input arguments
        var buildDefinitionName = context.GetValue(BuildDefinition);
        var buildDetail = context.GetValue(BuildDetail);

        // Obtain the Team Project for the current build definition.
        var tfsProject = buildDetail.BuildDefinition.TeamProject;

        var configurationServerUri = buildDetail.BuildServer.TeamProjectCollection.Uri.ToString();

        var server = new TfsTeamProjectCollection(new Uri(configurationServerUri));
        server.EnsureAuthenticated();
        var buildServer = server.GetService<IBuildServer>();
        var buildDefinition = buildServer.GetBuildDefinition(tfsProject, buildDefinitionName);

        var queuedBuild = buildServer.QueueBuild(buildDefinition);

        var buildStatusWatcher = new BuildStatusWatcher(queuedBuild.Id);
        buildStatusWatcher.Connect(buildServer, tfsProject);

        do
        {
        } while (buildStatusWatcher.Status != QueueStatus.Completed && buildStatusWatcher.Status != QueueStatus.Canceled);

        buildStatusWatcher.Disconnect();

        return new BuildResult
        {
            WasSuccessfully = buildStatusWatcher.Build.CompilationStatus == BuildPhaseStatus.Succeeded, 
            BuildDetail = buildStatusWatcher.Build
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

BuildResult:

public class BuildResult
{
    public bool WasSuccessfully { get; set; }
    public IBuildDetail BuildDetail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

BuildStatusWatcher:

public class BuildStatusWatcher
{
    private IQueuedBuildsView _queuedBuildsView;
    private readonly int _queueBuildId;
    private QueueStatus _status;
    private IBuildDetail _build;

    public BuildStatusWatcher(int queueBuildId)
    {
        _queueBuildId = queueBuildId;
    }

    public IBuildDetail Build
    {
        get { return _build; }
    }

    public QueueStatus Status
    {
        get { return _status; }
    }

    public void Connect(IBuildServer buildServer, string tfsProject)
    {
        _queuedBuildsView = buildServer.CreateQueuedBuildsView(tfsProject);
        _queuedBuildsView.StatusChanged += QueuedBuildsViewStatusChanged;
        _queuedBuildsView.Connect(10000, null);
    }

    public void Disconnect()
    {
        _queuedBuildsView.Disconnect();
    }

    private void QueuedBuildsViewStatusChanged(object sender, StatusChangedEventArgs e)
    {
        if (e.Changed)
        {
            var queuedBuild = _queuedBuildsView.QueuedBuilds.FirstOrDefault(x => x.Id == _queueBuildId);
            if (queuedBuild != null)
            {
                _status = queuedBuild.Status;
                _build = queuedBuild.Build;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我试图等待构建完成或取消,但这不起作用,因为子构建的构建代理正在等待整个时间.

我有一个主构建过程(在代理1上运行),它调用13个子构建过程(全部在代理2上运行).我想等待每个子构建过程,以便在子构建过程失败时我可以中止主构建过程.

有任何想法吗?

更新:

服务'XXX - Agent1'有一个例外:异常消息:操作未在分配的超时00:00:30内完成.分配给此操作的时间可能是较长超时的一部分.(输入FaultException`1)

异常堆栈跟踪:在Microsoft.TeamFoundation.Build.Machine.BuildAgentService.TerminateWorkflow(TerminatingException ex)

工作流程:

在此输入图像描述

pan*_*lif 1

由于您所拥有的只是一个额外的构建代理,因此我认为使用如此复杂的模块不会给您带来太多好处。

我将实现两个单独的活动:
一个活动将 a 作为输入BuildDetail,并BuildDefinition在新构建排队后退出。
我将在 XAML 的循环中调用此活动。这会将构建代理 #2 中的所有构建排队。

第二个活动将检查构建代理 #2 的状态并等待代理再次空闲。
一旦这样做,我将检查应该在 Agent #2 中成功运行的每个构建定义,其中包含以下内容:
if(buildDefinition.LastGoodBuildUri != buildDefinition.LastBuildUri)

这种方法可能看起来有一个缺点,但事实上构建不会在最开始时失败/停止第一个破坏“子”构建。
在我看来,这实际上是一个优势:如果不止一个失败,您会立即知道。