什么是Jenkins-Pipeline
Pipeline是一套运行在Jenkins上的工作流框架,2.X版本Jenkins的核心功能,主要是将一个大的工作流分拆成多个独立的功能模块,实现单个任务难以完成的复杂流程编排和可视化。
Jenkins Pipeline也是实现CICD As file的一个重要工具,将Pipeline编写成Jenkinsfile与业务代码一起存放。
Pipeline支持两种语法:
1、声明式语法
Jenkins新加入的语法规则在Jenkinsfile固定的关键字之内,所采用的语法风格大多与shell类似,这种风格更加符合日常的阅读习惯,也更简单,以后我都将采用这种方式进行介绍以及深入。
2、脚本式语法
不是shell脚本形式,而是基于Groovy语言的语法风格,学习成本相对较高
建议直接使用声明式语法清晰简单明了,合适大部分人入门
Pipeline和FreeStyle对比
| | 灵活方式 | 显示形式 |
|—|—|—|—|
| FreeStyle | 图形化操作,合适入门操作,后期流程多后,不易于快速快速构建 | 只有统一日志展示,没有完整阶段流程信息展示 | |
| Pipeline | 结构化代码语法,易于阅读和管理,可以实现CICD as Code | 阶段流程信息展示清晰,每个阶段构建时间和对应的构建日志清晰可读 | |
Jenkins-Pipline语法介绍


