Skip to content

DevOps 持续交付-笔记

本文档整理自极客时间《持续交付》专栏(40讲全),系统性地涵盖了从代码管理、环境治理、自动化构建到发布监控的完整链路。


第01讲 持续交付到底有什么价值?

  • 核心定义
    • 持续集成 (CI):从编码到构建再到测试的反复持续过程。
    • 持续部署 (CD):将可交付产品,快速且安全地交付用户使用的一套方法和系统。
    • 持续交付:包含持续集成、测试自动化以及持续部署,囊括开发、测试、部署、运维、运营等等。
  • 持续交付的隐性价值
    • 对 CTO、Team Leader、产品经理、程序员而言:涉及技术选型、标准落地、部门协作、知识传承、关注业务、节奏平稳、提高工作效率和质量。
  • 评估与架构
    • 如何评估持续交付的价值。
    • 常见的持续交付平台架构持续交付平台架构

第02讲 影响持续交付的因素有哪些?

  • 影响因素
    • 组织和文化因素
    • 流程因素
    • 架构因素
  • 核心原则

    康威定律:组织结构决定软件架构。

第03讲 持续交付和 DevOps 是一对好基友

  • 认识 DevOps
    • 一组技术:包括自动化运维、持续交付、高频部署、Docker 等。Docker 的出现正是为了解决 DevOps 所提倡的“基础设施即代码 (IaC)”。
    • 一个职能一种文化一种组织架构
  • 核心总结
    • DevOps 本质其实是一种鼓励协作的研发文化
    • 持续交付与 DevOps 所追求的最终目标是一致的:快速向用户交付高质量的软件产品。

第04讲 一切的源头,代码分支策略的选择

  • 分支策略
    • 主干开发 (Trunk Based Development, TBD)
      • Google 和 Facebook 都在用。
      • 特性:没有 feature branch,全员在主干开发,减少合并麻烦。
      • Feature Toggle (特性切换):保证未成熟功能不被发布。
        • 注意风险:特性切换过多会导致逻辑混乱、代码脆弱、难测试/维护、难提供技术支持且不安全。
        • 风险点:特性切换会将未经测试的代码引入生产环境,问题可能无意间暴露。
      • 缺点:可能出现“一粒老鼠屎坏了一锅粥”的现象。对个人开发能力要求极高。
    • 分支开发 (Branch Model)
      • 演进:Git Flow (hotfix, release) GitHub Flow (Pull Request) GitLab Flow (生产、环境及发布分支)。
      • 有利于并行开发,需要流程保证,能保证主干代码质量。

第05讲 手把手教你依赖管理

  • 管理工具举例
    • 操作系统级:CentOS (yum), Debian (apt), Arch (Packman), macOS (Homebrew)。
    • 编程语言级:Java (Maven), .Net (nuget), Node.js (npm), Golang (go get), Python (pip), Ruby (Gem)。

第06讲 代码回滚,你真的理解吗?

  • 主要方式
    • Roll back:回滚到过去的某个版本。
    • 新增 Commit:移除对应功能(Revert)。
  • 工具注意:谨慎使用 git reset --hard

第07讲 “两个披萨”团队的代码管理实际案例

  • “两个披萨”团队 (Two-Pizza Teams)
    • 亚马逊内部实践:团队人数不能多到两个披萨饼还不够吃的地步(约 7 人左右)。
    • 核心:团队要小到让每个成员都能做出显著贡献,相互依赖,有共同目标和统一成功标准。
  • 协作模式:使用 GitLab + Issue + Feature Branch 开发模式。

第08讲 测试环境要多少?从现实需求说起

  • 核心问题:测试环境结构与好的测试环境标准。
  • 环境模型 (五套环境标准)
    1. 开发环境:供开发人员使用。
    2. 功能测试环境:供 QA 验证。
    3. 验收测试环境:供产品经理、测试人员最终确认。
    4. 预发布环境:进入生产网络,共享生产基础设施(数据库等)。
      • 实现方式:a. 金丝雀发布(真实流量机器);b. 一组不接入真实流量的机器。
    5. 生产环境:真实用户访问环境。

第09讲 测试环境要多少?从成本与效率说起

  • 成本三要素:机器资源成本、管理成本(配置/数据)、流程成本(沟通/测试)。
  • 效率提升
    • 在抽象公共环境基础上,通过泳道 (Swimming Lane) 隔离相关测试应用。
    • 降低配置复杂度。

第10讲 让环境自己说话,论环境自描述的重要性

  • 核心痛点:环境配置非常复杂,直接影响环境治理能力,进而影响持续交付能力。
  • 环境自描述
    • 通过环境标准化,利用自描述文件让环境能讲清楚自己的作用、依赖及状态,而非依赖外部零散配置。

