使用诱导构建 "Failure" 的门控检查:代码仍然提交 :(

A Gated Check in with an induced Build "Failure" : the Code Still Commits :(

简短版本:

我在自定义构建模板 (.xaml) 上设置 Status=Failed 和 TestStatus = Failed。 当构建设置为门控签入 (CheckIn) 时,代码仍会提交。

长版:

我在设置以下属性的构建工作流中有一些自定义逻辑。

<!--the below is a result if a custom code activity I wrote returns a "true" for Code Coverage being lower than expected  -->
<mtbwa:SetBuildProperties DisplayName="Set Status and TestStatus to Failed" Status="[Microsoft.TeamFoundation.Build.Client.BuildStatus.Failed]" TestStatus="[Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Failed]" sap2010:WorkflowViewState.IdRef="SetBuildProperties_7" />

我的构建"goes orange",但代码仍然被签入。代码的签入是不希望的结果。

一些其他 "setup" 屏幕:

我找到的其他文章:

TFS Gated check-in -- How to reject check-in on Partial Build Success?

Fail a build if code coverage is below a threshold in TFS2012

追加:

我的模板来自 Microsoft 默认模板。

我的自定义检查定义在

之间
If CompilationStatus = Unknown

If TestStatus = Unknown

在工作流的末尾,应该有一个检查书架集的任务。确保封装在正确的逻辑中,以便在编译状态、测试状态或整体构建状态不是您想要的时跳过签入。

原始门控签入可能如下所示:

<mtbwa:InvokeForReason DisplayName="Check In Gated Changes for CheckInShelveset Builds" sap2010:WorkflowViewState.IdRef="InvokeForReason_6" Reason="CheckInShelveset">
  <mtbwa:CheckInGatedChanges DisplayName="Check In Gated Changes" sap2010:WorkflowViewState.IdRef="CheckInGatedChanges_1" />
</mtbwa:InvokeForReason>

有一个 IF 条件:

<If Condition="[BuildDetail.TestStatus = Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Succeeded]" DisplayName="BuildDetail.TestStatus = Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Succeeded" sap2010:WorkflowViewState.IdRef="If_41">
  <If.Then>
    <mtbwa:InvokeForReason DisplayName="Check In Gated Changes for CheckInShelveset Builds" sap2010:WorkflowViewState.IdRef="InvokeForReason_6" Reason="CheckInShelveset">
      <mtbwa:CheckInGatedChanges DisplayName="Check In Gated Changes" sap2010:WorkflowViewState.IdRef="CheckInGatedChanges_1" />
    </mtbwa:InvokeForReason>
  </If.Then>
  <If.Else>
    <mtbwa:WriteBuildWarning DisplayName="Write BuildDetail.TestStatus" sap2010:WorkflowViewState.IdRef="WriteBuildWarning_5" Importance="[Microsoft.TeamFoundation.Build.Client.BuildMessageImportance.High]" Message="[&quot;Gated Checkin Failed, BuildDetail.TestStatus=&quot; &amp; System.Enum.GetName(GetType(Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus), BuildDetail.TestStatus)]" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces" />
  </If.Else>
</If>

注意。 TFS 会将 BuildStatus 设置回 "InProgress"。搭载 BuildDetail.TestStatus 可能是更好的选择。