适用范围与授权前提
本文为 CI/CD 持续交付 的诊断草案,适用于 Jenkins 组织构建、Docker 生成制品、Kubernetes 承载测试部署的方案,不表示本网站已接入这些系统。验证状态为待验证,命令需先在获准的隔离环境审阅。只读查询也需要相应项目、构建日志和集群对象权限;凭据轮换、重跑任务、推进制品和恢复部署是独立变更,不由排障权限自动授权。
开始前登记环境、流水线地址、构建号、故障时区与值班负责人。暂停该候选版本的后续推进,保持上一已验收版本服务。不要先清空工作区或删除失败 Pod;这些动作可能销毁定位所需证据。
冻结提交与首次失败阶段
先从流水线图定位最早失败的阶段,而不是最后出现的“部署未运行”。保存检出提交、Jenkinsfile 版本、共享库版本、参数与凭据引用名称。以下命令仅检查已获准的本地检出目录;尖括号都是待替换占位符。
git -C '<SOURCE_DIR>' rev-parse HEAD
git -C '<SOURCE_DIR>' status --short
git -C '<SOURCE_DIR>' log -1 --format='%H %cI %s'预期提交与构建页面一致,工作区差异能逐项解释。若提交一致但工作区存在未知生成文件,先判断构建是否使用了残留产物;若检出阶段已经失败,调查仓库地址、授权范围与连接问题,不把后续缺失制品当作另一根因。错误日志只保留首个失败上下文和关联 ID,禁止公开完整环境变量。
区分排队、超时与执行节点故障
记录任务排队时长、节点标签、分配时间及离线原因。一直未获得执行节点时,优先核对标签匹配、可用执行器与并发限制;已分配后卡在依赖安装,才调查网络、软件源和磁盘。容器节点与宿主机的空间、网络身份可能不同,不用操作人员电脑的连通结果替代节点证据。
Jenkins 的顶层与阶段级 timeout 对节点分配时间的覆盖不同,应按实际 Jenkinsfile 位置解释超时,不能仅凭“超时”判定应用运行太慢。节点故障重试前,还要确认部署或数据库迁移阶段是否已经产生外部写入。Jenkins 流水线语法
检查测试退出状态与报告对象
对照失败测试名称、测试报告时间、源码提交和工具版本。报告不存在可能是测试未启动、路径错误或归档阶段失败,不能解释为零失败。出现网络偶发错误时,在隔离副本中使用同一输入复现,限制重试次数并保留每次结果;业务断言失败应回到代码或契约修复。
审阅脚本是否以 || true、宽泛异常捕获或错误的退出码处理掩盖失败。Jenkins sh 通常对非零退出码报错;使用 returnStatus: true 后,需要显式判断返回值。下面仅是审阅用片段,不是可直接发布的完整流水线,测试入口必须替换为已审查且不连接生产资源的命令。
script {
int testExit = sh(script: './ci/test.sh', returnStatus: true)
if (testExit != 0) {
error("测试阶段失败,退出码:${testExit}")
}
}预期失败测试阻断制品推进,报告上传失败被单独显式记录。处理凭据的脚本禁止命令回显,不把日志掩码等同于凭据隔离。Jenkins Shell 步骤
对齐构建制品与扫描门禁
保存仓库路径、镜像摘要、目标架构、扫描器与漏洞库更新时间。扫描命中阻断项、扫描器运行异常、数据库下载失败是不同结论;后两者没有可用于放行的风险结果。若扫描报告使用标签,而部署使用另一次构建推送后的同名标签,先冻结推进并补齐摘要对应关系,不能用新报告覆盖旧记录。
从已完成构建记录取得候选摘要,再在独立受控客户端按 Docker 镜像核验 复核。不为排障全量下载仓库,也不清理正在运行或回退计划仍引用的镜像。安全例外需要责任人、原因和到期时间,排障人员不能自行改成永久忽略。
按对象读取部署与事件
以下为获准测试集群的只读检查,<LABEL_SELECTOR> 必须是本次应用的精确选择器。先核对 Deployment 期望镜像,再核对 Pod 状态;不要为了查看数据导出整个命名空间的 Secret。
kubectl --context='<CONTEXT>' -n '<TEST_NAMESPACE>' get deployment '<DEPLOYMENT>' -o wide
kubectl --context='<CONTEXT>' -n '<TEST_NAMESPACE>' get deployment '<DEPLOYMENT>' -o jsonpath='{.spec.template.spec.containers[*].image}{"\n"}'
kubectl --context='<CONTEXT>' -n '<TEST_NAMESPACE>' get pods -l '<LABEL_SELECTOR>' -o wide
kubectl --context='<CONTEXT>' -n '<TEST_NAMESPACE>' describe pod '<POD_NAME>'
kubectl --context='<CONTEXT>' -n '<TEST_NAMESPACE>' rollout status deployment/'<DEPLOYMENT>' --timeout=60s60s 只是本次查询等待预算,不是所有应用的部署 SLA。若同期出现新修订,rollout status 可能跟踪新的发布;应先冻结并发发布,必要时依据已核对的修订号使用 --revision。命令成功只能证明滚动状态达到相应条件,仍需业务冒烟与依赖验收。Kubernetes rollout status
用现象选择下一步
Pending且事件提示配额或调度失败:核对请求、配额和可放置条件,不能先删减业务所需资源来凑成功。ImagePullBackOff:核对镜像引用、拉取凭据作用域、TLS 与节点出口;这是镜像链路问题,不先调整业务探针。- 容器启动后反复退出:将容器名、退出码、当前与前一次日志关联,参考 Pod 异常排查。日志查询范围限于目标容器和故障时间。
- 滚动完成但冒烟失败:检查配置版本、依赖连接与数据库兼容性;不凭可用副本数直接推进生产。
任何根因假设都记录能证伪它的检查;若两个检查来自不同时间或不同修订,先对齐对象再下结论。
停止、重试与恢复边界
凭据疑似泄露、目标环境不一致、制品摘要不明或迁移部分执行时停止重试,通知对应负责人。只有确认失败步骤未产生不可重复的外部写入,或已经具备幂等与补偿方案后,才能批准有限重跑。
应用恢复需使用上一已验收摘要及对应配置,并验证当前数据库状态兼容;镜像回退不恢复数据。数据库已经执行不兼容变更时,优先冻结写入影响范围并由数据负责人决定向前修复或专门恢复,不能盲目触发通用“回滚”按钮。
脱敏证据与交接模板
工单 / 环境别名 / 负责人:
构建号 / 提交 / Jenkinsfile 或共享库版本:
首次失败阶段 / 退出码 / 起止时间及时区:
执行节点别名 / 排队与执行耗时:
镜像仓库别名 / 摘要 / 平台 / 扫描报告编号:
集群与命名空间别名 / 修订号 / 事件摘要:
已产生的外部写入 / 未执行步骤:
根因假设 / 支持及反证 / 下一检查:
停止或重试决定 / 审批人 / 恢复版本与兼容说明:
脱敏附件编号 / 访问范围 / 保留期限:不得包含令牌、密码、完整内部域名、业务请求体或个人数据。原始证据保存在受限存储,公开复盘仅放必要摘要;本仓库的具体运行与发布入口另见 网站发布检查清单。