DevOps / 研发效能 / 学习手册
A FIELD GUIDE FOR BACKEND DEVELOPERSVOL. 01 / 2026

服务端开发者的下一站

从一行代码,
到一次可靠交付。

DevOps · 研发效能平台完整指南

沿着一个功能的旅程,看懂需求、构建、部署与运行。
把已有的后端经验,连接到平台工程的新世界。

DELIVERY IS A JOURNEY
Code 到 Build 到 Deploy 到 Run,再反馈到开发 CODEBUILDDEPLOYRUN 代码变更持续集成可信制品OBSERVE. LEARN. IMPROVE. $ ship with confidence ✓ tests passed ✓ version verified → ready for the next step 每一步,都有证据。
BUILD ON WHAT YOU KNOW.31° N · ENGINEERING
10交付阶段THE COMPLETE LIFECYCLE
15完整章节FROM CONCEPT TO PRACTICE
01贯穿案例ONE FEATURE, END TO END

为有服务端经验的你而写
从使用平台,到开发平台。

THE BIG PICTURE先看全局,再深入每一步

一个功能的完整旅程

重点掌握

阶段之间交接的是确定的版本与验证证据。上线之后,运行反馈会回到下一次需求。

THE COMPLETE GUIDE

从这里,开始深入。

完整保留全部 15 章内容。
顺着读,也可以通过目录与搜索直达问题。

CHAPTER 00

服务端开发转 DevOps/研发效能平台:从需求到生产运行

先建立坐标

面向有约 3 年服务端开发经验、准备应聘研发效能平台后端研发岗位的读者。

推荐使用单页 HTML 完整版阅读:包含完整正文、流程图、目录、全文搜索和阅读进度,单独保存这一份 HTML 即可离线打开。

这套指南用一个功能的交付过程回答三个问题:功能经过哪些阶段;每个阶段做什么、谁负责、依赖什么技术;平台工程师需要把哪些事情做成可复用的能力。

资料核对日期:2026-10-16。岗位分工是本文的教学模型,工具定位以各章官方参考资料为依据。实际公司的流程、权限和产品版本可能不同;阅读 JD 和面试交流时需要对应确认。

先抓住岗位的工作对象#

过去写业务服务,主要面对订单、账户、支付等业务对象。开发研发效能平台,主要面对应用、代码仓库、构建任务、制品、环境、发布单和运行事件。

你已有的接口设计、数据库、异步任务、权限、并发控制和故障排查经验都能迁移。需要补齐的是软件交付过程,以及这些对象之间的状态、约束和失败处理。

本文会分别讨论:

  • 业务开发怎样借助平台交付功能。
  • 平台后端怎样实现流水线、发布编排、环境管理和运行反馈。
  • 平台依赖的 Jenkins、Kubernetes 等系统各自负责什么。

阅读目录#

文档解决的问题阅读优先级
01 全流程与职责地图从需求到运行,阶段、交接、角色、技术栈怎样对应?首先阅读
02 需求承接与技术设计怎样让需求可开发、可验收、可发布?建立背景
03 开发与代码协作分支、评审、本地环境和代码事件怎样接入平台?建立背景
04 CI:持续集成流水线怎样触发、调度、执行、反馈和失败恢复?重点
05 制品与供应链测过的版本怎样被准确地发布、追踪和回退?重点
06 测试与验收哪些验证放在 CI,哪些需要部署后做?衔接 CI 与 CD
07 CD:交付与部署环境、配置、GitOps 和部署状态怎样管理?重点
08 生产发布与上线验证灰度、流量、数据库变更和回滚怎样配合?重点
09 运行态与可靠性怎样发现异常、定位、止损并把反馈带回发布?重点
10 反馈与效能度量怎样判断平台使交付更快、更稳、更省心?理解平台价值
11 平台后端怎样开发常见开发任务、领域模型、架构和技术难点是什么?岗位重点
12 转岗路线与面试先补什么,学到什么程度,怎样验证岗位匹配?行动指南
13 贯穿案例与实操任务书怎样亲手串起构建、制品、部署、发布验证和监控?实践
14 术语与官方资料缩写是什么意思,应该去哪里继续查?随时查阅

建议怎样读#

第一次先读 01 和 11,建立流程与岗位的整体认识。随后按 04 → 05 → 06 → 07 → 08 → 09 理解交付主链。最后用 12 制定学习安排,用 13 完成一次练习。

阅读一章后,试着不看原文回答:

  1. 这一阶段接收什么,产出什么?
  2. 谁对结果负责,平台提供什么支持?
  3. 正常路径怎样走,失败后怎样判断和处理?
  4. 如果由我写平台后端,接口、数据和异步任务怎样设计?

能用自己的话讲清楚这些,比记住工具名称更接近岗位要求。

全文共用案例#

给已有的 order-service 新增“查询当前用户已支付订单”的接口:

http
GET /orders?status=paid&limit=20

请求的用户身份来自认证上下文。接口需要做权限校验、访问订单数据库,并在生产流量下满足团队约定的性能与可靠性目标。后续各章跟踪同一个功能的代码、测试结果、镜像、部署记录和运行反馈。

文中的性能数值、时间、标识符、状态机和平台表结构都是教学示例。实操章提供任务、配置思路和验收方法,完成练习时使用自己熟悉的语言另建业务项目。

技能深度的约定#

层次达成标准示例
理解能解释目的、边界和常见失败解释为什么部署完成还需要业务验证
使用能独立配置、执行、检查结果并排障写一条 CI,定位失败任务,检查部署事件
开发平台能设计可复用、可审计、能恢复的能力为重复发布请求做幂等,处理超时与状态对账

初期目标是掌握主链的“理解+使用”,再对流水线或发布平台中的一个模块达到“开发平台”。无需在应聘前精通所有开源项目。

工具选择原则#

各章列出的是代表性项目,方便认识不同能力的实现方式。相邻阶段可能由同一个平台覆盖,也可能由几个系统组合完成。

开源软件、商业增强版本和托管服务会明确区分。实操优先选一套能完成闭环的组合,产品的功能与版本边界通过官方资料确认,资料入口统一收录在第 14 章。

CHAPTER 01

01|全流程与职责地图

从需求到运行的十个阶段

返回阅读入口 · 下一章:需求与设计

1. 看完整交付链,而不只看代码#

本指南把功能交付拆成十个阶段,便于建立知识地图。实际工作会循环、并行:测试参与需求设计,运行要求会影响代码,生产问题也会触发新的需求。

从需求到运行的交付闭环 01 需求承接 02 技术设计 03 开发与协作 04 CI 验证 05 制品管理 06 测试与验收 07 CD 交付与部署 08 生产发布与验证 09 运行态保障 10 反馈与效能改进 发现缺陷,回到开发发布异常,回到发布控制验证 → 交付 → 生产 → 反馈
从需求到运行的交付闭环 · 可横向滑动
查看图示源码
flowchart LR
    A["需求承接"] --> B["技术设计"]
    B --> C["开发与协作"]
    C --> D["CI 验证"]
    D --> E["制品管理"]
    E --> F["测试与验收"]
    F --> G["CD 交付与部署"]
    G --> H["生产发布与验证"]
    H --> I["运行态保障"]
    I --> J["反馈与效能改进"]
    J --> A
    F -->|发现缺陷| C
    I -->|发布异常| H

CI 内也包含测试;图中的“测试与验收”侧重需要完整环境、跨服务协作或业务确认的验证。“CD”可以覆盖生产部署,“生产发布”单独展开,是为了看清流量、风险和结果判断。

2. 阶段、重点、角色与交接#

下面是中等规模团队的一种常见分工。主责人负责推动结果,协作人提供专业判断或公共能力;平台接入并不转移业务团队对功能正确性的责任。

阶段输入 → 产出重点事情常见主责主要协作
需求承接业务目标 → 可验收的需求与排期范围、优先级、依赖、验收标准产品负责人/业务负责人业务开发、测试、项目协调者
技术设计已明确的需求 → 设计与变更方案API、数据、兼容、容量、测试、发布和回退技术负责人/业务开发测试、安全、SRE、平台团队
开发与协作设计 → 经评审的代码与测试小批次提交、分支、评审、本地可复现业务开发评审人、测试、代码平台研发
CI代码变更 → 自动验证结果和候选构建编译、测试、扫描、门禁、反馈速度业务开发对代码结果负责;平台团队对执行能力负责测试、安全、基础设施团队
制品管理成功构建 → 可定位、可追踪的制品唯一标识、仓库、扫描、来源与保留平台/制品仓库团队业务开发、安全
测试与验收指定制品与环境 → 验证证据与风险结论接口、集成、回归、性能、业务验收测试与业务开发共同负责质量;产品确认业务验收环境平台、依赖服务团队
CD已验证制品与部署配置 → 目标环境中的版本环境、权限、配置、编排、部署状态业务团队对变更负责;平台团队提供部署能力SRE、基础设施、安全
生产发布发布计划 → 经观察和确认的生产版本审批、灰度、流量、观察、停止与回退明确指定的发布负责人业务开发、测试、SRE、平台
运行态生产服务 → 服务健康证据与事件处置可观测、值班、故障、容量、SLO服务所属团队;依组织由开发/SRE 协同平台、基础设施、依赖团队
反馈改进交付与运行数据 → 可验证的改进项复盘、瓶颈、开发体验、效果验证业务与平台负责人共同推动开发、测试、SRE、产品

每次发布都应该能找到业务负责人、发布负责人和异常升级路径;这些职责可能由同一个人承担,但需要明确。

3. 技术栈与代表性开源项目#

项目名后的资料入口用于确认其定位,不代表必须全部安装。具体能力边界在各阶段章节继续解释。

阶段需要认识的技术代表性开源项目/工具
需求承接Issue、看板、状态流转、关联标识、APIOpenProject、Plane 开源版、Gitea Issues
技术设计HTTP、数据库、API 契约、设计记录、图示OpenAPI 生态、Mermaid
开发协作Git、PR/MR、保护分支、Webhook、本地环境Gitea、GitLab 开源部分
CI流水线、DAG、Runner/Agent、构建与测试工具Jenkins、GitLab CI/CD、Tekton
制品管理包、OCI 镜像、Digest、SBOM、仓库 APIHarbor、Gitea Packages、Dependency-Track
测试验收自动化测试、临时依赖、契约、压测Testcontainers、Pact、k6
CD容器、Kubernetes、声明式配置、GitOps、IaCArgo CD、Helm、Ansible
生产发布滚动、蓝绿、金丝雀、流量路由、变更控制Argo Rollouts、Kubernetes Deployment、Apache APISIX
运行态Linux、网络、指标、日志、链路、告警Prometheus、Grafana OSS、OpenTelemetry
反馈改进事件关联、时间口径、数据建模、看板Apache DevLake、Grafana OSS

GitLab 的开源部分与商业功能、Grafana OSS 与云服务、Plane 开源版与商业版本需要分别看待。GitHub Actions 可作为工作中常见的托管 CI/CD 对照,本表不把 GitHub 的整体托管平台当作开源平台。

4. 四个容易混淆的边界#

CI 是持续集成。 核心是频繁集成变更,并用自动化验证尽快暴露问题。有一个构建按钮不等于团队已经形成良好的持续集成实践。

CD 可能指两件事。 持续交付强调变更保持可发布,进入生产可保留人工决策;持续部署进一步让满足规则的变更自动进入生产。具体公司说“CD”时,需要确认指哪一种。本文的交付流程采用可保留人工生产决策的模型,工具实现参见 Jenkins Pipeline 和 GitLab CI/CD。

部署、发布、功能开放是三个可分别控制的动作。 部署把软件放进环境并运行;发布让目标用户或流量使用新版本;功能开放还可能受功能开关控制。公司内部可能把它们都叫“上线”,平台研发需要把实际动作和成功条件拆清楚。生产策略的实现边界见 Argo Rollouts 流量管理。

运行态持续存在。 流水线结束后,还要知道用户能否成功访问、延迟是否异常、服务容量是否足够。相关方法见 Google SRE:服务目标。

5. 贯穿各阶段的“证据链”#

平台需要能回答:线上这个版本从哪里来、为什么能发布、谁发布的、上线后怎样。