第11讲 “配置”是把双刃剑,带你了解各种配置方法

  • 配置分类:构建时配置、打包时配置、运行时配置。
  • 配置中心:推荐方案,如携程开源的 Apollo
  • 痛点:如何有效回滚配置。

第12讲 极限挑战,如何做到分钟级搭建环境?

  • 主流工具:Puppet、Chef、Ansible、SaltStack 等。
  • 提速手段:并行处理、缓存池。

第13讲 容器技术真的是环境管理的救星吗?

  • 容器价值:重新定义了交付标准,统一了软件环境与代码,交付产物即镜像。
  • 不可变基础设施 (Immutable Infrastructure)
    • 理念:任何变化(代码、环境、配置)均需重新制作镜像,产生新版本。
    • 代价:原本简单的修改(如装个 curl)也需要重跑镜像构建流程。

第14讲 如何做到构建的提速,再提速!

  • 提速方法
    1. 硬件升级:SSD、大内存。
    2. 搭建私有仓库
      • CentOS (yum): createrepo
      • Java (Maven): Nexus
      • Node.js (npm): cnpm
      • Python (pip): pypiserver
      • 代码仓库: GitLab
      • Docker 镜像: Harbor
    3. 本地缓存:充分利用工具缓存机制。
    4. 流程规范:通过异步方式解决旁支流程执行。
    5. 工具优化:根据实际情况发挥构建工具特性。

第15讲 构建检测,无规矩不成方圆

  • 检测项
    • 环境:软件版本、编译工具版本、操作系统一致性。
    • 依赖:依赖关系及版本冲突检查。

第16讲 构建资源的弹性伸缩

  • CI 工具:Travis CI、Circle CI、Jenkins CI。
  • Jenkins Master 高可用
    • 单 Master 易成为瓶颈。
    • 解决方案:对 Jenkins 封装,实现自定义高可用多 Master 架构。
  • Slave 弹性伸缩:利用容器化技术与 Kubernetes (K8s) 结合,动态调度资源。

第17讲 容器镜像构建的那些事儿

  • 仓库Docker Hub
  • 构建方式(核心区别在于使用宿主还是容器独立的 docker daemon):
    • DooD (Docker Out Of Docker)
    • DinD (Docker In Docker)

第18讲 如何做好容器镜像的个性化及合规检查?

  • 个性化方法:1. 自定义环境脚本;2. 平台化环境选项与服务集市;3. 自定义镜像发布。
  • 合规检查:比对各个 Layer,检查是否包含官方 Base 镜像 Layer。
  • 合规工具:CoreOS Clair, Docker Security Scanning, Drydock 等。

第19讲 发布是持续交付的最后一公里

  • 部署 (Deploy) vs 发布 (Rollout)
    • 部署不代表发布(如旁路运行 dark launch)。
  • 发布系统期望:易用、快速、稳定、容错,且具备迅速回滚能力。
  • 单节点部署流程 (5步)
    1. Download:下载新版本,不执行覆盖。
    2. Markdown:通知上游,自己进入暂停服务状态。
    3. Install:执行 load 变更,重启服务。
    4. Verify:验证健康状况及预热。
    5. Markup:通知上游,服务恢复正常。
  • 集群部署方式
    • 蓝绿发布:发布新版到新集群,验证后将全量流量切入,无异常则下线老版本。
    • 滚动发布:分批次更新集群机器,验证通过后接回流量,直到全部遍历。
    • 金丝雀发布:挑选特定服务器或特征用户进行小规模更新验证。
  • 灰度发布系统:如携程开源的 Tars

第20讲 Immutable!任何变更都需要发布

  • 前提:应用必须是无状态 (Stateless) 的。
  • 价值:保证环境、顺序、配置在测试与生产环节的高度一致性。

第21讲 发布系统一定要注意用户体验

  • 1-2-3-4-5-6 原则
    • 1 张页面展示发布信息(全面且精准)。
    • 2 个操作按钮简化使用(如:发布、中断、重试)。
    • 3 种发布结果(成功、失败、中断)。
    • 4 类操作选择(开始、停止、回退、重试)。
    • 5 个发布步骤(见第 19 讲单节点流程)。
    • 6 大页面内容区:集群、实例、日志、历史、批次、操作区。

第22讲 发布系统的核心架构和功能设计

  • 核心组件:DeploymentConfig, Deployment, DeployBatch, DeployTarget。
  • 进阶能力:发布状态流转、服务降级、熔断机制。

第23讲 业务及系统架构对发布的影响

  • 考虑因素:增量 vs 全量、单机单应用 vs 单机多应用。
  • 机制设计:如何控制 Markup/Markdown、检查/预热/点火机制(点火即 Verify 自动化)。
  • 堡垒流量:软负载 + Header 附加堡垒标记,确保堡垒机流量在专用链路流转。

