1. 前言

随着互联网软件行业快速发展,为了抢占市场先机,企业不得不持续提高软件的交付效率。特别是现在国内越来越多企业已经在逐步引入DevOps研发模式的变迁,在这些背景催促之下,对于企业研发团队所需要具备的持续集成和持续交付(简称CI/CD)能力变得越来越不可或缺。

相信现在不管是开发人员、测试人员或者是运维人员,在求职招聘时,基本上如果是面试的是中高级以上的职位,大多都要求要具备相关CI/CD的项目建设或参与搭建经验。

为了帮助到更多技术读者,从本周起,将以《持续集成实践系列》为主题,分享几篇搭建CI持续集成实践的技术干货。

关于持续集成和持续交付(CI/CD)概念的介绍,之前的文章:《DevOps研发模式下CI/CD实践详解指南》 中有过较详细的介绍,如果还不清楚什么是CI/CD的读者,可以在阅读本文前先,参考一下这篇文章。

2. CI系列大纲

市面上关于CI/CD的建设如果仅从工具、框架层面来讲,方案有挺多,如TeamCityGitLab CIBambooCircle CITravis CIJenkins公司自研(在研发建设CI/CD能力时,除了CI/CD工具、框架链的建设外,还包括研发协同文化的建设等, 文化层面的这个不在本系列的讨论范围内)。

而在众多的持续集成CI建设工具体系中,Jenkins基本上可以说是独占鳌头,也是大多数公司最常用、最首选的工具之一,占据了将近70%以上的市场。

而随着Jenkins本身的不断发展,当前Jenkins已演变发展到了2.x系列,在Jenkins 2.x系列中,其中最核心的特性是引入了流水线机制,并提出了流水线即代码(pipeline as code)的理念

因此本系列也将以Jenkins 2.x作为《持续集成实践系列》的载体,为大家介绍在结合Jenkins 2.x搭建持续集成CI能力过程中常见的一些知识要点和实现过程。

系列大纲分为(初步拟订):

  • Jenkins 2.x 搭建CI需要掌握的硬核要点(一)
  • Jenkins 2.x 搭建CI流水线执行流程(二)
  • Jenkins 2.x 搭建CI流水线实现案例(三)
  • Jenkins 2.x 搭建CI流水线通知机制(四)
  • Jenkins 2.x 搭建CI扩展流水线:自定义共享库(五)

PS: 当然Jenkins 2.x & CI流水线的知识要点远不止如此。

3. 先介绍一下Jenkins 2.x

Jenkins 2本身的概念比较宽泛。在特定的上下文环境中,它用来泛指支持流水线即代码及其它类似Jenkinsfile等新特性的新版Jenkins。

Jenkins 1.X版本主要通过插件的方式来实现,确切地讲,Jenkins 2也是通过对已有插件的重点升级和新插件的引入来获取新功能。

相比之前,用户只能通过WEB界面进行配置的方式来定义Jenkins任务,Jenkins 2则通过使用Jenkins DSL和Groovy语言编写程序,用户可以定义流水线并执行各种任务。

这里提到的DSL代表领域特定语言(Domain-Specific Language),可以理解为一种适用于Jenkins的编程语言。DSL基于Grovvy实现,并通过概念和结构封装了Jenkins的特定功能。

Jenkins 2推荐使用名为Jenkinsfile的文件保存任务配置和流水线信息,不同的项目和分支都会有自己的Jenkinsfile,其内容各不相同。你可以将全部代码写在一个Jenkinsfile中,也可以通过共享库的方式调用外部代码。

4. Jenkins 2.x 实现流水线的两种语法

当我们通过Jenkins 2.x实现流水线时,有两种不同的语法样式:脚本式语法(script syntax)和声明式语法(declarative syntax)。

脚本式语法(script syntax)是Jenkins最开始实现流水线即代码的方式,这是一种命令式风格,在以前版本的Jenkins中,流水线即代码大体就是Groovy脚本,其中插件部分针对Jenkins的DSL步骤。这种方式几乎没有结构上的约束,程序流程也基于Groovy语法结构实现。

