使用诱导构建 "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="["Gated Checkin Failed, BuildDetail.TestStatus=" & 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 可能是更好的选择。
简短版本:
我在自定义构建模板 (.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="["Gated Checkin Failed, BuildDetail.TestStatus=" & 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 可能是更好的选择。