IBM Cloud Docs
为DevSecOps排除故障

为DevSecOps排除故障

使用这些技巧来帮助解决您在使用 DevSecOps 时可能遇到的问题。

常规故障诊断方法

  • 如果 UI 运行缓慢或日志无法装入,请重新装入该页面。

  • 状态页面 上检查中断

  • 再次运行管道。

    再次运行管道
    手动推广触发器

IBM 环境问题

由于 Git 速度限制,管道运行速度较慢

管道执行看起来更慢,管道运行的执行和完成时间更长。

此外,在日志的不同地方还可以找到以下条目:

Unable to use this tool because the git API rate limit is exceeded. Please try again in <n> minutes.

管道内部使用 Git API 请求(设置 Git 状态、创建/更新问题......)。 Git 速度限制为 API请求,按 Git 令牌计算,每小时。 当即将达到这一限制时,内部流水线机制会暂停请求,从而也暂停流水线运行,以防止流水线运行提前终止。 这可能会导致管道长期运行。

为了克服 Git 的速率限制问题:

  1. 从 Git 证据柜迁移到 COS 证据柜(也称为仅 COS)。 请参见 IBM Cloud 文档 中的相应章节。
  2. 为管道和/或触发器使用不同的 Git 令牌。

容器化任务的检查注册表步骤失败,发生错误

存储配额错误
存储配额错误

IBM Cloud 注册表提供有限的配额,可推送过多映像。

  1. 转至映像并删除不需要的映像。
  2. 重新运行管道。

您可以使用以下命令来检查配额限制和使用情况:

ibmcloud cr quota

不显示步骤的日志

日志不显示
日志不显示

这是 Tekton 环境的问题。

请尝试重新装入页面。 使用“下载”按钮下载日志。

下载日志 "
下载日志 "

模板和管道问题

由于无法访问基本映像,因此任务已取消

未访问基本图像
未访问基本图像 "

检查您的 artifactory 凭证是否正确。 可以在此处创建新的 artifactory 令牌。 您可以通过运行以下命令手动创建私钥:

kubectl create secret docker-registry mysecret \
--dry-run \
--docker-server=<artifactory-server-domain> \
--docker-username=<username> \
--docker-password=<artifactory token> \
--docker-email=<email> \
-o yaml

它输出类似于以下内容的内容:

apiVersion: v1
data:
  .dockerconfigjson: <your secret>
kind: Secret
metadata:
  creationTimestamp: null
  name: regcred
type: kubernetes.io/dockerconfigjson

在管道属性中,使用 .dockerconfigjson 值更新 artifactory-dockerconfigjson 参数。

更新artifactory-dockerconfigjson
更新artifactory-dockerconfigjson

有关更多信息,请查看 kubectl documentation on create a secret(: external)。

管道提前失败

当管道提前发生故障时,会显示以下消息:

Pipeline could not run, resource failed to apply - Kind: "Secret", Name: "pipeline-pull-secret" ResourceError

在这种情况下,在管道中发生故障,因为它未引导。 因此,没有日志记录。

该管道使用的从 IBM 获取 Docker 图片的 dockerconfig.jsonContainer Registry 密钥不正确。

此私钥可能不正确,或者与此私钥关联的 API 密钥已轮换或撤销。

生成一个新的密钥 dockerconfig.json,然后在您的管道中使用这个新密钥(可作为管道参数,或存储在 Secrets Manager 中)。

要生成新的 dockerconfig.json,请运行以下命令:

kubectl create secret docker-registry my-registry-secret \
 -o json \
 --dry-run=client \
 --docker-server=icr.io \
 --docker-username=iamapikey \
 --docker-email=john-doe@ibm.com \
 --docker-password=<apikey> \
  | jq -r '.data[".dockerconfigjson"]'

其中 <apikey> 是 IBM Cloud Cloud API 密钥或服务标识 API 密钥。

管道无法从多个 artifactory 存储库中拉取映像

管道已成功从一个存储库中拉取映像,但未从另一个存储库中拉取映像。

管道失败,因为它已配置为从单个存储库中拉取映像。

手动创建新的 artifactory dockerconfigjson 私钥以支持对多个存储库进行认证。

要支持认证以从 Artifactory中的多个存储库拉取映像,请生成新的 dockerconfigjson 并将私钥类型 artifactory-dockerconfigjson 环境属性添加到一个或多个管道。

以下脚本是用于生成用于为两个不同的 artifactory 存储库提供认证详细信息的 artifactory dockerconfigjson 的样本。 这是可定制的脚本。

先决条件

