首页 / 平台管理 / 流水线管理 / 平台工程 CI/CD / 常见问题及故障排查

常见问题及故障排查

常见问题

策略校验报错 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 语句

故障排查

如果执行构建或者发布流水线出现策略校验不通过的错误,可以通过如下方式进行检查:

  1. 检查报错信息,报错信息中会提示没有满足的策略。
  2. 检查 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 中的信息可以找到问题原因。