text
需求 REQ-123
  → MR-42 / Git commit
  → PipelineRun / 测试报告
  → Artifact digest / 扫描结果
  → Deployment / 环境配置版本
  → Release / 审批 / 流量变化
  → 指标 / 日志 / 事件 / 复盘

这是本文建议的平台领域模型,不是某款产品的统一标准。关键是使用可关联的稳定标识,避免只在页面里写一段无法追溯的文本。

6. 对转岗读者的优先级#

最先需要解释清楚的是:一次代码提交怎样变成生产中的某个版本;每一步怎样判断成功;失败时怎样恢复。

接着学习 CI、制品、CD、发布和运行态的实际操作。最后选择一个平台模块深入设计,例如“发布单状态机+同环境互斥+回调幂等+超时对账”。

自测:如果测试通过了,但生产接口一直超时,可能是哪几个阶段的哪些假设没有得到验证?阅读后续章节时持续带着这个问题。

CHAPTER 02

02|需求承接与技术设计

让需求可开发、可验证

返回阅读入口 · 下一章:开发协作

1. 阶段一:需求承接#

输入、产出与重点#

输入是业务目标,例如“用户想快速找到已经支付的订单”;产出是可验收的功能范围、优先级、依赖和交付安排。

需求中应该说明正常行为,也应该约定空结果、非法参数、权限不足和失败反馈。对平台研发而言,需求还需要关联服务、代码仓库、负责人及预期发布批次,便于后续追踪。

谁负责#

产品或业务负责人确认用户价值、范围和验收标准。业务开发评估实现与依赖,测试提前发现边界条件,技术负责人协调风险和拆分。研发效能平台团队负责需求系统与研发流程的连接能力。

共用案例的需求记录#

项目教学示例
功能GET /orders?status=paid&limit=20
身份与权限使用认证上下文,只能查当前用户自己的订单
排序与分页按创建时间倒序;明确相同时间的稳定排序及分页规则
参数status 使用明确枚举;limit 有默认值和上限
业务验收正常数据、空结果、非法参数、未认证、跨用户访问均有预期
性能目标在约定数据量和负载下验证;示例目标为 P95 小于 300ms
服务目标约定统计窗口、有效请求和成功定义;目标示例见运行态章
交付记录需求编号、服务、负责人、MR、测试证据和发布记录可关联

这里的 300ms 只用于练习。正式目标要由业务体验、已有基线、访问规模和成本共同决定。

技术栈与代表性项目#

需要理解 Issue、看板、工作流、权限、Webhook 和系统间 API。可以查看 OpenProject、Plane 开源版 和 Gitea Issues 如何表达任务、状态和协作。

核心技能#

深度应达到的能力
理解把“做个查询”翻译成范围、边界和验收标准
使用维护需求、缺陷、里程碑及代码关联
开发平台实现需求与 MR/发布记录的关联,处理同步失败、权限与状态差异

典型开发任务:接收任务系统事件,建立需求与服务、提交和发布的关联;支持补偿同步,并保留外部系统的原始 ID,便于对账。

2. 阶段二:技术设计#

输入、产出与重点#

输入是明确的需求;产出是团队能够实现、测试、部署和维护的方案。

设计范围包括 API 契约、数据访问、依赖行为、兼容性、运行观测和发布方案。对一个查询接口,除了 Controller 和 SQL,还要考虑超时、分页、索引、用户隔离和失败码。

谁负责#

业务开发或技术负责人主导方案。测试参与可验证性设计;安全团队按风险参与鉴权、数据和供应链评审;SRE 或基础设施团队协助容量与运行约束;平台团队提供标准模板和自动检查。

本案例需要做的设计判断#

  1. API 契约:字段、状态码、错误结构和分页语义是什么?客户端是否能识别错误?
  2. 数据访问:SQL 是否包含用户条件?扫描量是否随数据增大失控?需要新增什么索引?
  3. 兼容性:新旧代码共存时,响应和数据库结构是否都可用?
  4. 依赖与资源:数据库超时、连接池和并发上限怎样约束?请求取消后是否停止无用工作?
  5. 可观测性:请求数、失败率、延迟、慢查询和版本信息怎样关联?
  6. 发布:先部署到哪里,如何验证,小流量怎样放,什么情况下暂停?
  7. 恢复:旧版本能否读取新结构?已执行的数据变更是否需要前向修复?

设计记录可以采用简短 ADR:问题、可选方案、选择、理由、代价和回退条件。无需为小功能写冗长文档,但需要保留影响交付与运行的关键决策。

技术栈与代表性项目#

基础是 HTTP、SQL、索引、事务、认证授权、缓存及超时处理。使用 OpenAPI 描述 HTTP API 契约,使用 Mermaid 表达依赖和时序;跨服务行为验证可以进一步了解 Pact。

OpenAPI 是规范,Mermaid 是图示工具,Pact 是契约测试工具。它们分别解决表达和验证的一部分问题,设计判断仍需要开发者完成。

核心技能#

深度应达到的能力
理解知道功能设计会影响部署、回退和运行
使用编写 API 契约、验证 SQL、补齐发布与监控要求
开发平台把服务模板、契约检查、变更风险提示和审批规则接入工作流

典型开发任务:生成标准服务骨架,把接口契约差异检查接入 MR,并让发布单显式记录数据库变更和恢复方案。

3. 交接到开发前,应该能回答#

  • 谁确认业务验收,哪些情况必须阻断交付?
  • 新旧版本会共存多久,数据库变更怎样兼容?
  • 怎样知道功能在生产上工作正常?
  • 哪些规则由平台自动验证,哪些仍需人工判断?

只有排期、没有可验证目标,会让后续流水线把一份“能够编译的代码”误当成“能够交付的功能”。

官方资料#

CHAPTER 03

03|开发与代码协作

代码、评审与事件

返回阅读入口 · 下一章:CI

1. 输入、产出与重点#

输入是设计与验收标准,产出是可评审的代码、自动化测试和可复现的开发说明。

对业务开发,重点是正确实现、小批次提交和有效评审。对平台开发,重点是把仓库、身份、代码事件和后续任务可靠地连接起来。

2. 谁负责#

业务开发提交实现与测试,评审人检查正确性、兼容性、可维护性及风险。测试参与场景补充。平台团队维护仓库接入、保护规则、模板和事件处理能力。

代码平台的管理员不天然拥有每个应用的业务评审权限,平台管理员与生产发布权限也应分别表达。

3. 分支和评审要解决什么#

本文建议练习采用“短分支+PR/MR+主干保护”的简单模型:

text
main
  → feature/order-query
  → 提交代码与测试
  → PR/MR 自动检查与人工评审
  → 合并
  → 对合并后的确定提交生成交付候选

PR 和 MR 都是提议合并代码的协作对象,名称取决于产品。团队也可能采用其他分支策略;面试时应解释为什么选择某个流程,以及长分支、合并冲突、紧急修复怎样处理。

评审通过和自动检查通过是两类证据。平台应把“检查针对哪个提交”绑定清楚:评审后又推送新提交,旧结果是否仍有效,需要由规则决定。

GitLab 官方资料区分普通 MR 流水线和验证合并结果的流水线。不能看到“MR 检查通过”就假设目标分支合并后的组合已被测试;还要确认执行对象以及版本功能。

4. 本地环境要能复现#

团队至少应约定:

  • 语言运行时、构建工具与依赖版本的管理方式。
  • 一条明确的构建、测试和启动命令。
  • 本地数据库、缓存等依赖的准备方式。
  • 示例配置与密钥注入入口。
  • 初始化测试数据的方法。

容器可以统一部分环境,但硬件架构、操作系统、外部依赖和运行权限仍可能不同。复现问题时要记录差异。

本案例在本地完成参数、权限、空数据和数据库查询测试;集成测试可以通过 Testcontainers 启动临时依赖,再把同一测试入口交给 CI。

5. 平台收到代码事件后要做什么#

下面是教学设计:

  1. 校验事件来源和签名,解析仓库、提交、分支、事件类型和事件 ID。
  2. 以外部事件 ID 去重,保存接收记录。
  3. 判断是否需要创建流水线;同一次变更可能同时产生 push 和 MR 事件。
  4. 创建内部任务并投递队列,尽快返回事件接收结果。
  5. 异步执行后,将检查结果回写对应的提交和 MR。
  6. 回写失败时保留重试和对账记录。

“代码事件至少送达一次”是一个有用的设计假设:平台要能接受重复、迟到和漏回调,不能靠“Webhook 应该只来一次”保证正确性。

如果外部系统没有稳定事件 ID,可以用仓库、事件类型、提交、目标分支等组成业务去重键,并说明哪些重新执行应被允许。

6. 技术栈与开源项目#

能力技术代表性项目
版本管理Git、commit、分支、merge、tagGit;代码托管可选 Gitea/GitLab 开源部分
评审与规则PR/MR、保护分支、检查状态Gitea、GitLab
事件集成HTTP、Webhook、鉴权、队列、数据库基于代码平台 API 开发适配器
开发依赖容器、测试夹具、依赖生命周期Testcontainers

7. 核心技能#

深度应达到的能力
理解知道 commit、分支、tag 和 PR/MR 的区别,知道评审与验证绑定的对象
使用处理冲突、阅读 diff、补充测试、检查提交状态和事件记录
开发平台实现事件验签、幂等、权限校验、异步触发、检查回写和补偿

已有服务端经验的迁移点非常直接:Webhook 就是一个有认证与幂等要求的接入 API;流水线触发是异步业务流程;检查回写是外部系统集成。

8. 本阶段的交付证据#

本案例进入后续阶段时,至少能定位需求、MR、具体 commit、评审结果和自动检查结果。出现“本地通过,CI 失败”时,应能比较依赖、运行时、环境变量和测试数据。

自测:同一个 MR 的旧提交测试通过,新提交还没测,平台应该显示什么?为什么不能只在 MR 表里保存一个 success=true?

官方资料#

CHAPTER 04重点阅读

04|CI:持续集成

把变更变成可信结果

返回阅读入口 · 下一章:制品管理

1. 本阶段解决什么#

输入是一个确定的代码版本、流水线定义和执行参数;产出是与该版本绑定的检查结果、日志、测试报告,以及允许生成时的候选制品。

持续集成强调频繁集成和及时验证。平台提供自动化执行与反馈,业务团队仍需要维护有意义的测试,并及时处理主干失败。

2. 谁负责#

角色主要责任
业务开发构建与测试入口、依赖声明、业务测试、代码失败修复
测试自动化场景、测试分层、失败证据、测试稳定性
安全团队检查规则、风险分级、例外与修复要求
平台研发触发、模板、调度、执行隔离、日志报告、状态回写和平台可靠性
基础设施团队计算资源、网络、镜像与存储等底层能力,具体按组织分工

3. 一次 CI 的完整路径#

一次 CI 的完整执行与门禁 push / MR / 手动触发 校验身份、去重、锁定 commit 解析并固定流水线版本 进入队列,选择执行资源 拉取代码与依赖 编译、单元测试、静态检查 集成测试与约定的安全检查 汇总结果、上传报告 满足门禁?否是 反馈失败并阻断后续交付 允许生成或登记候选制品
一次 CI 的完整执行与门禁 · 可横向滑动
查看图示源码
flowchart TD
    A["push / MR / 手动触发"] --> B["校验身份、去重、锁定 commit"]
    B --> C["解析并固定流水线版本"]
    C --> D["进入队列,选择执行资源"]
    D --> E["拉取代码与依赖"]
    E --> F["编译、单元测试、静态检查"]
    F --> G["集成测试与约定的安全检查"]
    G --> H["汇总结果、上传报告"]
    H --> I{"满足门禁?"}
    I -->|否| J["反馈失败并阻断后续交付"]
    I -->|是| K["允许生成或登记候选制品"]

这里的顺序可以调整。通常先做快且容易发现问题的检查,互不依赖的任务并行;成本高的检查按变更风险和反馈时效安排。最终候选制品要验证合并后的确定提交,不能直接把任意 MR 产物视为可信生产版本。

4. 先认识执行模型#