这种模式现在被称为脚本式流水线。在脚本式流水线中,DSL支持为数众多的任务步骤,但是仍然缺失了部分面向Jenkins任务的核心特性,比如,构建后处理、流水线结构错误检查以及基于不同执行状态发送通知的功能。当然大多数功能都可以通过Groovy编程机制来模拟实现,比如try-catch-finally语法。但是这在面向Jenkins编程的基础上对Groovy语言技能提出了更高的要求。

声明式语法,是Jenkins提供的一种新的选择,声明式风格的流水线代码被编排在清晰的段落中,相对于只关注实现逻辑。

5. 如何选择脚本式语法或声明式语法

那么有哪些因素会影响选择脚本式语法或声明式语法呢?和大多数事情一样,这也不是一个严谨的科学问题。在特定的情况下,对比需求、实现的结构和流程以及构建流水线的人员技能和背景,二者可能各有千秋。

比如,脚本式流水线具有以下优点:

  • 更少的代码段落和弱规范要求。
  • 更强大的程序代码能力。
  • 更像编写代码程序。
  • 传统的流水线即代码模型,用户熟悉并向后兼容性。
  • 更灵活的自定义代码操作。
  • 能够构建更复杂的工作流和流水线。

但同时,脚本式流水线也具有以下缺点:

  • 普遍要求更高的编程水平。
  • 语法检查受限于Groovy语言及环境。
  • 和传统的Jenkins模型有很大差异。
  • 与声明式流水线的实现相比,同一工作流会更复杂。

看一则简单的,脚本式流水线示例:

node("worker_node1"){
stage("Source"){
//从Git仓库中获取代码
git 'git@github.com:zhoujinjian/intelligent-test-platform.git'
}
stage("Compile"){
//运行Gradle进行编译和单元测试
sh "gradle clean comileJava test"
}
}

而声明式流水线优点有:

  • 更结构化,贴近传统的Jenkins Web表单形式。
  • 更强大的声明内容能力,高可读性。
  • 可以能过Blue Ocean图形化界面自动生成。
  • 段落可映射到常见的Jenkins概念,比如通过。
  • 更友好的语法检查和错误识别。
  • 提升流水线间的一致性。

但如此同时,声明式流水线的缺点也很明显:

  • 对迭代逻辑支持较弱(相比程序而已)
  • 对于传统的Jenkins中部分功能缺乏支持。
  • 更严格的结构。
  • 目前对于复杂的流水线和工作流难以胜任。

声明式流水线示例:

pipeline{
agent{
lable "worker_node1"
}
stages{
stage("Source"){
steps{
//从Git仓库中获取代码
git 'git@github.com:zhoujinjian/intelligent-test-platform.git'
}
}
stage("Compile"){
steps{
//运行Gradle进行编译和单元测试
sh "gradle clean comileJava test"
}
}
}
}

简而言之,对于新用户和那些希望流水线具备传统Jenkins一样可读性的用户来说,声明式流水线更容易学习和维护。脚本式流水线更加灵活,允许用户不受结构结束实现更多功能

不过,总的来说,任何一种流水线类型对大多数场景而言同样适用。好了本文作为CI持续集成系列的开篇,先介绍到这里吧。

详细可查看:原文阅读

