0

わかりました、ここにあります:

CustomActivityを呼び出すときに、 IBuildDetailオブジェクトから WARNINGS を取得しようとしています。

これは私が試したことです:

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 WARNINGSを与えます。

を使用して同じコードも試しました:

var warnings = InformationNodeConverters.GetBuildWarnings(buildInformation);

それでも警告は表示されません。

この CustomActivity は、ワークフローの最後に呼び出されます。実際には、ビルド ステータス、ビルド エラー、テスト情報などの残りの詳細を取得する際に問題はありません。

問題は警告のみです。

面白いことに、ビルドの最後にビルド結果を確認すると、警告が表示されます

何か案は?

前もって感謝します!

4

2 に答える 2

0

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;
    }
于 2016-08-03T09:42:25.130 に答える