概念含义平台研发关注点
Pipeline Definition流水线定义:执行哪些任务、依赖和条件版本、校验、模板升级
Pipeline Run对某个提交的一次完整执行触发来源、状态、结果、审计
Job/Task可以调度的任务单元输入输出、超时、资源、重试
Step任务中的一个具体操作命令执行、退出码、日志
Runner/Agent真正执行任务的环境标签、容量、心跳、隔离
DAG有向无环任务依赖图依赖解析、并行、失败传播
Artifact需要保留并传递的执行产物完整性、归属、访问权限
Cache为提速而复用的内容命中率、失效、污染防护

不同产品叫法和粒度不同。例如 Jenkins 使用 Pipeline、Stage、Step、Agent 等概念;GitLab 使用 Job、Stage 和 Runner,并支持按依赖组织执行。平台的内部模型需要做清晰映射。

5. 一个简化的流水线例子#

以下是 Java 项目中的 Jenkinsfile 教学片段:项目已提交 Maven Wrapper,Jenkins Agent 已准备兼容的 JDK,控制器已安装所需 Pipeline 与 JUnit 功能。语言不同就替换对应的构建和测试入口。

groovy
pipeline {
    agent { label 'java-build' }
    options {
        timeout(time: 15, unit: 'MINUTES')
    }
    stages {
        stage('Verify') {
            steps {
                sh './mvnw -B verify'
            }
        }
    }
    post {
        always {
            junit testResults: '**/target/surefire-reports/*.xml',
                  allowEmptyResults: false
        }
    }
}

这个片段只示意“运行验证+收集单元测试报告”。它没有实现本章其余平台能力,也未自动收集所有集成测试报告。项目若使用 Failsafe 等工具,需要追加对应报告路径并确认 verify 确实执行了测试。

关键是失败要向上传播:不要为了让流水线变绿,在测试命令后附加忽略错误的逻辑。报告缺失也需要有明确含义,避免“根本没跑测试”被展示成测试成功。

6. 质量门禁怎样定义#

质量门禁是进入下一步的条件,可以包含:

  • 编译和必选测试成功。
  • 代码与依赖检查达到团队规则。
  • 必需的评审已完成,且对应当前提交。
  • 制品来源、扫描与签名满足发布要求。
  • 测试报告存在且可追溯。

规则应版本化,并记录阻断原因。覆盖率是辅助证据,不能单独代表质量;对支付、权限、幂等等关键行为,有意义的测试比追求统一百分比更重要。

对历史存量问题,可以区分新增风险与已有风险。允许例外时应绑定审批、理由、范围和过期时间,避免永久绕开规则。

7. 平台后端真正难在哪里#

7.1 调度与资源#

排队慢、执行慢、拉取依赖慢是不同问题。先把时间拆开,再决定是增加 Agent、优化依赖下载,还是调整任务并行。

需要理解资源配额、租户公平性、任务标签、执行超时和孤儿任务回收。对外暴露“等待资源”比一直显示“执行中”更有用。

7.2 状态与恢复#

教学状态可以是:

text
CREATED → QUEUED → RUNNING → SUCCEEDED / FAILED / CANCELED

还需记录外部任务 ID、执行尝试、心跳和最后对账时间。Runner 断连时,任务结果可能未知;先查询和对账,再决定是否重试。外部任务已完成但平台没收到回调,与任务从未执行,是两种情况。

创建外部任务前保存内部运行与尝试 ID,并尽量让外部任务携带可查询的关联标识。若创建响应丢失,仍需要有定位任务的方法;外部系统不提供可靠关联时,应保留结果未知并人工核对。

取消请求也不等于任务已停止。平台要区分“用户请求取消”和“执行器已确认停止”,并说明哪些副作用已经发生。

7.3 重试与幂等#

网络暂时不可用可以有限重试;编译错误、业务断言失败通常需要修复。对不稳定测试,应保留首次失败与重试结果并推进治理。

构建、上传、登记制品可能有副作用。每次重试都应有明确的尝试 ID,并保证重复回调不会重复创建制品或触发发布。

7.4 执行隔离与凭据#

构建任务会运行仓库中的代码,因此要明确代码信任边界。外部贡献的 MR、普通分支和受保护分支不应默认获得相同凭据。

执行环境应按风险隔离,凭据按任务和环境最小化授予。日志需要避免泄露密钥;平台不能仅靠界面隐藏来保护后端资源。

7.5 缓存与可复现#

依赖缓存可以提速,但缓存命中不代表内容可信或构建正确。缓存键要考虑依赖声明、运行时和架构等差异;不可信任务不能随意覆盖可信任务使用的缓存。

依赖版本、基础镜像、构建工具和网络来源也会影响输出。记录 commit 只是来源追踪的一部分。

8. 技术栈与代表性开源项目#

层面技术/工具学习重点
自动化引擎JenkinsAgent、Pipeline、共享库、插件集成
一体化代码与 CI/CDGitLab CI/CDYAML、Runner、MR 关联;区分版本和套餐能力
Kubernetes 原生流水线TektonTask、Pipeline、执行资源和控制器模型
项目验证Maven/Gradle、Go test、pytest 等掌握自己语言的一套工具即可
平台后端HTTP、关系数据库、队列、对象存储、容器 API异步、幂等、状态、权限和可靠集成

选择一个引擎做练习即可。Jenkins、GitLab CI 和 Tekton 都可以覆盖部分交付流程,CI 与 CD 的划分来自工作目的,不取决于工具名称。

9. 核心技能与验收标准#

深度本章应掌握
理解提交怎样触发执行;定义与运行的区别;测试结果怎样绑定提交
使用配置一条流水线,读取日志和报告,区分代码、环境和平台失败
开发平台仓库接入、DAG 调度、执行器适配、日志报告、幂等与状态对账

本案例应留下 commit、流水线定义版本、运行 ID、任务耗时、测试报告和失败原因。刻意让一个权限测试失败,验证是否确实阻断后续交付。

自测:有人说“流水线偶尔失败,自动重跑直到成功就行”,你会从测试稳定性、结果可信度和副作用三个方面怎样回应?

官方资料#

CHAPTER 05重点阅读

05|制品管理与软件供应链

给交付物一个确定身份

返回阅读入口 · 下一章:测试与验收

1. 输入、产出与重点#

输入是某次可信构建的输出;产出是可以准确定位、校验、授权访问、关联验证结果并再次部署的制品。

制品可以是 JAR、二进制、前端资源包、容器镜像或 Helm Chart。它是 CI 与 CD 交接的关键对象。

本文采用“构建一次,把同一份制品晋级到不同环境”的教学模型。环境差异由配置、密钥和运行资源表达,避免测试与生产分别构建而产生无法解释的差异。

2. 谁负责#

业务开发定义打包方式与依赖。平台或仓库团队提供上传、下载、授权、保留和可用性能力。安全团队制定风险规则。发布负责人确认指定制品具备进入目标环境的证据。

3. Tag 和 Digest 为什么不同#

例如:

text
registry.example.com/team/order-service:git-a1b2c3d
registry.example.com/team/order-service@sha256:<完整摘要>

第一种使用人类可读的标签,第二种按内容摘要寻址。标签是否可覆盖取决于仓库策略;摘要用于固定具体内容。正式记录应保存完整摘要,不能只保存缩写或 latest。

OCI 的内容描述及摘要约束见 OCI Image Specification。Harbor提供标签不可变策略,实施前需要检查匹配规则。

多架构镜像还要记录目标平台,区分镜像索引摘要与平台镜像摘要。示例中的摘要表达的是引用方式,尖括号部分需替换为真实值。

4. 一份制品需要关联什么#

建议的最小元数据:

字段用途
服务、仓库与 commit关联来源和负责人
流水线运行与定义版本找到生成过程
制品地址、类型、完整摘要固定内容、正确下载
运行平台与架构避免构建与部署目标不匹配
测试与扫描结果解释为什么允许晋级
构建时间、构建器与依赖信息排查来源和环境差异
签名/证明及验证结果对来源与策略提供额外证据
部署和发布引用追踪哪些环境正在使用

这是平台设计建议,不要求自建仓库实现全部存储格式。平台可以在自己的数据库保存关联关系,制品内容继续放在专业仓库中。

5. 供应链相关概念#

概念解决的问题局限
漏洞扫描已知依赖或镜像内容有什么风险未发现风险不等于没有风险,结果依赖扫描器和漏洞库
SBOM这份软件包含哪些组件清单需要准确生成,不能单独证明安全
签名内容或声明由什么身份签署要验证身份、信任根、范围和策略
Provenance由哪些输入、什么构建过程产生可信程度取决于生成与验证链路
访问控制谁能上传、读取、删除或晋级需要在 API 和存储层真正执行

SLSA Provenance说明构建来源证明;Sigstore Cosign提供容器签名相关能力;Dependency-Track关注组件清单及供应链风险分析。它们各自提供证据与工具,业务仍需制定接受规则。

6. 晋级、隔离与保留#

晋级表示这份制品满足进入下一环境的条件。可以通过元数据、仓库分区或镜像复制表达,关键是明确源摘要、目标摘要和验证证据。

需要防止以下情况:

  • 未通过测试的分支产物进入生产候选列表。
  • 标签被覆盖后,发布记录仍显示旧测试结果。
  • 仓库清理删除了正在运行或回滚所需的版本。
  • 漏洞库更新后发现新风险,但无法定位受影响的生产版本。

保留策略需要结合运行引用、回滚窗口、审计和存储成本。删除前核对引用关系;垃圾回收和业务删除是不同层面的动作。

7. 平台后端的典型开发任务#

  1. 封装仓库适配器,完成上传登记、摘要校验和状态查询。
  2. 建立 commit、PipelineRun、Artifact、Deployment、Release 的关联。
  3. 根据制品、环境、规则版本和证据计算是否允许晋级。
  4. 接收异步扫描结果,处理重复事件与旧结果覆盖。
  5. 查询某个漏洞涉及哪些制品、服务和部署。
  6. 实现带引用保护的保留策略及可审计的操作记录。

扫描服务不可用时,应表达“结果未知”或“检查失败”,并按规则阻断或走显式例外,不能当成“没有漏洞”。

8. 技术栈与代表性项目#

项目在本阶段的位置不应混淆的边界
HarborOCI 制品仓库、权限及相关策略不替代业务测试和发布判断
Gitea Packages与代码平台结合的包管理支持格式和限制看所选版本
Dependency-Track基于组件清单的风险分析不承担容器执行和部署编排
Cosign签名与验证工具需要配套身份、密钥或无密钥信任策略

9. 核心技能与案例验收#

深度本章应掌握
理解制品、标签、摘要、SBOM、扫描和来源证明的区别
使用推拉镜像、查询摘要、查看扫描结果,按固定版本部署
开发平台制品登记、证据关联、晋级规则、异步事件和引用保护

本案例从主干构建候选镜像,记录完整摘要。测试、预发和模拟生产使用同一摘要,并各自记录配置版本。找到其中任一运行实例,都应能追溯到代码和测试报告。

自测:测试环境和生产环境都用了 v1.2.0,为什么仍不能证明它们运行相同内容?

官方资料#

CHAPTER 06

06|测试与验收

把正确性变成证据

返回阅读入口 · 下一章:CD

1. 输入、产出与重点#

输入是明确的代码或制品版本、测试范围、测试数据和环境;产出是可复查的验证证据、缺陷及剩余风险。

测试贯穿开发和交付。单元测试可以在本地和 CI 执行;集成测试可以在 CI 启动临时数据库;完整系统验证可能需要把候选制品部署到集成环境。本文单列这一章,是为了说明环境验证和业务验收怎样连接 CI 与 CD。

2. 谁负责#

业务开发对实现及基础自动化测试负责。测试人员补充系统场景、组织质量验证并推动风险闭环。产品或业务代表确认业务验收。平台团队提供环境、执行、报告和证据关联能力。

测试团队的确认不替代业务开发的质量责任;平台上的“通过”也需要能追溯到具体测试范围。

3. 各类测试分别验证什么#

