一、什么是Jenkins流水线¶
Jenkins 是领先的开源自动化服务器。它使用 Java 构建,提供了超过 1,800 个插件来支持几乎任何东西的自动化,因此人类可以花时间做机器不能做的事情。
Jenkins流水线是一套插件,它支持在Jenkins中实现和集成持续交付流水线(Continuous Delivery Pipeline)。流水线提供了一组可扩展的工具,用于通过Pipeline DSL将简单到复杂的交付流水线以代码的形势展现,类似于基础设施即代码。
持续交付流水线会经历一个复杂的过程:从版本控制、向用户和客户提交软件、软件的每次变更(提交代码到仓库)到软件发布(Release)。这个过程包括以一种可靠并可重复的方式构建软件,以及通过多个测试和部署阶段来开发构建好的软件(称为Build)。
Jenkins流水线的定义被写在一个文本文件中(一般为Jenkinsfile),该文件“定制”了整个构建软件的过程。Jenkinsfile也可以被提交到项目的代码仓库中,在Jenkins中可以直接引用。将持续交付流水线作为应用程序的一部分,像其他代码一样进行版本化和审查,这是流水线即代码的基础。
创建Jenkinsfile并提交到代码仓库中的好处如下:
- 自动为所有分支创建流水线构建过程。
- 在流水线上进行代码复查/迭代
- 对流水线进行审计跟踪
- 流水线的代码可以被项目的多个成员查看和编辑
- 可以对Jenkinsfile进行版本控制。
二、Jenkins流水线分类¶
Jenkins流水线主要分为声明式和脚本式两种,包含pipeline(流水线)、node(节点)、stage(阶段)、step(步骤)等区块。
1.pipeline
pipeline是用户定义的一个持续交付(CD)流水线模型。流水线的代码定义了整个构建过程,包括构建、测试和交付应用程序的阶段。另外,pipeline块是声明式流水线语法的关键部分。
2.node
node是一个机器,它是Jenkins环境的一部分,另外,node块是脚本化流水线语法的关键部分。
3.stage
stage块定义了在整个流水线的执行任务中概念不同的子集(比如Build、Test、Deploy阶段),它被许多插件用于可视化Jenkins流水线当前的状态/进展。
4.step
本质上是指通过一个单一的任务告诉Jenkins在特定的时间点需要做什么,比如要执行shell命令,可以使用sh SHELL_COMMAND。
2.1 声明式流水线¶
在声明式流水线语法中,流水线过程定义在 Pipeline{}中,Pipeline 块定义了整个流水线中完成的所有工作,比如:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
// Add build steps here
}
}
stage('Test') {
steps {
// Add test steps here
}
}
stage('Deploy') {
steps {
// Add deployment steps here
}
}
}
}
上面参数说明:
- agent any:在任何可用的代理上执行流水线或它的任何阶段,也就是执行流水线过程 的位置,也可以指定到具体的节点;
- stage:定义流水线的执行过程(相当于一个阶段),比如上文所示的 Build、Test、Deploy, 但是这个名字是根据实际情况进行定义的,并非固定的名字;
- steps:执行某阶段具体的步骤。
一个以声明式流水线的语法编写的 Jenkinsfile 文件如下:
Jenkinsfile (Declarative Pipeline)
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test') {
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
}
上面参数说明:
- pipeline:声明式流水线的一种特定语法,定义了包含执行整个流水线的所有内容和指令,也是声明式流水线的开始;
- agent:声明式流水线的一种特定语法,指示Jenkins为整个流水线分配一个执行器和工作区,也就是在流水线中的步骤在哪个 Agent 上执行,该参数同样可以在stage中配置;
- stage:描述流水线阶段的语法块,在脚本式流水线语法中,stage(阶段)块是可选的;
- steps:声明式流水线的一种特定语法,它描述了在这个stage中要运行的步骤;
- sh:执行一个 shell 命令;
- junit:用于聚合测试报告。
2.2 脚本式流水线¶
在脚本化流水线语法中,会有一个或多个 Node(节点)块在整个流水线中执行核心工作, 比如:
Jenkinsfile (Scripted Pipeline)
node {
stage('Build') {
// Add build steps here
}
stage('Test') {
// Add test steps here
}
stage('Deploy') {
// Add deployment steps here
}
}
上面参数说明:
- node:在任何可用的代理上执行流水线或它的任何阶段,也可以指定到具体的节点;
- stage:和声明式的含义一致,定义流水线的阶段。Stage 块在脚本化流水线语法中是可 选的,然而在脚本化流水线中实现 stage 块,可以清楚地在 Jenkins UI 界面中显示每个 stage 的任务子集。
一个以脚本化流水线的语法编写的 Jenkinsfile 文件如下:
Jenkinsfile (Scripted Pipeline)
node {
stage('Build') {
sh 'make'
}
stage('Test') {
sh 'make check'
junit 'reports/**/*.xml'
}
stage('Deploy') {
sh 'make publish'
}
}