常见问题及故障排查
常见问题
策略校验报错 no such key
一般是因为 cel 语句中判断的 filed path 不存在导致的
比如校验语句 ce.data.raw.status.unitTestsResults.listValidate('coverage.lines', '>=',$(params.coverage)) 时,提示该错误,有可能是此时 BuildRun 中还没有单元测试结果,也就是 BuildRun.status 中还没有 unitTestsResults 字段
此时我们可以通过增加 when 判断存在该字段,再去进行校验
创建了规则,没有正常匹配,checkPolicyConditions Reason 提示 NoMatchedPolicy
一般是 policy 与 policyRun 没有匹配导致的
这个时候应该检查 policyRun 中的 phase、resource 的 kind apiVersion name label 与期望匹配的 policy 中的 phases、scope 是否匹配
创建了规则,没有正常匹配,checkPolicyConditions Reason 提示 Skipped
因为 policy 中包含的所有策略判断都没有通过 when 条件,所以 Reason 提示为 Skipped,表示校验结果跳过
如何快速地判断待判断数据的位置以及如何判空
目前 BuildRun status 中包含了所有的 result 的信息,我们可以通过观察 BuildRun status 的变化来判断需要判断的 key 值的变化情况,帮助我们编写更加合理的 ClusterRule
具体操作可以通过 kubectl get buildrun -n xx xx -o yaml -w 来查看资源的变化情况,根据实际情况编写 ClusterRule 中的 when 与 filter 语句
故障排查
如果执行构建或者发布流水线出现策略校验不通过的错误,可以通过如下方式进行检查:
- 检查报错信息,报错信息中会提示没有满足的策略。
- 检查 BuildRun 或者 DeliveryRun 的 status,status 中会有比较详细的错误信息,信息如下所示:
status:
checkPolicyConditions:
- checkStatus:
phase: BuildRunCompleted
lastTransitionTime: 2023-09-13T23:39:55Z
message: "Check Completed: 1 (Succeed: 0, Failed 1, Unknown 0)" # 检查结果总览
policies:
- checks:
- params: # policy 中对应 rule 的参数
- name: templateName
value: java
ruleRef: # policy 中对应的 rule
kind: ClusterRule
name: template-name-check
policyRef: # 对应的 policy
apiVersion: policies.katanomi.dev/v1alpha1
kind: Policy
name: template-name-check
namespace: devops
status: "False" # 当前 policy 的检查结果
status: "False" # 检查最终结果
type: Succeeded
policyRunRef: # 执行 policy 检查的 policyRun 的引用
name: check
namespace: default如果以上手段无法得知失败原因,可以根据 policyRunRef 找到对应的 policyRun 资源的信息。
policyRun 中存储了最原始过滤数据以及结果信息,可以通过排查 policyRun 资源 status 中的信息可以找到问题原因。