类型本案例的检查内容适合位置主要局限
单元测试参数限制、状态判断、用户条件构造本地/CI常隔离了真实依赖
数据访问集成测试真实数据库的 SQL、排序、分页、索引行为CI 临时依赖/集成环境数据规模与生产可能不同
API 测试身份、状态码、响应结构、越权、空结果本地服务/部署后不一定覆盖前端用户路径
契约测试消费方与提供方对字段和交互的约定CI/跨服务验证需要参与方维护契约
端到端测试用户进入页面、筛选并查看订单测试/预发环境成本和脆弱性较高
性能与容量验证延迟、吞吐、慢 SQL、资源饱和受控压测环境必须说明数据量与负载模型
安全验证用户隔离、注入、敏感信息、依赖风险CI+专项环境扫描器不能覆盖全部业务风险
业务验收结果是否满足需求与体验测试/预发环境不覆盖所有技术正确性
上线冒烟生产路由、权限、依赖和核心查询能否工作发布过程中场景少,不能替代完整测试

测试层次是选择验证手段的思路,不意味着每个项目都要配置相同数量的测试或独立平台。

4. 环境和数据常常比测试脚本更难#

环境可识别#

需要记录运行中的制品摘要、部署配置、依赖版本、数据库结构和测试时间。出现问题时,才能知道测试的是哪套组合。

共享环境上被另一组发布覆盖,是一种环境冲突。可以通过预约、隔离命名空间或临时环境缓解,但隔离同时还要考虑账号、数据、队列和外部服务。

数据可构造#

本案例至少准备两个不同用户、各类订单状态、空结果和分页边界。大数据量验证还要设计合理分布,不能只插几条记录就宣称性能满足生产目标。

测试数据使用合成数据或经过批准的脱敏流程。练习中用合成用户与订单即可。

依赖可控制#

Mock 便于构造失败,但与真实服务行为可能有偏差。对关键依赖应结合契约测试、真实集成和超时场景验证。

使用 Testcontainers 管理测试中的容器依赖时,还要确认执行器具备所需容器运行能力和资源;它并不自动解决所有跨服务环境问题。

5. 验收结果应绑定什么#

建议保存:

text
TestRun
  - 测试计划 / 用例版本
  - 代码提交或制品完整摘要
  - 环境与配置快照标识
  - 测试数据版本 / 负载参数
  - 执行人或执行器
  - 开始与结束时间
  - 结果、报告、缺陷和例外

同一制品换了数据库结构、关键配置或运行架构,旧测试证据是否仍然足够,需要规则判断。只保留“本周已通过测试”的文字,无法约束实际发布对象。

6. 平台后端的典型开发任务#

  • 为 MR 创建临时环境,配置到期回收和异常回收。
  • 调度测试,保存报告,并和发布单关联。
  • 管理测试数据初始化、隔离和清理流程。
  • 把门禁结果回写代码平台或 CD。
  • 区分应用失败、测试框架失败、环境不可用和结果未知。
  • 统计不稳定测试,保留首次失败证据。

删除临时环境前,要验证所属项目与运行状态;环境回收失败也需要可追踪的任务记录。

7. 技术栈与代表性开源项目#

项目适用位置应先学什么
Testcontainers代码测试中的临时数据库等依赖生命周期、就绪判断、数据准备
Pact消费方与提供方的契约测试契约表达、验证和版本兼容
k6负载生成、指标和性能阈值负载模型、检查与阈值
Playwright浏览器端到端测试用户路径、断言、测试隔离

对平台后端岗位,先掌握 API 和依赖集成测试,再了解跨服务和端到端验证如何接入,不要求先成为所有测试工具的专家。

8. 核心技能与案例验收#

深度本章应掌握
理解不同测试覆盖的风险,测试结果的适用范围
使用写自己的语言测试、构造依赖和数据、分析失败报告、做受控压测
开发平台环境生命周期、测试调度、报告规范、证据绑定和门禁

本案例要留下权限、分页、状态过滤和数据库集成测试;部署后验证实际路由;用可复现负载检查延迟与数据库瓶颈。测试通过后明确哪些风险仍未覆盖。

自测:CI 单元测试全绿,生产接口返回了别人的订单,测试设计和需求验收可能缺少哪些内容?

官方资料#

CHAPTER 07重点阅读

07|CD:持续交付、环境与部署

让期望状态落到环境

返回阅读入口 · 下一章:生产发布

1. 输入、产出与重点#

输入是已识别的制品、目标环境、部署定义、配置与授权;产出是目标环境中的实际版本及其状态证据。

本章采用可保留人工生产决策的持续交付模型。持续部署进一步把满足条件的变更自动送入生产。是否全自动取决于风险、验证能力和团队选择。

平台研发要保证“发布哪个内容、到哪个环境、使用什么配置、结果怎样”都明确可查。

2. 谁负责#

业务团队确认部署内容、配置需求和业务风险。平台团队维护环境模型、部署入口、编排和状态反馈。基础设施团队管理集群、网络、存储等底座。SRE 按组织分工参与运行标准、容量和生产稳定性。

生产操作的发起人、批准人和执行身份需要可识别。审批应绑定具体变更内容,制品或配置变化后应重新判断审批是否有效。

3. 先分清四种对象#

对象表达什么本案例
制品要运行的内容order-service 的镜像摘要
环境运行在哪里、依赖什么测试/预发/生产,各自的集群、权限与数据库
部署定义与配置怎样运行副本数、资源、端口、探针、数据库连接和配置版本
部署执行一次从当前状态到目标状态的操作某次把测试环境切换到指定摘要

镜像相同而配置不同,行为仍然可能不同。因此交付证据应覆盖“制品+部署定义+配置引用+环境”这组组合。

4. Kubernetes 中先学哪些概念#

概念对平台研发的意义
Pod应用容器的运行单元之一,检查状态、日志和事件的入口
Deployment/ReplicaSet期望副本和更新过程
Service服务发现和流量到实例的连接
Gateway/Ingress 及其控制器外部访问与路由;具体能力依实现
Namespace资源与权限组织边界之一
ConfigMap/Secret配置与敏感数据注入机制
ServiceAccount/RBAC平台或工作负载能执行什么操作
Requests/Limits资源调度和约束
Probe启动、就绪和存活判断
Event/Status解释调度、拉镜像和运行失败的证据

Namespace 并不自动提供完整租户隔离,还需要结合权限、网络、资源配额和安全策略。Kubernetes Secret 的编码也不等于加密;存储保护和访问权限需要单独配置,见 Secrets 官方说明。

虚拟机部署场景则要学习进程管理、软件包分发、服务配置和主机编排;Ansible 是这类自动化的代表性工具。DevOps 平台不一定都以 Kubernetes 为底座。

5. 两种常见部署路径#

路径 A:平台驱动执行#

text
平台校验发布请求
  → 创建部署任务
  → 执行器调用部署工具或 Kubernetes API
  → 查询资源与探针
  → 汇总部署结果

这一路径便于把审批、命令和状态放在同一工作流,但需要严格管理执行凭据、权限、超时和补偿。

路径 B:GitOps#

text
生成目标环境配置变更
  → 配置仓库评审并合并
  → Argo CD 发现期望状态变化
  → 与集群实际状态比较并同步
  → 平台读取同步与健康结果

Argo CD 自动同步围绕 Git 中的期望配置与集群状态工作。生产是否自动同步、是否允许删除、是否启用自愈,都需要明确配置。

GitOps 让变更来源更清楚,也带来一致性要求:直接在集群手工回退后,如果 Git 仍指向新版本,自动对齐可能覆盖临时操作。恢复时要协同更新期望状态或采用团队约定的受控暂停流程。

6. Helm、Kustomize 和 Argo CD 的边界#

工具核心位置
Helm将 Kubernetes 应用组织成 Chart,通过参数渲染和管理
Kustomize以基础配置和覆盖表达差异
Argo CDGitOps 交付、差异比较、同步和状态观察
OpenTofu基础设施声明与变更管理,可用于环境底座准备

不要为了技术名词齐全同时引入所有工具。先选一种环境配置表达方式,再确定交付控制方式。基础设施变更和应用发布可以关联,但应有各自清晰的权限与状态。

7. 怎样判断部署完成#

至少区分四层证据:

  1. 请求被接受:API 已接收清单或任务。
  2. 资源达到目标:控制器观察到目标配置,副本逐步更新。
  3. 实例可以接收流量:探针、服务端点和依赖满足就绪条件。
  4. 业务验证通过:从实际入口执行必要冒烟,结果符合预期。

前三层属于部署控制与资源健康证据,第四层开始连接业务验证。平台应明确展示当前到哪一层,不能把执行命令返回 0 直接解释成用户可用。

具体字段和更新条件依 Kubernetes 资源类型而异,见 Deployment 官方资料。观察一个 Deployment 时,需要确认状态对应本次目标版本,避免误读旧状态。

8. 平台后端的典型实现#

请求与校验#

教学请求可以包含:

json
{
  "applicationId": "order-service",
  "environmentId": "staging",
  "artifactId": "artifact-123",
  "configurationRevision": "config-42",
  "strategy": "rolling",
  "idempotencyKey": "request-20261016-001"
}

服务端解析制品完整摘要,校验环境权限、证据、配置兼容与并发变更。调用者提交 ID 不代表已获得授权。

异步执行#

API 创建任务后返回任务 ID,由 Worker 执行或推进期望状态。数据库状态与队列投递应设计一致性保证,例如事务性 Outbox:先在同一事务保存任务和待发事件,再可靠投递。

并发与对账#

同一应用、同一环境的变更可能冲突。平台可以排队、拒绝或显式替代,关键是规则可解释。锁失效后还要防止旧执行者继续写入,可结合操作版本或 fencing token。

外部系统超时后先查询真实状态;记录已执行步骤和外部 ID。调用前就持久化内部操作 ID,并按外部能力设置确定性资源名、标签、幂等令牌或可查询关联字段,以便创建响应丢失时仍能定位任务。

如果外部系统无法可靠定位这次操作,应保留“结果未知”并转受控人工核对,避免盲目重试。具备足够证据时,平台重启后通过对账恢复推进,防止重复执行迁移或覆盖新的发布。

9. 核心技能与案例验收#

深度本章应掌握
理解持续交付/部署、环境、声明式配置、期望与实际状态
使用部署应用,检查 Pod、Service、事件和探针;解释配置差异
开发平台环境模型、权限、编排、适配器、并发互斥、Outbox 与状态对账

本案例把同一镜像摘要部署到测试和预发,保存各自配置版本。故意写错镜像地址,观察平台能否报告拉取失败;修正后再验证业务入口。

自测:平台调用 Kubernetes API 超时了,但集群可能已经开始更新。此时为什么不能直接再次创建一个全新发布?

官方资料#

CHAPTER 08重点阅读

08|生产发布、流量与上线验证

控制流量,也控制风险

返回阅读入口 · 下一章:运行态

1. 输入、产出与重点#

输入是明确的候选制品、配置、验证证据、发布策略和授权;产出是经过生产观察的版本,以及完整的发布过程记录。

部署完成意味着软件已按定义运行;生产发布还需要决定哪些用户使用新版本、怎样观察、什么时候扩大、何时停止。功能开关又可以独立决定功能是否对用户开放。

2. 谁负责#

发布负责人确认本次变更范围、操作节奏与异常决策。业务开发保证实现与兼容,测试提供验证证据,SRE 协助运行风险和故障处置,平台团队提供发布编排与控制能力。

这些职责可以由不同岗位或同一人承担。发布前需要明确:谁有权暂停、回退和恢复,异常找谁,多久升级。

3. 常见发布策略#

策略实际动作适合认识的优点要承担的约束
滚动更新逐批替换实例复用现有部署机制新旧版本共存,需要兼容和容量余量
蓝绿同时准备两组版本,再切换入口流量切换边界清晰额外资源、连接与数据兼容
金丝雀/灰度先给新版本部分流量或用户,再逐步扩大在较小范围观察风险需要分组、路由、观察和停止规则
功能开关控制已部署代码中的功能入口可以分别控制部署和功能开放需要管理权限、默认值、失效及过期清理

这些机制可以组合。功能开关关闭后,已经写入的数据、发出的消息和执行过的迁移仍然存在,需要另外处理。

Kubernetes Deployment 支持滚动更新;更细的灰度策略可参考 Argo Rollouts。按请求分配权重需要相应流量管理能力,不能简单把“1 个新 Pod、9 个旧 Pod”等同于精确的 10% 请求,见 流量管理说明。

