Skip to content

第45讲:持续交付与DevOp技术点剖析

软件开发方法论演进

我们首先看下软件开发方法论的演进,从 1999 年持续集成开始流行,人们逐渐引入了很多方法提升开发效率,慢慢地形成了SCRUM与XP两大敏捷开发派系,其中持续集成是XP的一个核心理念。

然后到了第二阶段,持续交付开始流行,持续交付涵盖了非常多的技术点,在 2009 年,又出现了 DevOps 的概念,DevOps 专注于研发与运维间的协作,同时也带来大量优秀的实践,你可以看到 DevOps 与持续交付有很大的交集,而 DevOps 真正火起来的推手是 Docker 技术的出现,随着现在 DevOps 与持续交付重叠的领域越来越大,导致很多人不再严格区分两者。

而从团队的角度来分析会发现持续交付、DevOps、敏捷和持续集成涉及的角色范围不同,如图所示(引用自《持续交付2.0》书籍作者乔梁的公开分享),如果开发和测试一起协作,持续集成就非常适用,在早期可以使用 Jenkins 来完成持续集成的构建。

到了第二阶段,你可以看到敏捷关注到了需求的迭代,涵盖了业务线的产品、研发与测试。第三是持续交付,持续交付又扩展了一层,融入了自动化测试、持续集成,自动化发布三个核心理念,涵盖了整个领域。

DevOps关注研发与运维的协作,是一种文化,也是多种优秀实践的结合,使得开发、测试、运维这三种角色的价值流水线交付变得越来越快,以前按月按周发布,而 DevOps 时代可以做到按天、按小时发布,所以 DevOps 也是非常优秀的实践。

Jenkins

接下来,我们看下 Jenkins,Jenkins 最早是一个持续集成的平台,随着 CD 的流行后开始支持 CD,后来又支持 DevOps 平台。在生态里无论是 CD 还是 DevOps,涵盖的技术点都非常多,包括代码版本管理、构建、静态扫描、测试,还包括最后的交付及部署流程,这个流水线有非常多的技术栈,很多的技术点都是 CD 与 DevOps 共用的,Jenkins 把所有的工具都集成到了一起。

CD Pipeline

而我们在工作的时候,需要定义交付流水线的具体工作,这个通常称之为 CD Pipeline,当一个企业或产品需要完成一系列协作的时候,从需求管理到代码版本号管理、代码构建、各类测试、部署,以及部署完成之后的一系列自动化测试,都衔接在一起组成了持续交付的自动化流水线。

基于 Pipeline 你还可以构建更多的任务,我们在前面学习 Jenkins 时了解到需要配置各种参数,但随着流水线越来越复杂,原有基于 Job 的模式很难描述复杂的流程,所以需要有一个语法定义 Pipeline,就出现了 Jenkins Pipeline 语法,也就是把流水线的流程以标准化的语法来进行表述,整个阶段负责什么事情,这里全部都有表述,Pipeline 有自己的 DSL 语法。

如果你想使用 Pipeline,在创建一个新的 Job 的时候,不要选择 Freestyle project,我们更多时候使用流水线。

创建完流水线之后,就允许你来编写 Pipeline 语法的配置文件了,系统也有一些快捷键帮你自动生成对应的语法。

如果你对 Pipeline 语法并不是很了解,它还提供了一个叫作 Pipeline 语法生成器的工具,你可以把配置内容写好,然后工具会帮你自动生成 Pipeline 语法,所以有了这个工具后配置起来会非常便捷。

Jenkinsfile

我们掌握了 CD Pipeline 的语法定义和 Job 使用之后,接下来看下 Jenkinsfile,复杂的流水线你会发现需要写 Pipeline 语法,写完之后把它放到 Job 里运行,但如果 Pipeline 用 Jenkins 管理的时候,Jenkins 的 Job 只有一个实例,也就是说今天我们改了一个版本,下次又改了一个版本,但 Pipeline 只能维护一套,它没有版本化的管理功能,这明显不符合管理规范。

基于这种情况,Jenkins 提供了一个 Jenkinsfile 功能,它允许你把 Pipeline 的定义从 Jenkins 配置转义到你的代码库里,也就是说在你的项目下面创建一个 Jenkinsfile 文件,这个 Jenkinsfile 文件定义了 Pipeline,也就是把你的 Pipeline 语法写到文件里。

然后,Jenkins 把代码从 Git 上拉取下来,当它发现你的项目的根目录下有一个 Jenkinsfile 的时候,它会把 Jenkinsfile 解析出来,这就是一个 Pipeline 的定义过程,有了它将来我们对 Jenkinsfile 进行改动的时候就可以进行版本化的管理,这是一个很大的进步,所以 Jenkinsfile 要求我们在项目中放一个 Jenkinsfile 文件,来帮我们对 Pipeline 进行定义。

有了 Jenkinsfile 之后当我们做多分支流水线的时候就变得轻而易举,比如一个项目有很多分支,需要在关键的分支上进行测试,这时只需要在分支里放一个 Jenkinsfile,一旦检测到分支里有 Jenkinsfile,就会把这个分支作为持续交付的流水线作业,所以多分支流水线就可以完成这样的操作,当你创建一个 Job 的时候,你就会注意到页面下方有一个多分支流水线,只要分支下有 Jenkinsfile,就会帮你管理整个分支的持续交付流水线。

BlueOcean

随着流水线的工具越来越多,原有的基于 Jenkins job 的管理体系逐渐不能满足大家的使用需求,这时 Jenkins 提供了一个叫作 BlueOcean 的面板,BlueOcean 面板可以把持续集成的流水线以一种新的界面展示给你,这个流水线里有 Pipeline 帮你创建流水线工具,也可以提供更好的视图帮你了解 Pipeline 的运作细节。

我们看下 BlueOcean 的整个运作模式,项目构建完成之后,随之便是浏览器测试过程,浏览器测试过程下包含了 Chrome、Firelox、IE、Safari 等多个并行任务,等它们测试完成之后就会进入后续更多流程, BlueOcean 给我们提供了一个新的界面,让我们可以更清晰地观看、修改流水线,所以有了它之后对项目的管控,对项目的理解会变得更方便,可以说 BlueOcean 是为 Pipeline 而生的,它在解析 Pipeline 时会更好用。

以上就是 持续交付与 DevOps 的知识点,你可以用 Jenkins 2.0 作为主要的平台帮你的公司或团队去落地持续交付和 DevOps 体系。