「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点的更多相关文章

  1. 「持续集成实践系列 」Jenkins 2.x 构建CI自动化流水线常见技巧

    在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法.原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要 ...

  2. fir.im weekly - 「 持续集成 」实践教程合集

    我们常看到许多团队和开发者分享他们的持续集成实践经验,本期 fir.im Weekly 收集了 iOS,Android,PHP ,NodeJS 等项目搭建持续集成的实践,以及一些国内外公司的内部持续集 ...

  3. [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  4. 基于 Node.js 的轻量「持续集成」工具 CIZE

    CIZE 是什么? CIZE 是一个「持续集成」工具,希望能让开发人员更快捷的搭建一个完整.可靠.便捷的 CI 服务. 甚至可以像 Gulp 或 Grunt 一样,仅仅通过一个 cizefile.js ...

  5. 基于Jenkins的开发测试全流程持续集成实践

    今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...

  6. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  7. 什么是云效持续集成?如何关联Jenkins进行持续集成?

    什么是云效持续集成?如何关联Jenkins进行持续集成?云效流水线 Flow是一款企业级.自动化的研发交付流水线, 提供灵活易用的持续集成.持续验证. 持续发布功能,帮助企业高质量.高效率的交付业务. ...

  8. 持续集成之④:GitLab触发jenkins构建项目

    持续集成之④:GitLab触发jenkins构建项目 一:目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目.代码质量测试然后部署至测试环境, ...

  9. Jenkins持续集成(下)-Jenkins部署Asp.Net网站自动发布

    环境:Windows 2008 R2.Jenkins2.235.1.Visual Studio 2017: 概要 前面写过一篇文章,<自动发布-asp.net自动发布.IIS站点自动发布(集成S ...

随机推荐

  1. Function-time()

    time()函数返回自1970年1月1日0点以来经过的秒数,每秒变化一次? time()函数定义在头文件<time.h>中,原型是: time_t time(time_t *arg); 如 ...

  2. 51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划

    有一个箱子容量为 V(正整数,0<=V<=20000),同时有 n 个物品(0<n<=30),每个物品有一个体积(正整数). 现在在 n 个物品中,任取若干个装入箱内,使得箱子 ...

  3. Vxlan L3

    拓扑图: CE1 <CE1>display current-configuration !Software Version V800R013C00SPC560B560 !Last conf ...

  4. jQuery中的查找节点、创建节点、插入节点、删除节点、替换节点、复制节点操作方法

    jQuery操作节点我们可以分六点来讲,查找节点.创建节点.插入节点.删除节点.替换节点.复制节点. 一.查找节点 text() - 设置或返回所选元素的文本内容   ,html() - 设置或返回所 ...

  5. 现代企业要求上什么样的MES(四)

    一个制造企业要想盈利,在生产方面要做的无非是提高资源利用效率和缩短生产通过时间(生产周期),而实现这俩步骤需要生产状况的在线透明及避免薄弱环节的分析数据,由此达到改善生产状态的目的.在erp系统中,通 ...

  6. ubuntu18.04下mysql安装时没有出现密码提示

    前言: 一:配置 ubuntu 18.04 mysql 5.7.30 二:问题 ubuntu18.04下mysql安装时没有出现密码提示,安装后自己有一个默认的用户名以及密码 解决方案: 1. 在终端 ...

  7. 【Hadoop离线基础总结】MapReduce增强(下)

    MapReduce增强(下) MapTask运行机制详解以及MapTask的并行度 MapTask运行流程 第一步:读取数据组件InputFormat(默认TextInputFormat)会通过get ...

  8. 网站主机技术+linux教程

    一.Linux 云服务器 自己安装服务器还是麻烦了些,现在一般都推荐大家使用云服务器,比较方便,价格也不贵. 目前市场上的云服务器很多,这边比较下腾讯云跟阿里云的服务器优惠活动,现在看来腾讯云性价比会 ...

  9. CF#633C Spy Syndrome 2 DP+二分+hash

    Spy Syndrome 2 题意 现在对某个英文句子,进行加密: 把所有的字母变成小写字母 把所有的单词反过来 去掉单词之间的空格 比如:Kira is childish and he hates ...

  10. [hdu4888]最大流,判断最大流唯一性

    题意:给一个n*m的矩形,往每个格子填0-k的数字,使得对第i行和为row[i],第i列和为col[i],问是否存在方案,方案是否唯一,如果方案唯一则输出具体方案. 思路:首先根据问题提取对象,行.列 ...