4. 一次生产发布应该经过哪些判断#

发布前#

  • 固定制品摘要、部署定义、配置、目标环境和策略版本。
  • 核对测试、风险例外、审批和依赖状态。
  • 确认数据库变更顺序和旧版本兼容范围。
  • 准备新旧版本观测、冒烟和恢复操作。
  • 确认资源、值班和变更冲突。

审批应该对应具体输入。审批后替换镜像或关键配置,需要重新判断原审批是否仍适用。

发布中#

  1. 建立新版本实例,确认启动和就绪。
  2. 从实际业务入口执行冒烟。
  3. 按策略引入目标流量。
  4. 观察新旧版本及共享依赖,判断继续、暂停或停止。
  5. 扩大范围,直到完成约定的发布阶段。

发布后#

确认版本分布与配置,保留观察窗口、发布记录及异常关联。流水线退出后仍要持续监控,不能只看发布那几分钟。

5. 本案例的教学灰度规则#

以下为练习方案,数值用于帮助理解,不是通用生产标准:

项目教学约定
阶段测试 → 预发 → 小流量 → 扩大 → 全量
冒烟合法用户可查、空结果正确、跨用户被阻止
新版观测对 /orders 按版本观察失败率、P95、流量和数据库耗时
绝对目标示例:有效请求成功率至少 99.9%,P95 小于 300ms
相对比较与同一窗口的旧版本对照,并解释请求构成差异
样本要求示例:每阶段至少观察 5 分钟,且新版本有至少 1000 个有效请求
证据不足未达到样本量或关键指标缺失时,继续等待或人工判断
异常动作停止扩大,评估切回旧版本、关闭功能或其他止损方式

这些条件需要结合使用。刚好 1000 次请求时,极少的失败就会显著影响比例;少量样本也难以稳定估计尾延迟。演练阈值不能直接复制成生产规则。

自动分析至少区分“通过、失败、结果不确定”。监控查询错误、没有流量和没有错误请求是不同情况。Argo Rollouts Analysis提供指标分析及相应控制机制,具体模板需要按实际指标设置。

6. 数据库变更为什么是发布难点#

应用可以切回旧镜像,数据库和用户数据未必能恢复原样。

对新增字段或格式调整,可研究“先扩展、再迁移、最后收缩”的兼容策略:

text
增加兼容结构
  → 部署兼容新旧结构的代码
  → 分批迁移或补齐数据
  → 验证新读写路径
  → 经过兼容窗口后再删除旧结构

新增索引也要评估数据库版本、锁、磁盘和运行影响;“只加索引”不能自动视作无风险操作。本案例可以把索引变更作为独立任务,记录执行结果,再部署查询代码。

迁移任务应有唯一版本、执行记录和并发保护。执行超时后先检查真实状态,不能直接重复做非幂等变更。

7. 回滚、终止和修复要分别表达#

操作目的需要确认
暂停暂停后续推进,便于判断当前流量、实例和观察是否仍受控
终止灰度停止本轮新版本扩散实际流量是否切回、后台控制器是否继续动作
应用回退运行旧制品或旧配置与当前数据库、消息和依赖是否兼容
关闭功能停用特定用户入口是否真的覆盖所有入口及副作用
前向修复发布修正版解决问题修复风险、验证与完成时间

回退是一项需要验证结果的操作。平台至少记录目标版本、路由和实例状态,再执行必要业务检查。

GitOps 模式还要处理 Git 中的期望状态。Argo CD 自动同步文档说明启用自动同步时的回退限制,不能把历史回退按钮当作所有场景下都可直接执行的方案。

8. 平台后端的典型开发任务#

发布平台可以采用以下教学状态:

text
DRAFT → VALIDATING → APPROVAL_PENDING → READY
  → DEPLOYING → VERIFYING → CANARY → OBSERVING → SUCCEEDED

异常与控制分支包括 PAUSED、ABORTING、ROLLING_BACK、ROLLED_BACK 和 FAILED。每个状态要写清进入条件、允许动作、超时和外部系统状态。

关键实现包括:

  • 审批绑定输入快照,变更后重新校验。
  • 同环境发布互斥,防止两个任务交叉推进。
  • 指标查询与判断规则版本化,记录窗口、样本和结果。
  • 重复或迟到的回调不能覆盖更新状态。
  • 平台重启后,基于执行步骤和外部状态恢复。
  • 终止或回退期间,停止旧的自动推进任务。
  • 所有操作保存身份、原因、输入、结果和关联 ID。

9. 技术栈与代表性开源项目#

项目适用能力
Argo Rollouts渐进发布、分析与策略推进
Apache APISIX网关与路由能力;具体灰度方式需配置验证
Unleash功能开关;需区分开源与商业能力
Kubernetes Deployment副本与滚动更新

不需要为了学发布而先搭建服务网格。先用一种可解释的方式控制流量,并验证它确实按预期生效。

10. 核心技能与案例验收#

深度本章应掌握
理解部署、放量、开关、数据库变更和回退的不同边界
使用做一次分批发布,检查新旧版本,主动暂停并验证恢复
开发平台发布状态机、审批快照、互斥、指标判定、恢复和审计

本案例故意引入查询延迟,观察灰度是否停止。切回旧版本后,从业务入口验证恢复,记录故障与操作时间。

自测:所有 Pod 都 Ready,但新版本查询慢了三倍,平台应该根据什么决定暂停?监控服务恰好不可用时又怎么办?

官方资料#

CHAPTER 09重点阅读

09|运行态、可观测性与可靠性

以用户体验判断健康

返回阅读入口 · 下一章:反馈与效能

1. 输入、产出与重点#

输入是持续运行的服务、运行配置、流量、依赖和服务目标;产出是对服务状态的判断、可执行的告警、事件处置记录和改进项。

需要回答:用户是否正常使用服务,异常在哪里,怎样先恢复,怎样减少再次发生。可观测数据是判断依据;看板和工具本身不替代判断。

2. 谁负责#

服务所属团队对服务行为与业务结果负责。SRE 按组织分工提供可靠性工程、值班和生产保障能力。平台团队提供采集接入、发布关联、告警路由和诊断入口。基础设施团队对底层平台负责。

平台后端岗位是否承担业务值班、平台自身值班,或者二者都承担,需要在面试中确认。

3. 从用户视角到系统内部#

视角本案例要观察什么典型用途
用户/业务是否能查到正确订单、权限是否正确判断用户影响
服务接口流量、失败率、延迟、并发快速识别服务变化
应用进程线程/协程、堆、GC、连接池、事件循环定位应用资源问题
依赖SQL、连接数、锁、缓存、下游调用定位外部等待和瓶颈
容器与主机CPU、内存、磁盘、网络、重启与调度定位资源与运行环境问题
变更镜像、配置、扩缩容、数据库、路由形成排查假设

不要看到 CPU 正常就认定服务正常。数据库等待、线程池排队、网络故障和权限错误都可能影响用户。

4. 三类常用可观测数据#

数据擅长回答要注意
Metrics 指标何时发生、多大范围、趋势怎样标签基数、采样间隔、聚合与统计窗口
Logs 日志某次行为发生了什么、错误上下文是什么结构化、脱敏、关联 ID、成本
Traces 链路一次请求经过哪些服务、耗时分布在哪里传播上下文、采样、异步和缺失节点

实际系统还可能使用剖析等数据。本指南先掌握上述三类。

OpenTelemetry提供插桩、生成、采集与导出等能力,通常还需要后端存储、查询和展示系统。使用 OpenTelemetry 不等于已经获得完整的监控平台。

5. 指标、SLO 和错误预算#

本文采用如下教学约定:

  • SLI:衡量用户体验的实际指标,例如有效查询请求的成功比例。
  • SLO:为 SLI 设定目标,例如滚动 30 天内成功比例至少 99.9%。
  • SLA:对外的服务承诺及相应约定,需要结合合同和业务定义。
  • 错误预算:在所定目标内允许的不良事件份额。

对请求成功率 SLO,若窗口内有 100 万个有效请求、目标为 99.9%,允许的不良请求份额为 1000 次。它不是固定的一段停机分钟数。需要结合是否均匀有流量来解释影响。

服务目标相关方法参见 Google SRE:Service Level Objectives。本文例子是为案例自拟的口径。

必须定义分母和失败#

本案例可以把正常合法查询作为有效请求,把服务端错误、超时或违反约定的异常响应视作不良事件;无权限或非法参数是否进入分母,需要按业务目标明确。

如果只统计应用收到的请求,入口连接失败可能完全看不到。应结合入口指标、合成探测或用户侧证据,说明测量的覆盖范围。

6. 探针通过为什么仍然可能有问题#

Kubernetes 中需要区分:

探针判断目标设计注意
Startup应用是否完成启动为慢启动提供合理空间
Readiness实例是否适合接收流量要与实际接流量能力匹配
Liveness实例是否需要通过重启恢复避免因共享依赖异常造成重启风暴

具体失败行为见 Kubernetes Probes。探针可以验证必要条件,但通常不执行完整业务路径。

例如 GET /readyz 只检查进程与连接池状态,而 /orders 缺少索引导致慢查询。此时 Pod 可能 Ready,业务延迟依然很高。

7. 指标和日志怎样接入#

建议先做一套能解释案例的最小数据:

  • 接口请求数,按路由模板、状态类别等有限维度区分。
  • 请求耗时直方图,支持观察尾延迟。
  • 数据库操作耗时、连接池使用和等待。
  • 结构化请求日志:时间、路由、状态、耗时、trace ID、版本。
  • 版本与发布标记,便于把异常与变更关联。

订单 ID、用户 ID、完整 URL 通常不适合成为指标标签,会产生大量时间序列。细粒度标识应按需要放在受控日志或链路中,并考虑隐私与成本。相关建议见 Prometheus Instrumentation。

观测新旧版本时也要控制版本标签的生命周期,避免永久保留无限增长的版本组合。

一个延迟查询示意#

假设服务已经暴露经典直方图 order_request_duration_seconds_bucket,含 route 和 le 标签:

plaintext
histogram_quantile(
  0.95,
  sum by (le) (
    rate(order_request_duration_seconds_bucket{route="/orders"}[5m])
  )
)

它表达过去 5 分钟数据的 P95 估计。桶边界、请求样本和采集完整性会影响判断;没有数据不代表延迟是 0。分组查看版本时,应在聚合中保留对应标签。

公式与直方图行为参见 Prometheus Histograms。这段示例依赖应用先提供约定指标,不能直接套用任意语言默认指标名。

8. 告警怎样做到可行动#

一条告警至少包含:

text
发生什么、影响哪个服务和环境、从何时开始
  + 严重程度、责任人与路由
  + 指标与相关发布链接
  + 当前证据、建议检查步骤与升级路径

需要区分“指标超过阈值”和“应该叫醒人”。业务不可用、持续失败、预算快速消耗等问题更接近行动触发;短暂抖动或单机异常可能适合聚合、延迟判断或工单。

Alertmanager提供告警分组、路由、抑制和静默等能力。平台还需要维护负责人、服务关系和运行手册。

发布期可以调整关联与展示,但不能为了让发布页面干净而无条件屏蔽生产故障。

9. 一次故障处理的思路#

以下是本文建议的通用排查顺序:

  1. 确认影响:哪个入口、用户范围、失败或变慢程度,是否仍在扩大。
  2. 建立时间线:何时开始,是否伴随代码、配置、数据库、流量或基础设施变更。
  3. 先做可验证的止损:暂停发布、切流、关闭功能、扩容等,需要结合原因和副作用选择。
  4. 逐层缩小范围:入口 → 服务 → 依赖 → 资源,使用指标、日志和链路互相验证。
  5. 确认恢复:从用户路径检查,比较故障前后指标,观察是否反复。
  6. 记录与改进:保留事实、证据、决策和责任明确的后续任务。

“刚发布过”只能形成相关性假设。要看异常是否集中在新版本、是否有相应调用与资源证据,以及止损后结果是否符合预期。

本案例:Ready,但订单查询很慢#

可能的证据链:

