¿Es posible cola de compilaciones sincrónicamente?TFS 2010 API: la cola se crea de forma síncrona y obtiene el estado de cada compilación en cola: "Ejecutar en el agente (esperando el agente de compilación)"
que hemos probado algo como esto:
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;
}
}
}
}
Así que estoy tratando de esperar mientras se completa o cancela la compilación, pero esto no funciona, porque el agente de compilación de la compilación secundaria está esperando todo el tiempo.
Tengo un proceso de compilación principal (se ejecuta en el agente 1) que invoca 13 procesos de subcompilación (todos ejecutados en el agente 2). Y quiero esperar cada proceso de subcompilación para poder abortar el proceso de compilación maestra cuando falla un proceso de subcompilación.
¿Alguna idea?
ACTUALIZACIÓN:
servicio 'XXX - agente1' tenía una excepción: Mensaje de excepción: La operación no se ha completado dentro del tiempo de espera asignado de 00:00:30. El tiempo asignado a esta operación puede haber sido una parte de un tiempo de espera más largo de . (Tipo FaultException`1)
Excepción Seguimiento de la pila: en Microsoft.TeamFoundation.Build.Machine.BuildAgentService.TerminateWorkflow (TerminatingException ex)
El flujo de trabajo:
¿Estás diciendo que no se puede iniciar TODA tu compilación solicitada mediante programación? ¿O que no puedes ordenar múltiples Builds? – pantelif
Se cuelga en la primera subconstrucción en cola. "Ejecutar en agente (esperando el agente de compilación). El agente de compilación para la compilación secundaria tiene el estado:" Ejecutar flujo de trabajo ". El estado del agente de compilación para la compilación principal es:" Listo " – Rookian
Me di cuenta de que el agente no cuelgue cada vez. El agente de compilación se "cuelga" esporádicamente. – Rookian