必须安装 kubectljq 命令。

步骤

  1. 打开文本编辑器,该编辑器在 LF (换行) 字符方式行尾中对文件进行 ssaves。

  2. 创建文件并复制以下脚本的内容:

    dockerconfig_1=$(kubectl create secret docker-registry my-registry-secret \
    --output json \
    --dry-run=client \
    --docker-server="<artifactory_repo_host>" \
    --docker-username="<email>" \
    --docker-email="<email>" \
    --docker-password="<artifactory_token>" \
    | jq -r '.data[".dockerconfigjson"]')
    
    dockerconfig_2=$(kubectl create secret docker-registry my-registry-secret \
    --output json \
    --dry-run=client \
    --docker-server="<second_repo_host>" \
    --docker-username="<email>" \
    --docker-email="<email>" \
    --docker-password="<second_artifactory_token>" \
    | jq -r '.data[".dockerconfigjson"]')
    
    echo $dockerconfig_1 | base64 -d > first_secret.json
    echo $dockerconfig_2 | base64 -d > second_secret.json
    new_dockerconfig=$(jq -s '.[0] * .[1]' first_secret.json second_secret.json | base64 -w0)
    echo ${new_dockerconfig} > final_dockerconfig.txt
    
  3. 将占位符值替换为实际认证详细信息:

    • <artifactory_repo_host> 替换为指向第一个存储库的链接。
    • <artifactory_token> 替换为第一个存储库的认证令牌。
    • <email> 替换为与认证关联的电子邮件。
    • <second_repo_host> 替换为指向第二个存储库的链接。
    • <second_artifactory_token> 替换为第二个存储库的认证令牌。
  4. 保存文件。

  5. 确保文件保存在具有写许可权的目录中。

  6. 运行脚本。

  7. final_dockerconfig.txt 的内容作为私钥添加到 artifactory-dockerconfigjson 的管道环境属性中。 如果使用的是 Secrets Manager 或 Key Protect,请使用相应的方法来保存此文件的内容。

由于缺少子模块文件,CRA 或 Docker 编译失败

当 CRA 或 Docker 等管道阶段构建失败时,您可能会看到类似的错误信息:

failed to calculate checksum of ref moby::...: failed to walk /var/lib/docker/tmp/buildkit-mount.../common-dev-assets/module-assets/ci: lstat ... no such file or directory

此错误发生是因为您的仓库包含 Git 子模块,但管道默认不会克隆子模块。 每个管道阶段都在自己的容器中运行,并对版本库执行全新的检出,因此除非明确初始化,否则子模块的内容会丢失。

要解决此问题,您必须确保在每个需要 Git 子模块的阶段都对其进行初始化。 具体到 CRA,您可以将子模块初始化添加到自定义 CRA 脚本中。

例如,更新您的脚本,使其包括

git submodule update --init --recursive

这保证了子模块在 CRA 构建过程运行前可用。

映像签名问题

如果映像签名任务失败,请参阅 映像签名文档 以验证是否正确生成并存储了签名密钥。

未在管道配置中定义与动态扫描阶段相关的问题

CI 管道运行失败,发生错误。

动态扫描阶段 "
CI 管道运行失败 动态扫描阶段 "
CI 管道运行失败

当 CI 管道配置不包含用于运行动态扫描的任务定义时,会发生此错误。 在 .pipeline-config.yaml 中添加以下片段,并定制步骤以适合您的应用程序。

   dynamic-scan:
      dind: true
      abort_on_failure: false
      image: icr.io/continuous-delivery/pipeline/pipeline-base-image:2.12@sha256:ff4053b0bca784d6d105fee1d008cfb20db206011453071e86b69ca3fde706a4
      script: |
      #!/usr/bin/env bash
      echo "Please insert script to invoke/execute dynamic scan tool like OWASP ZAP on the built and deployed application."

有关阶段的更多信息,请参阅 定制脚本

获取支持

  • 您可以查看 Stack Overflow,了解其他用户是否遇到了同样的问题。 使用论坛提问时,请用 "ibm-cloud "和 "DevSecOps" 标记您的问题,以便 IBM Cloud 开发团队看到。
  • IBM Cloud 的AI助手,由 IBM 的 watsonx 提供支持,旨在帮助您了解如何在 IBM Cloud 工作,以及如何使用可用产品目录构建解决方案。 请参阅 “从人工智能助手获取帮助”。
  • 如果仍不能解决问题,可以打开支持案例。 有关支持案例的开启、案例严重程度和响应时间的信息,请参阅 处理支持案例上报支持案例