text
新版 /orders P95 升高
  → Trace 的数据库 span 占主要耗时
  → 数据库指标显示查询扫描量/等待异常
  → 核对 SQL、索引和执行计划
  → 暂停放量并验证止损

也可能是连接池过小、依赖超时、资源不足或请求构成变化。应保留备选假设,而不是看到一条慢日志就直接下结论。

10. 还要补哪些系统基础#

对平台后端岗位,优先能使用自己的语言和 Linux 工具解释:

  • 进程/线程、CPU、内存、文件描述符和连接。
  • DNS、TCP、TLS、HTTP、代理与负载均衡。
  • 容器日志、重启原因、资源限制、调度事件。
  • 数据库索引、慢查询、连接池与锁等待。
  • 超时、重试、限流、熔断与降级的作用及副作用。
  • 容量预测、扩缩容、冗余和成本。

先学会针对问题找证据,再逐步补内核、网络和运行时细节。

11. 技术栈与代表性开源项目#

项目适用位置
Prometheus指标采集、存储与查询
Grafana OSS可视化及相关观测产品入口;区分具体组件
OpenTelemetry插桩、采集、传播与导出
Jaeger分布式链路后端与查询
Alertmanager告警通知编排

入门用 Prometheus+Grafana 观察接口,再接入一种链路后端即可。日志后端按已有环境选择,不要求一开始搭建全部组件。

12. 核心技能与平台任务#

深度本章应掌握
理解从用户结果到系统证据,SLI/SLO、数据缺失和相关性边界
使用查指标、日志、Trace 和容器事件,处理一种可复现故障
开发平台标准观测接入、发布关联、告警路由、诊断入口、容量与成本分析

平台还要监控自身:发布 API 是否可用,队列是否堆积,执行器是否失联,对账是否积压。发布平台故障时,应有清楚的受控应急操作和事后对账流程。

自测:没有收到告警,能否证明服务正常?如果发布平台显示失败,而业务已经运行新版本,你需要先查什么?

官方资料#

CHAPTER 10

10|反馈、复盘与研发效能度量

找到值得改进的瓶颈

返回阅读入口 · 下一章:平台后端研发

1. 输入、产出与重点#

输入是需求、代码、测试、构建、部署和运行事件,以及开发者反馈;产出是明确的瓶颈、改进任务和效果验证。

平台的价值需要同时看交付速度、质量、使用体验和运行成本。流水线数量增加、页面访问量提高,只能说明活动或采用情况,不能单独证明交付变好。

2. 谁负责#

业务与平台负责人共同确定改进目标。开发、测试和 SRE 解释实际流程与风险。平台研发和数据相关人员建立事件关联、口径和看板。

指标需要对应团队可采取的行动,避免把跨角色的交付结果简单归因到某一个人。

3. DORA:先认识当前五项口径#

截至 2026-10-16 核对的 DORA 官方指南采用五项交付绩效指标。旧材料常讲四项,阅读时注意定义变化。

指标简要含义
Change lead time,变更前置时间从代码提交到生产部署所需时间
Deployment frequency,部署频率一段时间内的部署次数或部署间隔
Failed deployment recovery time,失败部署恢复时间需要立即干预的失败部署恢复所需时间
Change fail rate,变更失败率需要立即干预的部署所占比例
Deployment rework rate,部署返工率因生产事件引发的非计划部署所占比例

失败部署恢复时间聚焦部署引发的问题,与把所有故障都混在一起计算的 MTTR 不等同。这组指标适合结合服务上下文观察趋势,不宜作为个人排名或不同业务的简单横向排名。

4. 怎样真正落地数据口径#

下面是本文建议的平台事件设计:

问题需要做出的约定
从何时算提交?固定 commit 时间来源,处理合并、cherry-pick 和重复关联
什么算生产部署?按应用、环境、发布记录定义,避免把每个 Pod 更新算一次
灰度算何时完成?区分首次进入生产、全量、终止,保留各时间点
什么算变更失败?明确用户影响和紧急干预标准,关联发布与事件
何时算恢复?用服务恢复证据确认,区分工单关闭和用户恢复
哪些是返工部署?记录是否非计划、由哪个生产事件触发
如何处理未知?缺少关联时标记待确认,避免自动当作成功

不同组织可以有不同操作口径,但必须公开、稳定、可回算。调整规则时保留版本,避免趋势变化只是计算方式改变。

5. 用过程指标找到具体瓶颈#

DORA 指标展示交付结果,过程指标帮助寻找可改进的环节。可以从以下维度入手:

维度示例可能的行动
开发协作评审等待时间、变更批量缩小 MR、改善评审轮值
CI排队、拉依赖、执行、反馈耗时调整资源、缓存或并行
测试不稳定测试率、环境等待修复脆弱测试、环境隔离
CD/发布审批等待、执行耗时、人工步骤优化策略、自动化重复操作
运行质量发布相关故障、错误预算消耗补充验证、改进渐进发布
开发体验首次接入耗时、自助完成率、失败原因改模板、文档、报错和默认值
平台成本单次构建成本、环境闲置、存储占用回收资源、调整保留策略

采用率需要与体验和结果一起看。强制大家接入一个复杂平台,也可能让接入率很高而交付变慢。

6. 一个改进例子#

教学场景:某服务提交到上线耗时很长。

text
先确认时间口径
  → 拆分评审、CI 排队、执行、环境等待、审批和发布
  → 找出主要等待来自 CI 资源排队
  → 调整队列或资源分配
  → 比较调整前后等待分布与成本

如果主要时间花在等审批,缩短编译几秒不会解决核心问题。改进后还要检查质量、成本和其他租户是否恶化。

不要只看平均值。查看中位数与高分位、样本量和异常分布,并排除业务规模或工作负载变化造成的干扰。

7. 复盘要留下什么#

本文建议用以下结构:

  1. 影响:用户、范围、持续时间和可验证的损失。
  2. 时间线:告警、发现、决策、操作和恢复。
  3. 证据:日志、指标、变更与关键判断。
  4. 促成因素:代码、设计、测试、环境、流程和监控的共同作用。
  5. 改进项:负责人、期限、验收方法和优先级。

把“加强意识”改成可以验证的动作。例如“新增数据库慢查询对照,并在预发验证指定数据规模”,比“以后发布仔细一点”更能落地。

8. 技术栈与代表性开源项目#

项目用途
Apache DevLake研发工具数据集成与工程度量
Grafana OSS指标可视化与趋势看板
OpenProject复盘行动项与改进任务管理

DevLake 等工具的内置口径与当前 DORA 定义可能存在版本差异,使用前逐项核对。平台建设可以先覆盖少量可信事件,再逐步扩大,不必先做一个完整数据仓库。

9. 核心技能与平台任务#

深度本章应掌握
理解结果指标与过程指标的关系,指标无法单独解释原因
使用读取趋势、拆解等待、结合访谈与事件找瓶颈
开发平台事件采集、服务身份映射、数据清洗、口径版本和可回算

本案例要能够关联需求、提交、构建、部署和一次故障演练,按同一时间线解释交付过程。

自测:部署频率提高了一倍,但紧急修复变多、开发者更焦虑,能否直接宣称研发效能提升?

官方资料#

CHAPTER 11重点阅读

11|研发效能平台后端到底开发什么

把流程做成可靠的软件

返回阅读入口 · 下一章:转岗路线与面试

1. 从熟悉的服务端开发理解岗位#

如果把订单服务的业务对象换成应用、流水线、制品、环境和发布单,就能看到很多熟悉的工作:建模、API、数据库、权限、队列、状态机、外部集成和运维。

平台研发还要理解外部执行系统的语义:任务接收、部署完成、流量切换和用户恢复并不是同一件事。最大的学习增量,是把这些交付领域知识转化为可靠的软件行为。

2. 可能承担的模块#

模块常见开发任务核心技术点
应用与服务目录服务接入、负责人、仓库、依赖、环境入口元数据、关系建模、权限、同步
代码集成Webhook、MR 检查、分支与评审规则验签、幂等、事件映射、API 限流
流水线平台模板、任务编排、执行资源、日志与报告DAG、队列、调度、隔离、状态
制品平台仓库适配、扫描、证据和晋级摘要、元数据、一致性、访问控制
环境平台创建环境、配置、资源与回收Kubernetes/主机编排、配额、生命周期
发布平台审批、部署、灰度、回退与审计状态机、并发互斥、策略和恢复
运行与效能集成告警、发布关联、诊断、过程与结果指标时间线、数据口径、可观测 API

一个职位往往只负责其中部分模块。JD 同时罗列很多工具时,要问清实际主线、团队分工和已有底座。

3. 一种教学架构#

平台后端的 API、异步执行与对账 开发者 / 平台页面 / CLI 平台 API:身份、权限、校验 关系数据库领域对象与操作记录 Outbox 投递 任务队列 Worker / 工作流推进 适配器 执行进度 Jenkins / GitLab CI 制品仓库 Kubernetes / Argo CD 监控与告警系统 回调接收与周期对账
平台后端的 API、异步执行与对账 · 可横向滑动
查看图示源码
flowchart TB
    U["开发者 / 平台页面 / CLI"] --> API["平台 API:身份、权限、校验"]
    API --> DB[("关系数据库:领域对象与操作记录")]
    DB --> OB["Outbox 投递"]
    OB --> Q["任务队列"]
    Q --> W["Worker / 工作流推进"]
    W --> A["适配器"]
    A --> CI["Jenkins / GitLab CI"]
    A --> REG["制品仓库"]
    A --> DEP["Kubernetes / Argo CD"]
    A --> OBS["监控与告警系统"]
    CI --> EV["回调接收与周期对账"]
    DEP --> EV
    EV --> DB
    W --> DB

这是一种可选的设计模型,具体团队可能用工作流引擎、控制器、事件总线或模块化单体实现。初学时先建立对象与恢复机制,系统规模上来后再决定是否拆微服务。

API 负责快速接受请求;Worker 做耗时操作;回调和周期对账共同修正平台对外部状态的认识。

4. 关键领域对象#

对象关键字段示意
ApplicationID、仓库、负责人、租户、技术栈
Environment类型、资源范围、配置引用、访问策略
PipelineDefinition内容、版本、模板版本
PipelineRuncommit、定义版本、触发源、状态、外部 ID
Artifact完整摘要、来源运行、平台架构、证据
TestRun制品、环境、用例版本、报告、结果
Deployment目标输入、环境、执行状态、实际观测
Release制品与配置快照、策略、审批、发布阶段
ExecutionAttempt步骤、尝试号、外部 ID、开始结束、结果
AuditEvent操作者、动作、输入摘要、原因、结果、时间

表结构并不需要一开始完全照搬;关键是区分定义和执行、期望和实际、用户意图和执行结果。

5. 设计一个发布 API#

教学接口:

http
POST /api/releases
Idempotency-Key: request-20261016-001
json
{
  "applicationId": "order-service",
  "environmentId": "staging",
  "artifactId": "artifact-123",
  "configurationRevision": "config-42",
  "strategyRevision": "rolling-v2"
}

一个可靠的接收流程:

  1. 验证身份、租户、应用和环境权限。
  2. 规范化业务参数并计算请求指纹,在确定的权限范围内查询幂等键。
  3. 同一键、同一请求返回已有记录;同一键、不同内容返回冲突。
  4. 仅对新请求固定制品、配置与策略输入,检查证据与当前门禁。
  5. 原子创建发布记录与待发事件,并处理幂等键竞争和同环境并发。
  6. 返回发布 ID 和查询入口;异步推进并记录步骤。

可以返回 202 Accepted 表达任务已接受,但它不能表示发布成功。客户端通过查询接口或事件订阅获取后续结果。

注意:幂等键的作用域、有效期和请求指纹要明确。调用者没有权限时,即使猜中已有幂等键,也不能读取别人的发布结果。

查重应先于可变门禁检查。某个发布已被接受,客户端因超时重复请求,此时审批或扫描证据可能已经过期;重复请求应返回既有记录,而非重新创建或丢失原结果。任务开始执行或正式放量前是否再次检查门禁,由执行规则另行决定并记录。

6. 六个高频工程难点#

6.1 外部成功,平台未知#

