1. 介绍
本篇主要分享对于Jenkins中Freestyle Project项目和pipeline项目的一些知识分享。如果我们的Jenkins中安装了中文插件,那么它们可能会被翻译为:
- freestyle project : 构建一个自由风格的软件项目
- Pipeline: 流水线
下面将会使用中文进行介绍这两种任务的区别。
如果你是刚开始接触Jenkins。那么了解这两个区别才能正确使用Jenkins。
2. Freestyle project
通常我们如果完全新手,可能刚开始接触的都是Freestyle Project类型的任务。我们在新建任务的时候选择:构建一个自由风格的软件项目。
就会创建了一个Freestyle project。
而它的特性就是,可以通过各种web表单,配置完整的构建步骤。示例如下:
自由风格的软件会分为以下几个步骤:
General :用于配置任务的全局信息,例如项目描述,创建全局参数等等。
源码管理:当我们安装Git插件之后,这个地方才会还有一个Git选项,可以用来配置Git项目地址,分支,Git访问权限等资料信息
构建触发器:我们如果需要通过其他地方触发任务的构建,例如定时构建啊,使用脚本远程触发构建操作,其他任务发生构建后进行自动触发本任务构建等等。
我们如果刚开始使用,可以不用配置构建触发器中的任何配置,并不影响我们的任务构建。只是需要我们主动点击构建按钮进行构建而已。
构建环境:也就是说我们开始构建之前,针对即将进行构建的操作有哪些环境配置。例如常见的:Delete workspace before build starts(在生成前清空构建空间)
简单理解就是,是不是要清除掉上一次构建后,残存的各种文件和构建结果内容等等。(这个功能需要 Workspace Cleanup Plugin插件的支持。你如果没有安装那么就不会有这个选项)例如:add timestamps to the Console Output 在构建任务的输出清单中显示时间(需要插件 Timestamper 的支持,如果没有安装该插件,就没有该选项)
Build Steps :这个模块属于重头戏了。 我们整个自由风格的各种构建任务都是在这个步骤中进行配置并实施的。示例如下:我们可以使用各种编译构建工具(前提是Jenkins安装了对应的插件。)
例如使用Ant进行构建,使用Gradle进行构建项目,使用Shell脚本等等。例如调用Gradle插件的支持,将源码拉取到得到项目进行构建。然后在task中配置Gradle的Tasks指令,进行项目编译。下图展示的是编译app
构建后操作:我们在上一步Build Steps操作结束后,都会有一个构建成品的输入例如jar包,例如App等。然后在本次配置中,就可以针对该输出结果进行一个其他操作,例如将App同步到蒲公英并发送消息到钉钉群里面(Jenkins使用Groovy Post+Upload to pgyer+钉钉机器人实现通知 (zinyan.com))。等等操作,还可以执行Git项目的推送。将构建完毕的成果上传到版本管理仓库中等
最终整个自由风格的项目就配置完毕了。中间每个步骤根据需求和使用的插件,可以进行扩展实现更多自动化的操作。
同时,我们如果在网络中搜索部分的方案时,发现对方介绍的菜单项在我们的Jenkins中不存在。那么应该就在于部分插件没有安装造成的。
自由风格更多地依赖各种插件,然后我们通过插件提供的各种配置项,进行配置。合理搭配插件最终来实现整个任务的构建和输出。
PS:一般新人接触Jenkins 的时候,比较多地使用上面的方式。还有一种方式就是通过流水线Pipeline实现的构建。
自由风格的项目创建和配置内容当我们配置完毕后,Jenkins会生成一个xml文件存储在项目隐藏目录下。
每次点击执行的时候,jenkins是通过读取该xml配置命令,按照步骤进行一步一步的命令读取并执行的。
3. Pipeline
如果使用过Jenkins 1 版本,那么大家可能接触的比较多的就是Freestyle Project。在Jenkins2 中Pipeline的角色得到了提高。
网上也有更多的教程是用来介绍Pipeline 流水线任务的构建。
PS:要想使用Pipeline流水线构建,必须安装有pipeline插件,否则创建任务的时候将会没有这个选项
有别于自由风格那6个配置项,流水线的配置项比较少。示例如下:
主要是分为以下几个步骤:
General :用于配置任务的全局信息,例如项目描述,创建全局参数,流水线的其他全局配置等等。其实和自由软件中的General区别不大。
构建触发器:我们如果需要通过其他地方触发任务的构建,例如定时构建啊,使用脚本远程触发构建操作,其他任务发生构建后进行自动触发本任务构建等等。
我们如果刚开始使用,可以不用配置构建触发器中的任何配置,并不影响我们的任务构建。只是需要我们主动点击构建按钮进行构建而已。
高级项目选项:配置一下项目的显示名称,不配置的话默认显示。
流水线:这个模块就是我们流水线配置的重头戏了。通过流水线脚本实现各种构建依赖操作。(相关构建过程例如构建Android项目,Gradle插件仍然是需要的)
主要就是可以将各种插件的表单配置操作,全部改为Groovy命令的形式进行使用(PS:前提是该插件支持Pipeline否则就无法通过命令使用该插件)。
流水线创建是通过各种脚本命令来实现的,jenkins会将相关脚本内容转换为jenkinsfile文件进行执行。
同时,流水线功能也是Jenkins 2.0版本开始后的主推的功能。
流水线中的脚本内容分为两种:
- 脚本式流水线:是Jenkins最开始实现的流水线即代码方式,这是一种命令式的风格脚本。在流水线脚本中定义逻辑和程序流程。更依赖于Groovy语言。
- 声明式流水线:是Jenkins2.0开始提供的一种新的方式,每个流水线代码被编排在清晰的段落中,相对于脚本式流水线,声明式流水线定义了每个区域,并且每个区域定义了具体的输入输出。
如果没有能够理解,可以说声明式流水线就是上面自由风格软件中各种插件的命令式堆积方式。
脚本式流水线更像是一种脚本或编程语言,类似各种代码执行逻辑进行处理。
而声明式更像老版本中web表单中预定义配置项中出入关键信息,代表了特定的目标和预期行为。和web表单的实现方式类似。只是改为了命令的实现方式而已。
PS:我们可以在项目代码中配置jenkinsfile文件,让jenkins拉取项目代码后,自动执行相关的脚本命令。这个知识点将来会有文章进行介绍,这里简单提一下。
例如脚本式流水线的写法为:
node('master'){
stage('build'){
echo 'Hello zinyan.com'
}
}
例如:声明式流水线的写法:
pipeline{
agent any
stages{
stage("build"){
steps{
echo "Hello zinyan "
}
}
}
}
PS: 不管是哪种脚本,它们的写法和语言方式和Groovy是一样的。只是可能有一些对外插件的调用,可以直接使用各种外部操作命令。
3.1 两种流水线脚本优缺点
PS:以下内容来源于网络收集。优缺点和实际使用可能会有部分差异,但是整体上来说,应该差异不大。
脚本式流水线具有以下优点:
- 更少的代码和弱规范要求。
- 更强大的程序代码能力。
- 更像在编写某项代码功能。
- 传统的流水线即代码模型。
- 用户熟悉并且向后兼容性。
- 更灵活的自定义代码操作。
- 能够创建和构造复杂的流水线。
缺点也明显:
- 要求熟悉Groovy语言。
- 语法检测受限于Groovy语言和环境。
- 和传统Jenkins模型有比较大的差异。
- 与声明式流水线实现相比,复杂度较高。
声明式流水线具有以下优点:
- 更结构化,贴近自由风格软件的Web表单形式。
- 更强大的声明内容能力,和可读性。
- 可以通过Blue Ocean 图像化界面自动生成。
- 段落可映射到常见的Jenkins模块概念。
- 更友好的语法检测和错误识别。
- 提升流水线之间的一致性。
缺点也明显:
- 对迭代逻辑支持较弱。
- 仍在开发完善之中。(版本更新比较频繁,对部分Jenkins本身支持的功能缺乏支持。)
- 更严格的结构。
- 目前对于复杂的流水线和工作流难以胜任。
4. 小结
总的来说,我们可以仍然使用自由项目进行配置我们的jenkins任务,并执行构建操作。
但是jenkins 2.0版本之后官方更多的是推荐我们使用流水线Pipeline进行构建任务。因为它更灵活,更直观。很多时候我们找不到各种配置,或配置项目比较多的时候,在页面中上下滑动找各种选项。
而我们通过脚本方式,可以和编程一样,直观的实现我们的需求。
其次,如果想使用好Pipeline,那么我们需要弄明白一些的基本概念例如: 系统system,主节点master,节点node,代理节点agent和执行器executor等。