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)
工作流程:

由于您所拥有的只是一个额外的构建代理,因此我认为使用如此复杂的模块不会给您带来太多好处。
我将实现两个单独的活动:
一个活动将 a 作为输入BuildDetail,并BuildDefinition在新构建排队后退出。
我将在 XAML 的循环中调用此活动。这会将构建代理 #2 中的所有构建排队。
第二个活动将检查构建代理 #2 的状态并等待代理再次空闲。
一旦这样做,我将检查应该在 Agent #2 中成功运行的每个构建定义,其中包含以下内容:if(buildDefinition.LastGoodBuildUri != buildDefinition.LastBuildUri)
这种方法可能看起来有一个缺点,但事实上构建不会在最开始时失败/停止第一个破坏“子”构建。
在我看来,这实际上是一个优势:如果不止一个失败,您会立即知道。
| 归档时间: |
|
| 查看次数: |
4974 次 |
| 最近记录: |