网络超时后,Kubernetes 或 Jenkins 可能已执行操作。已获得外部 ID 时保存它并查询真实状态,必要时进入待对账状态。

最难的情况是外部已经创建成功,但包含 ID 的响应丢失。调用前应持久化内部操作 ID,并尽可能通过确定性资源名、标签、外部幂等令牌或可查询关联字段定位结果。选择方法时要验证外部系统实际支持的查询与一致性语义。

如果外部系统既不支持幂等创建,也无法可靠查询对应结果,应保留“结果未知”,提供人工核对与受控恢复路径。对账机制不能凭空恢复外部系统没有暴露的证据。

6.2 数据库写入成功,队列投递失败#

可采用事务性 Outbox:数据库事务同时保存领域对象与待发事件;投递器重试发送;消费者幂等处理。消息重复不应导致重复发布。

6.3 同时发布同一环境#

锁应覆盖相应业务边界,且执行期间可能超时或失联。只加一个 Redis 锁不足以解释所有正确性问题,还应考虑唯一约束、租约、操作版本和旧执行者写入。

可以用乐观锁限制状态迁移:

sql
UPDATE release_run
SET state = :new_state, version = version + 1
WHERE id = :id
  AND state = :expected_state
  AND version = :expected_version;

这是 SQL 设计示意。检查影响行数;更新未生效时重新读取和判断,不能继续假设自己拥有推进权。

6.4 回调乱序#

旧尝试的失败回调,不能把新尝试已经成功的状态改回失败。校验运行 ID、尝试号、资源版本及允许迁移;终态更正需要显式规则和审计。

6.5 取消与回退#

取消 API 是一个意图。Worker 可能正在执行,外部控制器也可能持续推进。需要停止后续调度、确认外部状态、收敛期望配置,再判断是否完成或需要人工处理。

6.6 多租户与凭据#

所有对象访问都需要按租户和资源授权;查询、下载日志、重试、回退都要校验。执行身份按环境授权,秘密值避免进入数据库普通字段、日志和制品。

7. 日常工作是什么样#

以下是一组教学工作事项,用于帮助理解岗位:

  • 接入一个新的代码平台,把仓库与应用自动关联。
  • 优化任务列表,让开发者看清排队与执行时间。
  • 修复重复 Webhook 导致的重复任务。
  • 为发布增加数据库变更提示与审批证据。
  • 排查“平台超时但集群已经更新”的状态不一致。
  • 实现临时环境过期回收,并处理回收失败。
  • 把发布标记写入观测系统,缩短排查路径。
  • 采访接入团队,减少首次接入需要填写的配置。

平台自身也需要测试、CI/CD、可观测、值班和容量管理。平台研发会成为自己产品的使用者。

8. 与相邻岗位的常见区别#

岗位侧重主要工作对象面试需要确认的边界
业务后端用户与业务流程是否同时承担发布、值班和运行质量
研发效能平台后端交付流程与开发者服务自研模块、集成深度、服务规模
SRE生产服务的可靠性与工程治理值班、容量、故障、自动化和代码比例
基础设施/容器平台计算、网络、存储与集群是否深入调度、运行时和控制器
DevOps 工程岗位名称覆盖范围很广是平台研发、交付集成、基础设施还是运维自动化

这是一种沟通分类,真实岗位会交叉。不能只根据“DevOps”标题推断日常工作。

9. 代表性开源项目怎么读#

项目适合观察的对象主要学习价值
Backstage服务目录与元数据认识开发者门户和服务入口;它不自动实现全部交付控制
Jenkins执行器与流水线集成任务执行和平台适配
Argo CD期望与实际状态声明式交付和持续对账
Argo Rollouts发布过程与分析渐进控制和结果判定

先选与自己模块相关的 API、领域对象和失败路径阅读。无需一开始通读所有源码。

10. 核心能力#

已有后端经验继续保持:API 与数据建模、事务、队列、并发、测试、权限、可观测与可靠外部集成。

新增领域能力重点补齐:CI 执行模型、制品身份、部署状态、发布策略、环境配置、运行反馈。

自测:设计“重试发布”时,是重跑失败步骤、重新执行整次发布,还是创建新发布?分别需要满足什么条件?能回答清楚,比增加一个重试按钮更接近平台研发。

CHAPTER 12

12|转岗学习路线与面试准备

把经验迁移到新领域

返回阅读入口 · 下一章:案例与实操

1. 先保持已有优势#

对有 3 年服务端经验的读者,先用熟悉的语言完成交付闭环。目标岗位如果主要使用 Go,可以再补 Go;无需为了“做 DevOps”同时重学全部技术。

下面的安排是学习建议。实际用时取决于已有基础与投入,不表示完成后就能覆盖所有公司面试。

2. 能力分层#

优先级能力需要到什么程度
P0:先补齐Git、Linux、HTTP/网络、自己语言的构建测试能独立定位本地、CI 和运行环境差异
P0:先补齐容器、镜像、仓库、摘要能构建、上传、固定版本并运行
P0:先补齐一种 CI 引擎能写流水线、读报告、定位失败
P0:先补齐部署、配置、探针、发布和回退能完成一次部署与故障演练
P0:先补齐指标、日志、基本运行排查能解释一次业务异常及恢复证据
P1:岗位重点幂等、异步、状态机、对账和权限能把已有服务端经验用于交付平台
P1:岗位重点Kubernetes、GitOps、渐进发布按 JD 重点,至少独立实践一条路径
P1:岗位重点测试分层、安全证据、平台体验能理解门禁、接入成本和使用反馈
P2:后续深入多集群、复杂调度、供应链证明、成本治理与负责模块和业务规模结合

已有能力不是默认全部达标。例如过去只写业务接口,也需要检查事务、消息重复、并发控制和故障恢复的实践深度。

3. 六个学习单元#

可以按每周一个单元安排;每个单元有可复查的成果,遇到不熟悉的基础可以延长。

单元学习与动手应交出的证据
1:看懂主链阅读 01、11,整理旧项目真实交付流程;实现案例接口和测试一张自己的流程图、测试结果、知识缺口
2:CI 与制品接入一个 CI 引擎;构建、测试、生成并登记镜像成功与失败运行、完整摘要、来源关联
3:环境与部署用容器和 Kubernetes/既有部署底座运行服务部署定义、配置、探针和排障记录
4:发布与恢复做分批更新,验证冒烟、暂停和旧版本恢复发布记录、失败演练、恢复证据
5:运行态接入指标和日志;制造延迟或依赖异常并定位看板、时间线、告警与简短复盘
6:平台后端设计或实现一个小模块,如发布任务 API模型、状态机、权限、幂等与故障处理说明

详细任务见第 13 章。先把主链跑通,再决定是否增加 GitOps、自动分析或更复杂的环境管理。

4. 八道场景题及回答要点#

题一:从一次代码提交讲到生产运行#

应覆盖触发、验证、可信制品、测试、环境配置、部署、流量、业务验证和运行反馈。每一步说清输入、成功条件和失败处理。

追问:同一个提交为什么可能产生不同制品?回答需要涉及依赖、基础镜像、构建工具和环境。

题二:CI 为什么有时很慢#

先分解排队、环境准备、依赖下载、编译、测试和报告时间,再看资源、缓存、并行和测试范围。不能直接回答“增加机器”。

追问:缓存加速后怎样防止污染与版本差异?

题三:Webhook 重复,为什么没有重复构建#

解释验签、事件 ID、业务去重键、数据库唯一约束、队列重复及执行幂等。还要允许用户显式重新运行,而不被去重逻辑永久阻止。

追问:同一 MR 的 push 与 MR 事件要合并处理吗?依据是什么?

题四:测试通过了,生产却失败了#

考虑制品与配置不同、真实数据量、路由与权限、依赖差异、资源、并发、数据库兼容,以及测试覆盖不足。先看事实再形成假设。

追问:怎样证明测试与生产使用同一内容?要说出完整摘要和配置证据。

题五:发布接口超时了,该怎么办#

先区分用户请求超时、平台任务超时和外部执行超时。查询已有任务与外部状态,利用幂等键和预先保存的关联标识对账。创建响应丢失时不能只依赖尚未取得的外部 ID;无法可靠定位时保留未知并人工核对,不能简单创建另一次发布。

追问:原 Worker 还在运行,新 Worker 接手后怎样防止双方同时推进?

题六:Pod Ready,能否判定发布成功#

还要检查目标版本、实例分布、入口路由、业务冒烟、依赖和生产指标。说明探针验证的范围,以及没有流量或指标缺失时怎样处理。

追问:把数据库是否可用放进 Liveness,可能有什么副作用?

题七:为什么不能一键回滚所有变更#

镜像、配置、数据库、消息和用户数据的恢复方式不同;新旧代码还需要兼容。解释暂停、流量切回、关闭功能、应用回退和前向修复。

追问:启用 GitOps 自动同步时,手工改集群会怎样?

题八:平台效能怎样评估#

用交付结果、稳定性、过程等待、开发体验和成本共同判断。讲清当前 DORA 定义,再根据瓶颈选择行动,不把提交数当个人产出排名。

追问:改进前后样本、服务范围和口径怎样保持可比?

5. 怎样讲已有项目#

选择自己真实做过的项目,用以下顺序:

text
背景与约束
  → 自己负责什么
  → 为什么采用该设计
  → 怎样验证与发布
  → 出过什么问题,怎样判断和处理
  → 结果与局限

如果以前没有开发过发布平台,可以诚实说明:“业务开发里使用过相关流程,最近完成了交付闭环练习,并针对幂等、状态对账和回退做了设计。”再用实际练习证据展开。

不要把练习描述成公司生产经验,也不要编造降本、提效或大规模并发数据。

6. 一段练习项目介绍模板#

完成相应内容后,可以据实填写:

我用熟悉的语言实现了一个订单查询练习服务,接入了一条包含构建、测试和镜像生成的流水线,使用固定摘要部署到练习环境。随后加入了业务冒烟、基础指标与一次失败演练。平台设计部分,我重点处理发布请求幂等、同环境互斥和外部执行超时后的状态对账。还没有实践的部分是……。

面试中比这段文字更重要的是展示流水线、报告、部署配置和故障时间线,并解释每个选择。

7. 拿到 JD 后重点确认#

  • 平台主要服务哪些团队,当前最需要解决什么问题?
  • 这个岗位负责哪几个模块,日常代码开发、集成和运维分别占什么范围?
  • 是基于现有工具扩展,还是自研控制面与执行引擎?
  • 技术栈是 Java/Go/Python 中的哪一种,Kubernetes 要求多深?
  • 谁负责基础设施和生产值班,平台自身的可用性目标是什么?
  • 平台接入和使用效果怎样衡量,有没有真实开发者反馈?
  • 入职前三个月预期交付什么?

这些回答能帮助判断机会是否匹配“平台后端研发”,也能决定接下来把时间投在哪个模块。

8. 完成学习后的自测#

给自己做一次 20 分钟演示:

  1. 用 3 分钟讲完整流程。
  2. 用 5 分钟展示一次成功 CI 与一次失败阻断。
  3. 用 5 分钟说明指定制品怎样部署、验证和恢复。
  4. 用 5 分钟解释一个平台后端模块及异常路径。
  5. 用 2 分钟说明没有覆盖的风险和下一步。

如果只能讲工具名字,回到相关章节补概念;如果正常路径能跑通但失败后无从下手,优先补失败、幂等和对账。

工具的官方学习入口见第 14 章。

CHAPTER 13

13|贯穿案例与分层实操任务书

亲手走完一次交付

返回阅读入口 · 下一章:术语与资料

1. 练习目标与范围#

另建一个 delivery-lab 练习仓库,用自己熟悉的语言,实现“当前用户查询已支付订单”,再完成 CI、制品、部署、发布验证和基础监控。

本文是一份任务书,包含设计、配置示例、检查方法和验收要求。需要在练习仓库中实现应用、测试和环境接入;本目录本身是学习文档,不是一套已经部署的实验环境。

依次完成三个层次:

层次前提练习成果
A:代码与容器Git、语言工具链、容器运行环境接口、测试、镜像和本地运行
B:CI 与仓库一个可用的 CI 执行环境、制品仓库与必要凭据提交触发、失败阻断、摘要与报告
C:部署与运行测试集群或既有部署环境、可观测组件部署、业务验证、失败演练与运行证据

