Настраиваемая активность рабочего процесса - получение предупреждений из сведений о сборке
Хорошо, вот в чем дело:
Я сводлю себя с ума, пытаясь получить ПРЕДУПРЕЖДЕНИЯ от объекта IBuildDetail при вызове CustomActivity.
Вот что я попробовал:
private static List<IBuildInformationNode> GetBuildWarnings(IBuildDetail buildInformation)
{
var warnings = buildInformation.Information.GetNodesByType(InformationTypes.BuildWarning);
if (warnings.Count == 0 && buildInformation.CompilationStatus == BuildPhaseStatus.Succeeded)
{
buildInformation.RefreshAllDetails();
warnings = buildInformation.Information.GetNodesByType(InformationTypes.BuildWarning);
}
return warnings;
}
Это дает мне 0 предупреждений.
Я также попробовал тот же код, используя:
var warnings = InformationNodeConverters.GetBuildWarnings(buildInformation);
что до сих пор не приносит никаких предупреждений.
Эта CustomActivity вызывается в конце рабочего процесса: у меня фактически нет проблем с извлечением остальных деталей, таких как состояние сборки, ошибки сборки, информация о тестировании и т. Д.
Вопрос только с предупреждениями.
Самое смешное, что в конце сборки, когда я проверяю результаты сборки, появляются предупреждения.
Есть идеи?
Заранее спасибо!
2 ответа
Возможно ли, что предупреждения появляются после запуска вашей пользовательской активности. Можете ли вы проверить журнал сборки и увидеть, где именно появляются предупреждения?
buildDetail.Information.GetNodesByType(InformationTypes.BuildWarning) не возвращает то, что вы ищете, потому что сообщения от отслеживающего участника не сбрасываются немедленно.
InformationNodeConverters.GetBuildWarnings внутренне вызывает метод GetNodesByType(), поэтому он не будет работать по той же причине.
Оригинальная информация хранится во внутреннем поле TrackingParticipant, поэтому она недоступна. В любом случае, если вы ждете>15 секунд, информация из этого внутреннего поля сбрасывается в доступное поле.
Таким образом, уродливый хак, который делает эту работу, выглядит так:
System.Threading.Thread.Sleep(16000);
var trackingParticipant = context.GetExtension<Microsoft.TeamFoundation.Build.Workflow.Tracking.BuildTrackingParticipant>();
var warnings = GetWarnings(trackingParticipant.GetActivityTracking(context));
private List<IBuildInformationNode> GetWarnings(IActivityTracking activityTracking ){
IBuildInformationNode rootNode = getRootNode( activityTracking.Node );
return rootNode.Children.GetNodesByType(InformationTypes.BuildWarning, true);
}
private IBuildInformationNode getRootNode( IBuildInformationNode node)
{
while( node.Parent != null ) node = node.Parent;
return node;
}