操作手册 · 自动化与交付

待环境验证

CI/CD 发布失败的分层定位与证据交接

沿源码、执行节点、测试、镜像与部署状态定位 CI/CD 首个失败阶段,区分门禁拒绝和基础设施异常,明确重试、暂停与状态恢复边界。

CI/CDDockerKubernetes自动化
阅读导引 · 理解后再操作

这篇知识解决什么问题

本篇将发布失败看成有先后顺序的证据链,而不是独立错误列表。先锁定首次失败阶段和精确修订,再判断下游异常是原因还是后果;重试前核对外部写入状态,避免为了得到绿色结果而重复迁移、覆盖制品或混淆部署对象。

首次失败比最后报错更有解释力

后续阶段未执行、报告缺失和制品不存在可能只是同一个上游失败的结果。先建立阶段依赖及时间顺序,把最早异常和未开始环节分开,再检查输入是否相同;否则多头排查容易把下游补救当成根因修复,并丢失最有价值的现场。

重试需要知道之前产生了什么

排队失败与执行超时具有不同的副作用边界,尤其部署、通知和数据库迁移可能在界面超时前已经提交。只读确认任务标识、实际对象及服务端状态后,才能将后续重试交给授权人评审;未知结果不是默认失败,也不是安全重复执行的证明。

进入文章正文
关联架构图解8 个组件 · 点击展开

使用场景图中的源码、执行节点、扫描门禁和测试部署关系定位最早断点。图只表达候选测试交付流程,没有展示真实执行器容量、插件行为或数据库迁移拓扑,也不代表本站已能触发发布。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

源码、制品门禁与测试环境交付架构

Jenkins 读取受保护流水线,在隔离节点测试和构建同一候选制品,经扫描与审批门禁后按摘要交付 Kubernetes 测试环境,并保留验收证据。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

源码、制品门禁与测试环境交付架构:组件关系图Jenkins 读取受保护流水线,在隔离节点测试和构建同一候选制品,经扫描与审批门禁后按摘要交付 Kubernetes 测试环境,并保留验收证据。 Jenkins → 受保护源码仓库:检出指定提交;Jenkins → 隔离构建节点:调度受限任务;隔离构建节点 → Trivy:提交候选制品;Trivy → 测试与审批门禁:风险与执行状态;测试与审批门禁 → Jenkins:批准或阻断推进;隔离构建节点 → 制品仓库:推送同一制品;Jenkins → Kubernetes 测试:按摘要更新清单;Kubernetes 测试 → 制品仓库:按摘要拉取;验收与发布记录 → Kubernetes 测试:冒烟与状态核对。箭头说明见下方流向解读。
逻辑参考图,默认交付目标为测试环境,门禁表示需要配置的流程职责;不表示真实流水线已接通或生产自动发布已启用。

受保护源码仓库

数据 / 制品

保存试点源码和经审阅 Jenkinsfile,分支与脚本修改权限决定哪些任务可以触达敏感阶段。

全部组件职责 8 个组件
受保护源码仓库
保存试点源码和经审阅 Jenkinsfile,分支与脚本修改权限决定哪些任务可以触达敏感阶段。
Jenkins
调度测试、构建、扫描和部署阶段,按项目及阶段隔离 SCM、仓库与测试环境凭据;生产凭据不进入本试点。工具介绍 Jenkins
隔离构建节点
使用固定输入完成测试和候选镜像构建,限制并发、超时与磁盘。缓存不能替代当前提交测试。工具介绍 隔离构建节点
验收与发布记录
关联冒烟、部署事件、脱敏日志和恢复结果,并记录人工确认与观察窗口;未验证阶段保持未完成。
测试与审批门禁
表示流水线需要实现的准入规则及人工确认环节,不是独立已部署服务;失败测试、扫描异常和过期例外阻断推进。
Trivy
扫描同一候选制品,记录工具与漏洞库时间;风险阻断和扫描器运行错误均不能静默当作通过。工具介绍 Trivy
Kubernetes 测试
只向核对过的测试集群和命名空间部署候选摘要,验证配额、拉取权限、探针、可用副本和业务冒烟。工具介绍 Kubernetes 测试
制品仓库
保存镜像 manifest 和层,固定摘要关联源码、构建号及报告;标签不能代替验收制品身份。工具介绍 制品仓库
流向解读 9 条连接
  1. 1

    Jenkins 受保护源码仓库

    数据 / 请求 · 检出指定提交

    箭头表示流水线发起只读检出请求,返回的源码与 Jenkinsfile 需对应同一确定提交。

  2. 2

    Jenkins 隔离构建节点

    控制 / 管理 · 调度受限任务

    只在获准执行节点运行阶段任务,不让不可信分支共享生产权限。

  3. 3

    隔离构建节点 Trivy

    数据 / 请求 · 提交候选制品

    将构建结果交给扫描阶段,报告必须关联即将推广的相同内容摘要。

  4. 4

    Trivy 测试与审批门禁

    观测 / 查询 · 风险与执行状态

    报告扫描范围、风险判定和工具执行状态,异常不能通过忽略退出码放行。

  5. 5

    测试与审批门禁 Jenkins

    控制 / 管理 · 批准或阻断推进

    测试、扫描、例外和必要审批满足后才推进下游;生产适配属于独立评审。

  6. 6

    隔离构建节点 制品仓库

    数据 / 请求 · 推送同一制品

    执行节点在门禁允许的阶段推送并记录仓库返回的摘要,推送权限仅限约定范围。

  7. 7

    Jenkins Kubernetes 测试

    控制 / 管理 · 按摘要更新清单

    部署身份只修改批准的测试对象,保留上一已验收摘要和配置作为恢复点。

  8. 8

    Kubernetes 测试 制品仓库

    数据 / 请求 · 按摘要拉取

    目标节点运行时向仓库发起受授权拉取,镜像数据返回运行端,身份必须与报告一致。

  9. 9

    验收与发布记录 Kubernetes 测试

    观测 / 查询 · 冒烟与状态核对

    按发布契约检查测试请求、可用副本和指标,记录实际观察结果而非只看部署命令退出码。