图片来源:https://wiki.eryajf.net/pages/3298.html#_1-%E6%A1%86%E6%9E%B6%E4%BB%8B%E7%BB%8D%E3%80%82
- Aagent: 一个 Aagent 就是一个 Jenkins执行 Step 的具体运行环境。
- Stage: 表示Pipeline的一个阶段,如clone code阶段,Build阶段。一个Pipeline中至少需要一个Stage。
- Step: 表示实际的执行步骤,小到执行一个 Shell 脚本,大到构建一个 Docker 镜像,由各类 Jenkins Plugin 提供,当插件扩展Pipeline DSL 时,通常意味着插件已经实现了一个新的步骤,在Stage下有且只能有一个step。
environment
环境变量,可以定义在全局变量或者步骤中的局部变量,取决于所定义位置。
1 | pipeline { |
运行结果,会输出对应的环境变量。
options
选项,定义流水线运行时的配置选项。如历史构建记录数量保留,超时时间等操作。以下例子定义重试次数.
1 | pipeline { |
编写一个无法执行的命令,可以通过Console Output看见会Retrying 3次才停止。
parameters
参数,为流水线运行时设置相关的参数,不需要在UI界面上额外定义。
出现在Pipeline块内,并且只有一次。
常用参数:
string:字符串类型的参数,例如: parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }
文本: 一个text参数,可以包含多行,例如: parameters { text(name: 'DEPLOY_TEXT', defaultValue: 'One\nTwo\nThree\n', description: '') }
booleanParam: 一个布尔参数,例如: parameters { booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '') }
choice: 选择参数,例如: parameters { choice(name: 'CHOICES', choices: ['one', 'two', 'three'], description: '') }
password: 在 Jenkins 参数化构建 UI 提供一个暗文密码输入框,所有需要脱敏的信息,都可以通过这个参数来配置。 parameters { password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password') }
注意:
这种声明定义之后,需要手动构建一次,然后才会自动落位到配置好的参数化构建中了。
例子:
1 | pipeline { |
在执行Build时会多出这些选项
post
运行后处理,当流水线完成后根据配置的条件做一些动作,如:构建失败后邮件通知。
条件:
always:无论怎么样总是执行。
changed: 当前Pipeline状态与先前不一致情况下执行。
failuer: 失败情况下。
success: 成功情况下。
unstable: 不稳定情况下,Pipeline状态标识为黄色。
aborted: Pipeline中止情况下。
cleanup: 无论怎么样,执行目录清理
例如:
无论怎么样,将执行情况邮件发送。
1 | post{ |
定义三种执行状态,此时shell命令无法执行,输出always和success输出信息。
1 | pipeline { |
tool
构建工具,获取通过自动安装或手动安装工具的环境变量,支持maven、jdk、gradle,工具的名称必须预先在Jenkins的系统设置->全局工具配置中定义。
例如在Jenkins—>Global Tool Configuration中添加工具对应的环境变量,然后在项目中引用。
1 | pipeline { |
input
交互输入,在流水线执行各个阶段的时候,由人工确认是否继续执行。
1 | pipeline{ |
点击构建,程序将会在input的步骤停住,等待用户进行相应输入和选择。
message :必填。页面展示信息
ok:input表单上“ok”按钮的可选文本。
submitter:允许提交此input选项的用户或外部组名列表,用逗号分隔。默认允许任何用户。
例子结果如图所示:
when
条件判断,允许流水线根据给定的条件决定是否应该执行阶段,when 指令必须包含至少一个条件.
内置条件
branch:分支匹配,如when { branch 'release-v2.5' }
environment:环境变量匹配如when { environment name: 'DEPLOY_TO', value: 'production' }
not:当嵌套条件为false时执行stage。必须包含至少一个条件例如:when { not { branch 'master' } }
allOf:当所有嵌套条件都为真时,执行舞台。必须包含至少一个条件。例如:when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }
anyOf: 当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:when { anyOf { branch 'master'; branch 'staging' } }
以上例子支持通配符配置,如when { branch 'release-v2.*' }
例子:
1 | pipeline { |
执行后因为是clone main分支,将输出deploy to proc env。
parallel
默认Pipeline是串行,可以通过parallel配置并行构建,阶段可以在他们内部声明多嵌套阶段, 它们将并行执行,一个阶段只能有一个 steps 或 parallel的阶段。
1 | pipeline { |
注:添加failFast true到包含parallel的stage中,其中一个失败时中止所有parallel内的stage。
本阶段会执行多个步骤。
通过BlueOcean查看Pipeline效果图

script
脚本标签,需要执行一些系统命令语法。
1 | pipeline { |
通过sh执行对应的shell命令。
trigger
触发器,设置构建触发器,比如根据周期计划定时构建。
cron定时构建
根Linux内crontab对应的,分、时、日、月、周。这里例子定义每分钟执行一次。
1 | pipeline { |
注意点:
H关键字为Hash,表示当前设置的时间跨度范围内随机一值例如triggers{ cron('H/15 * * * *') }
每15分钟执行一次,可能在 :07,:22,:37,:52执行
withCredentials
将secret与变量对应起来。在jenkins中创建的密钥,在Pipeline中希望通过变量方式引用,可以通过withCredentials进行。
例子
在全局凭据中创建个Username with password的凭证,输入用户名和密码
1 | pipeline { |
执行构建后会输出密钥中的用户名
注:
usernamePassword:withCredentials的类型,相应的还支持sshUserPrivateKey(ssh key)和certificate(证书)。
credentialsId:Jenkins中对应的配置名称。
passwordVariable: 密码项目转成对应的变量。
usernameVariable: 用户名项转换成对应的变量。
SSH User Private Key 示例
1 | withCredentials(bindings: [sshUserPrivateKey(credentialsId: 'jenkins-ssh-key-for-abc', \ |
Certificate 示例
1 | withCredentials(bindings: [certificate(aliasVariable: '', \ |
参考: https://www.jenkins.io/zh/doc/book/pipeline/jenkinsfile/#usernames-and-passwords
BlueOcean使用
Jenkins针对pipeline提供了全新的Blue Ocean界面,可以清晰的查看流水线的执行情况:
安装blueocean插件
安装完以后在对应的项目处会多出一个打开Blue Ocean按钮,
界面美化后的扁平化风格,可以通过此界面,进行一些常规的配置和操作
阶段性Pipeline重跑
日志统一下载
Jenkinsfile
目前主流大部分CI工具都支持Pipeline as Code,就是将整CI流程通过代码方式实现,然后将对应的代码和业务代码放置在一起,对应的CI工具在拉取业务代码后可以直接解析CI的流程代码进行执行。Jenkins也是支持这种方式的,通过将写好的Pipeline写在Jenkinsfile中存放在代码仓库中,Jenkins配置读取指定目录的Jenkinsfile文件即可。
实例Demo最佳实践
完整CICD步骤
1、clone 源码。
2、编译源码。
3、编译后进行代码扫描和编译后可执行文件扫描。
4、将编译后生成的制品上传到制品库。
5、镜像构建,将构建后的镜像上传到Harbor。
6、更新Gitlab中的部署文件。
7、触发ArgoCD同步。手动或自动部署到Kubernetes环境中。
Jenkins创建连接账号
因为要进行镜像上传和修改gitlab中的部署yaml,需要进行修改。
系统管理——>Manage Credentials——>创建全局域的认证信息
添加凭据
类型为Username with password
创建id为harbor_account和gitlab_account的凭证用于Pipeline连接。
代码库配置连接SonarQube信息
使用Pipeline流水线,需要在添加以下步骤
1、在对应的代码库的根目录创建sonar-project.properties文件
1 | sonar.projectKey=test2 |
Pipeline中添加以下步骤
1 | stage('SonarQube analysis') { |
注:
1、SonarQubeScanner为全局工具配置中的SonarQube Scanner的配置名称。
2、withSonarQubeEnv配置的sonar变量为全局——>系统配置sonar-server的配置名称
Pipeline创建
创建个名称为spring-petclini的Pipeline
配置构建触发器
贴入以下Pipeline 代码
1 | pipeline { |
注意点:
1、clone阶段如果是私有代码仓库,需要配置凭证,可以通过流水线语法生成对应的执行命令。


输入对应的git地址和分支,选择gitlab密钥,生成对应的执行代码
执行
修改spring-petclinic项目的代码注释掉主页的图片,提交代码,触发自动CICD查看效果。
注释掉首页小狗图片spring-petclinic/src/main/resources/templates/welcome.html
1 | <!--<img class="img-responsive" src="../static/resources/images/pets.png" th:src="@{/resources/images/pets.png}"/>--> |
重新提交代码
查看已经没有对应logo
参考链接:
https://www.jenkins.io/doc/book/pipeline/syntax/
https://wiki.eryajf.net/pages/3298.html