资源有限时分层完成,不必把代码托管、CI、仓库、集群和监控全部装在同一台电脑。所有演练都在个人或授权的测试环境中进行。

2. 推荐的一套练习组合#

选择熟悉的工具即可,下面只提供一套参考:

  • 代码:已有的 Git 托管服务。
  • CI:Jenkins;已有 GitLab CI 时可以直接使用。
  • 应用:熟悉的 Java、Go 或 Python 框架。
  • 制品:一个支持 OCI 镜像的仓库;有条件时用 Harbor。
  • 部署:本地 Kubernetes,例如 kind;先完成普通滚动更新。
  • 观测:Prometheus+Grafana,日志先用容器标准输出。
  • 进阶:Argo CD、Argo Rollouts、链路后端和发布任务 API。

CI 执行器需要明确的构建方式。容器镜像构建权限、仓库访问和集群访问分别配置,避免把个人管理员凭据直接塞进流水线。

官方参考:Jenkins、kind、Harbor、Prometheus。

3. 练习仓库应包含什么#

text
delivery-lab/
  README.md               # 环境、构建、测试、运行和恢复说明
  app/                    # 业务实现
  tests/                  # 自动化测试与合成数据
  Dockerfile              # 镜像构建定义
  .dockerignore           # 排除密钥、临时文件等
  Jenkinsfile             # 或选用工具的 CI 定义
  deploy/                 # 部署定义和环境配置
  observability/          # 指标说明、告警或看板配置
  evidence/
    traceability.md       # 提交→构建→摘要→部署
    failure-drill.md      # 故障时间线与恢复证据
    decisions.md          # 关键设计选择与剩余问题

这是建议结构,按语言习惯调整即可。不要把真实令牌、个人订单或未脱敏日志提交进仓库。

4. 第一阶段:定义需求并实现接口#

任务#

实现:

http
GET /orders?status=paid&limit=20
GET /healthz
GET /readyz
GET /version
GET /metrics

认证由所选框架的认证层处理,业务从身份上下文取当前用户。测试中构造合成身份,不接受用户随意指定一个 userId 就读取对应订单。

准备两个用户、多种状态和足够的分页边界数据。初步可以用内存或轻量数据库,随后用真实数据库完成集成测试。

/version 返回构建时注入的非敏感版本标识,帮助检查实例。镜像完整摘要由部署平台或容器运行元数据核对,不要求应用在镜像构建前知道自身最终摘要。

验收#

5. 第二阶段:接入 CI,并演练失败阻断#

任务#

按第 04 章配置流水线:

text
提交触发 → 固定 commit → 构建与测试 → 报告 → 结果回写

先完成验证,合并到主干后再对确定提交生成可信候选制品。使用独立的练习分支故意破坏一项权限测试,确认失败不会生成可晋级版本。

记录排队、执行、依赖下载和测试耗时。触发一次重复事件或手动重跑,说明两者分别应该产生什么记录。

验收#

6. 第三阶段:生成、保存并固定制品#

任务#

在练习项目已提供 Dockerfile 的前提下,可以用以下命令表达打包与上传。仓库地址、标签及登录凭据需要按自己的环境配置:

sh
docker build -t registry.example.com/lab/order-service:lab-v1 .
docker push registry.example.com/lab/order-service:lab-v1

从仓库或推送结果取得完整摘要,登记它与 commit、CI 运行的关系。配置不可变标签或采用不会覆盖的标签策略;生产式部署记录使用完整摘要。

多架构场景明确选定目标平台。如果使用 kind 的本地镜像导入路径,则它只是本地替代;另外练习一次真实仓库推拉,才能验证凭据和仓库链路。

验收#

7. 第四阶段:部署并区分“请求成功”与“业务成功”#

部署定义示例#

下面是 Kubernetes 核心结构示例。应用需要监听 8080 并实现对应探针。<完整摘要> 是替换标记,需要替换为真实摘要;示例没有包含数据库配置、镜像凭据和外部路由。

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  namespace: delivery-lab
spec:
  replicas: 2
  selector:
    matchLabels:
      app: order-service
  template:
    metadata:
      labels:
        app: order-service
    spec:
      containers:
        - name: app
          image: registry.example.com/lab/order-service@sha256:<完整摘要>
          ports:
            - name: http
              containerPort: 8080
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 512Mi
          startupProbe:
            httpGet:
              path: /healthz
              port: http
            periodSeconds: 2
            failureThreshold: 30
          readinessProbe:
            httpGet:
              path: /readyz
              port: http
          livenessProbe:
            httpGet:
              path: /healthz
              port: http
---
apiVersion: v1
kind: Service
metadata:
  name: order-service
  namespace: delivery-lab
spec:
  selector:
    app: order-service
  ports:
    - port: 80
      targetPort: http

资源值和探针时长仅用于说明字段,按语言启动特性与实测内存调整。命名空间需提前创建或写入独立配置。

检查方法#

在自己已经创建的练习集群中:

sh
kubectl config current-context
kubectl get deployment,pods,service -n delivery-lab
kubectl rollout status deployment/order-service -n delivery-lab --timeout=120s
kubectl describe deployment/order-service -n delivery-lab
kubectl logs -l app=order-service -n delivery-lab --all-containers=true --tail=100

检查目标环境后再执行变更。使用 port-forward 可以从本机验证 Service:

sh
kubectl port-forward service/order-service 8080:80 -n delivery-lab

另开终端访问版本、探针和业务接口。业务接口需要测试身份;本地端口转发通过后,还应在配置了正式入口时单独验证路由和认证。

验收#

8. 第五阶段:运行观测与失败演练#

任务#

让应用输出结构化日志,并通过 Prometheus 采集请求数和耗时等指标。指标名、标签和单位在仓库中写明;如采用第 09 章查询,先匹配它要求的直方图定义。

通过已认证的合成请求产生负载,记录负载参数和时间窗口。k6 的脚本需要同时检查 HTTP 和响应内容,并定义明确阈值;具体写法见 k6 Thresholds。

选择一项受控故障:

演练观察目标预期判断
在练习代码引入可控延迟业务延迟与探针是否出现差异Ready 不代表业务延迟达标
配置错误依赖地址应用日志、调用错误和就绪行为能区分依赖不可用与进程退出
配置错误镜像Pod 事件和更新状态不应显示成业务发布成功
暂停指标采集无数据与告警/发布判定不能把缺失数据当作健康

故障注入仅存在于练习版本或受控测试配置中,普通调用者不应有切换故障的权限。

验收#

9. 第六阶段:做一次发布与恢复#

基础练习#

先用普通滚动更新发布第二个版本,观察新旧实例共存和状态变化。保留旧制品、配置与回退记录。

用前一阶段的故障版本演练暂停与恢复。直接部署的练习模式下可以把部署定义恢复到先前的明确摘要;GitOps 模式则通过恢复期望配置并同步实现。

只执行 rollout undo 不能证明数据、配置、业务和 GitOps 期望状态已经恢复。记录实际动作与验证结果。

进阶练习#

选择 Argo Rollouts,配置分阶段推进与指标分析。如果没有可控制权重的路由底座,明确说明实际采用的分流方式,不声称已经精确控制请求比例。

验收#

10. 第七阶段:选择一个平台后端模块#

在交付主链完成后,任选一项深入:

选题最小能力关键失败测试
发布任务 API创建、查询、幂等键、状态、异步执行重复请求、内容冲突、外部超时、乱序回调
CI 事件接入验签、去重、触发、结果回写重复事件、回写失败、旧提交结果
临时环境管理创建、归属、状态、到期回收半创建、重复回收、资源失联
制品证据登记摘要、来源、报告和晋级规则旧结果覆盖、未授权访问、制品缺失

先设计领域对象、状态与允许操作,再实现接口。可用假的外部适配器演练超时和乱序,但要说明哪些场景已接入真实系统。

11. 最终成果与复盘#

完成练习后,把证据整理成:

text
需求与设计
  → MR 与提交
  → 成功 / 失败 CI 运行
  → 测试报告与制品摘要
  → 环境配置和部署记录
  → 发布与恢复
  → 指标、日志和故障时间线

每个箭头至少有可点击记录、文件或可复现命令。最后写清:

  • 做成了什么,哪些仍是设计或模拟。
  • 哪一步最难,怎样得到证据。
  • 哪项平台能力可以减少业务开发的重复劳动。
  • 如果成为团队共享平台,下一步要补哪些权限、隔离、可靠性和体验。

这些成果可以支撑第 12 章的面试演示。

CHAPTER 14

14|术语与官方学习资料

随时查阅,继续深入

返回阅读入口

资料核对日期:2026-10-16。下面以官方规范、产品文档和项目仓库为入口。使用 stable、latest 或 main 的页面会随时间变化,实际操作时切换到已安装版本。

1. 术语速查#

术语本指南中的含义相关章节
DevOps强调开发与运维协作、自动化与反馈的一组实践;岗位范围需看实际职责01、11
研发效能平台支撑开发、测试、交付与反馈的内部平台,可覆盖多个系统01、11
平台工程把公共能力作为面向内部用户的产品持续提供和改进11
IDPInternal Developer Platform;具体包含什么需看团队定义11
开发者门户集中发现服务、文档、工具和流程的入口11
PR/MR提议合并代码的协作对象03
Webhook外部系统在事件发生时向约定入口推送通知03、04
CIContinuous Integration,持续集成04
CD:持续交付Continuous Delivery,变更保持可交付,生产决策可人工执行07
CD:持续部署Continuous Deployment,满足规则的变更自动进入生产07
Pipeline流水线;要区分定义和一次执行04
Runner/Agent执行具体任务的资源或进程,术语依产品04
DAG有向无环图,表达任务依赖04
Artifact构建或任务产生、需要保存和传递的制品05
OCI容器相关规范体系,本指南主要涉及镜像与仓库交互05
Tag便于阅读的制品标签,是否可变取决于策略05
Digest内容摘要,用于固定具体内容05
SBOMSoftware Bill of Materials,软件组件清单05
Provenance关于构建来源、过程和输入的证明信息05
Gate进入下一步必须满足的门禁条件04、06、08
IaCInfrastructure as Code,基础设施即代码07
GitOps以版本管理中的声明式期望状态等机制驱动运行状态对齐的实践07
Reconciliation对账/调谐:比较已知、期望和实际状态并推进收敛07、11
Rolling逐批替换实例的滚动更新08
Blue-green蓝绿:准备两组版本并切换入口08
Canary金丝雀/灰度:先对部分流量或用户验证08
Feature Flag功能开关,控制已部署功能的开放08
Smoke Test冒烟测试,验证少量关键路径06、08
Probe探针,对启动、就绪或存活状态做特定检查07、09
Metrics/Logs/Traces指标、日志、链路,三类常用可观测数据09
SLI/SLO/SLA服务指标、内部目标、对外服务约定09
P9595 分位值;尾延迟的估计依赖样本与统计方式09
Cardinality基数;指标标签组合会影响时间序列数量09
On-call值班响应机制09
Runbook可执行的排障、恢复与升级操作说明09
DORA软件交付研究及相应绩效度量体系10
Idempotency幂等:重复处理同一操作意图时,按定义避免重复副作用03、11
Outbox把领域变化和待发事件在同一数据库事务中保存,再可靠投递的设计07、11
Fencing Token区分新旧执行权限的递增标识等机制,用于拒绝过期执行者07、11

2. 按阶段查官方资料#

需求、设计与代码协作#

CI 与制品#

测试#

部署与生产发布#

运行态、平台与效能#

3. 选择项目时怎样核对#

先看项目承担的能力,再检查:

  1. 使用的版本、开源许可证和商业功能边界。
  2. 身份、权限、执行隔离和凭据管理。
  3. 外部 API、事件、状态和恢复机制。
  4. 自己团队的环境、规模、维护成本与升级路径。
  5. 是否需要整个平台,还是只需接入其中一个模块。

本文优先介绍能力与概念,没有指定“所有团队都应该使用”的统一工具栈。正式选型还应根据实际约束单独评估。

输入关键词,搜索全部章节全文检索