Czy można kolejkować kompilacje synchronicznie?TFS 2010 API: Kolejka buduje się synchronicznie i pobiera stan każdej budowanej w kolejce kompilacji: "Uruchom na agencie (oczekiwanie na agenta budowania)"
Próbowałem coś takiego:
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
};
}
}
BuildResult:
public class BuildResult
{
public bool WasSuccessfully { get; set; }
public IBuildDetail BuildDetail { get; set; }
}
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;
}
}
}
}
Próbuję więc czekać tak długo, jak kompilacja jest ukończona lub anulowana, ale to nie działa, ponieważ agent budowy sub-kompilacji czeka cały czas.
Mam jeden proces budowania wzorca (działa na agencie 1), który wywołuje 13 proces kompilacji podrzędnej (wszystkie działają na agencie 2). I chcę poczekać na każdy proces kompilacji podrzędnej, abym mógł przerwać proces budowania nadrzędnego, gdy proces podrzędny kompiluje się.
Wszelkie pomysły?
UPDATE:
Service 'XXX - Agent1' miał wyjątek: Komunikat wyjątku: Operacja nie ukończyć w wyznaczonym timeout 00:00:30. Czas przydzielony na tę operację mógł być częścią dłuższego limitu czasu wynoszącego . (Typ FaultException`1)
Wyjątek Śledzenie stosu: w Microsoft.TeamFoundation.Build.Machine.BuildAgentService.TerminateWorkflow (TerminatingException ex)
Workflow:
A więc, mówisz, że WSZYSTKO, w której programowo żądana kompilacja się nie uruchamia? Lub, że nie możesz zamówić wielu Buildów? – pantelif
Powoduje zawieszenie się podczas pierwszej kolejki sub-kompilacji. "Uruchom na agencie (oczekiwanie na agenta kompilacji) Agent budujący kompilację podrzędną ma stan:" Wykonanie przepływu pracy "Stan kompilacji agenta dla głównej kompilacji to:" Gotowy " – Rookian
Uznałem, że agent nie Agent budowania "zawiesza się" sporadycznie .. – Rookian