故障域与操作边界

凭据掩码不是任务隔离

能修改流水线的人可能间接调用凭据;必须控制脚本权限、节点隔离和分支准入,不能只依赖日志掩码。

镜像回退不能撤销全部状态

数据库迁移、外部写入和队列消费需独立兼容或补偿方案,恢复旧镜像不自动恢复这些副作用。

测试发布不等于生产上线

扫描通过也不等于业务正确或完整安全。生产仍需独立审批、受保护凭据、窗口与观察责任,图中不默认启用。

架构依据与版本核对 2 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与授权前提

本文为 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=60s

60s 只是本次查询等待预算,不是所有应用的部署 SLA。若同期出现新修订,rollout status 可能跟踪新的发布;应先冻结并发发布,必要时依据已核对的修订号使用 --revision。命令成功只能证明滚动状态达到相应条件,仍需业务冒烟与依赖验收。Kubernetes rollout status

用现象选择下一步

  • Pending 且事件提示配额或调度失败:核对请求、配额和可放置条件,不能先删减业务所需资源来凑成功。
  • ImagePullBackOff:核对镜像引用、拉取凭据作用域、TLS 与节点出口;这是镜像链路问题,不先调整业务探针。
  • 容器启动后反复退出:将容器名、退出码、当前与前一次日志关联,参考 Pod 异常排查。日志查询范围限于目标容器和故障时间。
  • 滚动完成但冒烟失败:检查配置版本、依赖连接与数据库兼容性;不凭可用副本数直接推进生产。

任何根因假设都记录能证伪它的检查;若两个检查来自不同时间或不同修订,先对齐对象再下结论。

停止、重试与恢复边界

凭据疑似泄露、目标环境不一致、制品摘要不明或迁移部分执行时停止重试,通知对应负责人。只有确认失败步骤未产生不可重复的外部写入,或已经具备幂等与补偿方案后,才能批准有限重跑。

应用恢复需使用上一已验收摘要及对应配置,并验证当前数据库状态兼容;镜像回退不恢复数据。数据库已经执行不兼容变更时,优先冻结写入影响范围并由数据负责人决定向前修复或专门恢复,不能盲目触发通用“回滚”按钮。

脱敏证据与交接模板

工单 / 环境别名 / 负责人:
构建号 / 提交 / Jenkinsfile 或共享库版本:
首次失败阶段 / 退出码 / 起止时间及时区:
执行节点别名 / 排队与执行耗时:
镜像仓库别名 / 摘要 / 平台 / 扫描报告编号:
集群与命名空间别名 / 修订号 / 事件摘要:
已产生的外部写入 / 未执行步骤:
根因假设 / 支持及反证 / 下一检查:
停止或重试决定 / 审批人 / 恢复版本与兼容说明:
脱敏附件编号 / 访问范围 / 保留期限:

不得包含令牌、密码、完整内部域名、业务请求体或个人数据。原始证据保存在受限存储,公开复盘仅放必要摘要;本仓库的具体运行与发布入口另见 网站发布检查清单

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 部署阶段显示未运行,同时构建报告或镜像记录缺失,多个下游面板一起报错却没有统一时间线。

    只读核对
    只读查看流水线阶段图、首次非零退出记录、构建号与检出提交,标记哪些下游步骤尚未开始。
    如何判读
    最早失败可能解释全部缺失项;先核对上游输入和执行节点,不能把每个未产生产物都当成独立故障。
  2. 任务显示超时,但日志不能清楚区分等待执行节点与已进入构建步骤,业务侧未必有实际请求。

    只读核对
    审阅固定 Jenkinsfile 中 timeout 位置、节点分配时间、标签及执行器记录,仅比较同一构建的时间段。
    如何判读
    不同层级超时覆盖不同阶段,可能是排队或执行问题;缺少节点内证据时不能直接归因于应用性能。
  3. 滚动状态已完成,业务验收记录仍失败,而且同期可能存在新修订或数据库迁移执行记录。

    只读核对
    只读核对部署修订、期望及实际镜像摘要、容器事件和已保存冒烟结果,关联迁移与配置版本记录。
    如何判读
    技术滚动完成不证明业务兼容;先排除看错修订和配置差异,数据状态不明时不能批准通用回退。
常见误区与判断边界 2 项

用忽略退出码制造成功

报告为空可能是测试未启动或归档失败,脚本返回成功也可能来自宽泛异常捕获。把失败改为可忽略会破坏门禁和证据链,而不是修复测试本身;应审阅退出状态如何传递、报告属于哪个提交,再分别记录测试结果与报告保存结果。

重跑前先清理全部现场

清空工作区、删除失败 Pod 或覆盖同名标签会让残留输入和部分执行状态无法对照。排障应先固定版本和脱敏证据,保持上一验收版本与恢复制品;任何清理、凭据轮换或重新发布都另有作用范围,不能借排障授权一并完成。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 记录首次失败阶段、构建号、源码提交、流水线与共享库修订,并列出当时尚未执行的后续阶段及判断依据。
  • 保存排队、节点分配与实际执行的起止时间,关联节点标签、工具链和脱敏错误,明确操作员机器不是执行节点。
  • 归档候选摘要、平台、扫描对象、集群与部署修订及已有业务验收结果,标出跨时间或跨修订不可直接比较的项。
  • 列明已经发生、尚未发生和仍无法确认的外部写入,交接重试或恢复审批人、数据兼容依据与剩余停止条件。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。