第24讲 如何利用监控保障发布质量?

  • 监控五维度
    1. 用户侧:访问速度和真实结果。
    2. 网络:CDN 与核心网络。
    3. 业务:核心业务指标波动。
    4. 应用:服务调用链 (Tracing)。
    5. 系统:基础设施、VM 及 OS。

第25讲 代码静态检查实践

  • 测试管理范畴:静态检查、破坏性测试、Mock 与回放。
  • 平台与工具
    • 平台:SonarQube。
    • 工具:FindBugs、PMD、Checkstyle。

第26讲 越来越重要的破坏性测试

  • 维度:单点维度、系统维度(压测、暴力测试、阻断链路)。
  • 混沌工程:Netflix 开源的 Chaos Monkey

第27讲 利用 Mock 与回放技术助力自动化回归

  • 测试难点:数据准备/清理、分布式依赖、用例仿真度。
  • 核心方案
    • Mock
      • 原理:用模拟对象代替难以剥离的复杂依赖对象。
      • 类级 Mock:Mockito, EasyMock (常用于单测)。
      • 服务级 Mock:Weir Mock, Mock Server。
    • 回放 (Replay)
      • 原理:记录生产环境真实操作并在测试环境回放。
      • 拦截方案
        1. SLB 统一拦截:易影响路由服务。
        2. 集群扩容独立服务器:利用软交换转发请求,结合云平台弹性,风险低。
      • 回放模式:按原始时间间隔顺序回放;压缩时间间隔进行压力回放。

第28讲 持续交付为什么要平台化设计?

  • 五大核心部分:配置管理、环境管理、构建集成、发布及监控、测试管理。
  • 平台化理念:自己搭台,让其他人唱戏。
  • 核心模块联动
    • 代码管理 审核、扫描、分支管理。
    • 集成编译 依赖管理、单测、打包。
    • 环境管理 资源申请、配置、路由。
  • 原则标准先行,定义各个模块交付产物的标准。

第29讲 计算资源也是交付的内容

  • 云计算:基础设施的交付同样需要纳入流水线。

第30讲 持续交付中有哪些宝贵数据?

  • 系统优化:通过数据说话,从数据角度寻找优化方向。
  • 三大指标:稳定性指标、性能指标、持续交付能力成熟度指标。

第31-33讲 移动 App 的持续交付进阶

  • 模式发布快车模式 (Release Train),定期发车。
  • 交付效率优化
    • 流程优化:开发、构建、测试、发布全链路。
    • 构建优化:扁平化依赖管理、二进制交付。
    • 发布优化:测试用户集定期更换,避免测试疲劳。

第34讲 快速构建持续交付系统(一):需求分析

  • 模块具体需求
    • 代码/配置:Code Review、静态扫描。
    • 构建/集成:支持 Jar/War/Docker/App,版本可追溯,支持高并发。
    • 打包/发布:统一部署标准,多产物支持。
    • 自动化测试:TestNG 驱动,实现全自动。

第35-37讲 快速构建实战:选型与搭建

  • 代码管理:GitLab (Omnibus 安装) + SonarQube。
  • 集成打包:Jenkins (Maven + Pipeline)。
  • 自动部署:Ansible (Tower) 或 Spinnaker (Netflix 开源,解耦云平台)。

第38讲 持续交付特别放送:答疑解惑

  • 数据库发布与回滚
    • 准则:1. 只能新增字段,不能删除或修改已有字段,且新增字段必须有默认值。2. 必须修改结构的场景由 DBA 操作,不纳入自动化流程。
  • 不可变性:K8s + Docker 的最佳实践。
  • 破坏性测试:DR 演练 (灾难恢复)。
  • GitLab HA:通过 Sharding 解决大规模存储问题。

第39讲 持续交付高效学习指南

  • 推荐书籍:《持续交付:发布可靠软件的系统方法》、《凤凰项目》。
  • 建议:通读官方文档。深入理解开源软件的设计原理,而不只是使用它们。

第40讲 结束语:越痛苦的事,越要经常做

  • DevOps 工程师的五大特质 (五痛)
    1. 比架构师懂得多:需要全局视野。
    2. 比开发人员动作快:自动化是核心。
    3. 比 QA 团队眼睛尖:洞察潜在质量风险。
    4. 比运营人员“心脏大”:顶得住压力,受得住委屈(如处理生产事故)。
    5. 比产品经理还会“吹”:擅长系统推广与包装,因为需要向团队推广 CI/CD 文化和工具,讲 PPT 做演示是必修课。

外部参考资源