为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 速度限制为
为了克服 Git 的速率限制问题:
- 从 Git 证据柜迁移到 COS 证据柜(也称为仅 COS)。 请参见 IBM Cloud 文档 中的相应章节。
- 为管道和/或触发器使用不同的 Git 令牌。
容器化任务的检查注册表步骤失败,发生错误
IBM Cloud 注册表提供有限的配额,可推送过多映像。
- 转至映像并删除不需要的映像。
- 重新运行管道。
您可以使用以下命令来检查配额限制和使用情况:
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 参数。
有关更多信息,请查看 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 的样本。 这是可定制的脚本。
先决条件
必须安装 kubectl 和 jq 命令。
步骤
-
打开文本编辑器,该编辑器在 LF (换行) 字符方式行尾中对文件进行 ssaves。
-
创建文件并复制以下脚本的内容:
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 -
将占位符值替换为实际认证详细信息:
- 将
<artifactory_repo_host>替换为指向第一个存储库的链接。 - 将
<artifactory_token>替换为第一个存储库的认证令牌。 - 将
<email>替换为与认证关联的电子邮件。 - 将
<second_repo_host>替换为指向第二个存储库的链接。 - 将
<second_artifactory_token>替换为第二个存储库的认证令牌。
- 将
-
保存文件。
-
确保文件保存在具有写许可权的目录中。
-
运行脚本。
-
将
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 管道配置不包含用于运行动态扫描的任务定义时,会发生此错误。 在 .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 工作,以及如何使用可用产品目录构建解决方案。 请参阅 “从人工智能助手获取帮助”。
- 如果仍不能解决问题,可以打开支持案例。 有关支持案例的开启、案例严重程度和响应时间的信息,请参阅 处理支持案例 或 上报支持案例。