Jenkins基础:Jenkinsfile使用实例:5:使用when进行条件分支处理
如何根据指定的条件进行不同的逻辑处理,这是很多场景中需要碰到的情况。将Pipeline封装成很多条不需要考虑逻辑的多条流水线的做法,在分支逻辑稍微复杂的情况下变得完全不具有可操作性,在这篇文章中将会结合使用示例介绍如何在Jenkinsfile进行条件分支的处理。
when{}
根据给定条件决定实际的分支处理逻辑,可以考虑在Jenkinsfile中使用when{}来达到这一目的。在本文中将仅仅介绍最为简单的逻辑分支处理方式,至于嵌套和多层逻辑处理将在后续的文章中进一步地展开。
- 使用限制:需要写在stage块中
- 可选vs必选:可选
内建条件类型
when所支持内建条件类型非常丰富,详细如下所示
内建条件类型 | 使用说明 | 备注 |
---|---|---|
branch | 指定分支构建时触发 | 仅对于多分支Pipeline有效 |
buildingTag | 构建tag时触发 | - |
changelog | SCM的变更日志包含指定内容时触发 | 常与正则表达式结合使用 |
changeset | SCM的changeset包含指定文件时触发 | 常与*等表达式结合使用,缺省状态是不区分大小写的,但是可以通过指定caseSensitive为true来达到区分大小写的目的 |
changeRequest | 变更请求发生时触发(比如Github的Pull Request、Gitlab的Merge Request以及Gerrit的变更等) | 如未指定参数则标明每次变更请求都会被触发,分支信息/标题/author/邮件地址等都可以作为参数传入,从而限制只有这些信息被匹配的时候才会发生触发。同时还可以与正则表达式结合使用。 |
environment | 当某环境变量被设定为某特定值时会被触发 | - |
equals | 某变量与期待值相等时被触发 | - |
expression | 表达式为true时被触发 | 注意返回的字符串必须转化为布尔类型才能正确动作。 |
tag | TAG_NAME变量满足匹配模式时会被触发 | - |
not | 当条件为false时会被触发 | - |
allOf | 当所有嵌套条件均为true时会被触发 | 至少包含一个条件 |
anyOf | 嵌套条件中至少有一个为true时会被触发 | 至少包含一个条件 |
triggeredBy | 当前构建为指定方式所触发时 | 触发方式为:SCMTrigger/TimerTrigger/UpstreamCause等。 |
环境准备
本文使用Easypack的LTS Jenkins 2.167.1版,环境准备请参看
- https://liumiaocn.blog.csdn.net/article/details/92764938
获取Jenkins-Crumb
使用如下示例代码获取Jenkins-Crumb,为使用API方式生成示例作准备。
liumiaocn:jenkins liumiao$ jenkins_host_url=http://localhost:32002
liumiaocn:jenkins liumiao$ user_passwd="root:liumiaocn"
liumiaocn:jenkins liumiao$ jenkins_crumb=`curl -u $user_passwd ${jenkins_host_url}'/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)' 2>/dev/null`
liumiaocn:jenkins liumiao$ echo $jenkins_crumb
Jenkins-Crumb:83d748ee92512c4dccd589aaa5c55a9a
liumiaocn:jenkins liumiao$
创建Job
使用如下代码示例创建Job
liumiaocn:jenkins liumiao$ ls demo/pipeline/when/config.xml
demo/pipeline/when/config.xml
liumiaocn:jenkins liumiao$ cat demo/pipeline/when/config.xml
<?xml version='1.1' encoding='UTF-8'?>
<flow-definition plugin="workflow-job@2.32"><actions><org.jenkinsci.plugins.pipeline.modeldefinition.actions.DeclarativeJobAction plugin="pipeline-model-definition@1.3.8"/></actions><description>Pipeline Job Sample</description><keepDependencies>false</keepDependencies><properties><hudson.plugins.jira.JiraProjectProperty plugin="jira@3.0.7"/><com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty plugin="gitlab-plugin@1.5.12"><gitLabConnection></gitLabConnection></com.dabsquared.gitlabjenkins.connection.GitLabConnectionProperty></properties><definition class="org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition" plugin="workflow-cps@2.69"><script>pipeline {agent any environment {ENVIRONMENT_TEST_FLAG = 'NO'}stages {stage('Init') { steps { script {BUILD_EXPRESSION = trueDEPLOY_USER = 'liumiaocn'}}}stage('Build') { when {expression { BUILD_EXPRESSION }}steps { sh 'echo Build stage ...' }}stage('Test'){when {environment name: 'ENVIRONMENT_TEST_FLAG',value: 'YES'}steps {sh 'echo Test stage ...' }}stage('Deploy') {when {equals expected: 'liumiaocn', actual: DEPLOY_USER}steps {sh 'echo Deploy stage ...' }}}}</script><sandbox>false</sandbox></definition><triggers/><disabled>false</disabled>
</flow-definition>
liumiaocn:jenkins liumiao$ curl -X POST -u $user_passwd -H ${jenkins_crumb} -H "Content-Type:application/xml" --data-binary "@demo/pipeline/when/config.xml" ${jenkins_host_url}/createItem?name=pipeline_job_when
liumiaocn:jenkins liumiao$ echo $?
0
liumiaocn:jenkins liumiao$
Jenkinsfile说明
本文示例所使用的Jenkinsfile信息如下所示,内容非常简单易读,简单说明如下:
- pipeline是结构,在其中可以指定agent和stages等相关信息
- agent用于指定执行job的节点,any为不做限制
- stages用与设定具体的stage
- stage为具体的节点,比如本文示例中模拟实际的 Build(构建)、测试(Test)、部署(Deploy)的过程。
- when 模块用于设定此stage是否执行
pipeline {agent any environment {ENVIRONMENT_TEST_FLAG = 'NO'}stages {stage('Init') { steps { script {BUILD_EXPRESSION = trueDEPLOY_USER = 'liumiaocn'}}}stage('Build') { when {expression { BUILD_EXPRESSION }}steps { sh 'echo Build stage ...' }}stage('Test'){when {environment name: 'ENVIRONMENT_TEST_FLAG',value: 'YES'}steps {sh 'echo Test stage ...' }}stage('Deploy') {when {equals expected: 'liumiaocn', actual: DEPLOY_USER}steps {sh 'echo Deploy stage ...' }}}}
执行Job
使用BlueOcean执行之后,结果信息如下所示
执行之后使用如下命令可以确认相关的执行日志信息
liumiaocn:jenkins liumiao$ curl -u $user_passwd ${jenkins_host_url}/job/pipeline_job_when/1/consoleText
Started by user root
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /data/jenkins/workspace/pipeline_job_when
[Pipeline] {[Pipeline] withEnv
[Pipeline] {[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] script
[Pipeline] {[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] sh
+ echo Build stage ...
Build stage ...
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
Stage "Test" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] sh
+ echo Deploy stage ...
Deploy stage ...
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
liumiaocn:jenkins liumiao$
修改执行条件,将Init的stage中的设定值做如下修正,保证Build和Deploy不执行,只执行Test
变量 | 修改前 | 修改后 |
---|---|---|
BUILD_EXPRESSION | true | false |
ENVIRONMENT_TEST_FLAG | ‘NO’ | ‘YES’ |
DEPLOY_USER | ‘liumiaocn’ | ‘liumiao’ |
执行日志如下所示
liumiaocn:jenkins liumiao$ curl -u $user_passwd ${jenkins_host_url}/job/pipeline_job_when/2/consoleText
Started by user root
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /data/jenkins/workspace/pipeline_job_when
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Init)
[Pipeline] script
[Pipeline] {
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
Stage "Build" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] sh
+ echo Test stage ...
Test stage ...
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
Stage "Deploy" skipped due to when conditional
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
liumiaocn:jenkins liumiao$
页面结果如下所示
总结
when可以用于多种情况下的条件判断,这篇文章以expression、environment和equals为例介绍了常见的使用方式,需要注意的是environment的环境变量和其他变量不同的地方,声明的地方在stages块之外。
Jenkins基础:Jenkinsfile使用实例:5:使用when进行条件分支处理相关推荐
- Jenkins基础:Jenkinsfile使用实例:12:使用docker.build构建镜像
在前面一篇文章中我们介绍了使用在Jenkinsfile中使用dockerfile来动态生成镜像,从而在指定的阶段进行使用.而对于将构建生成的二进制应用进行容器化,比如将spring boot应用的ja ...
- Jenkins基础:Jenkinsfile使用实例:14:使用docker.image进行容器部署
在上一篇文章中我们介绍了在Jenkinsfile中镜像推送至本地私库或者dockerhub的方法,这篇文章将继续介绍如何使用docker.image将容器运行起来. 环境准备 本文使用Easypack ...
- Jenkins 安装与使用--实例
參考了博客Jenkins master在windows上安装 Jenkins的主要功能是监视反复工作的运行,比如软件project的构建详细地: *软件的持续构建和測试 本质上提供了一个易于使用的持续 ...
- Jenkins基础:使用NPM构建前端应用6:部署前端镜像
在前一篇文章中介绍了在Jenkins中利用NodeJS插件实现创建.编译.镜像生成以及私库推送的Angular的应用的过程,这篇文章将进一步延伸,将生成的镜像直接运行起来. 基础知识 如果对于Node ...
- PySide2 基础入门-创建实例窗口(详细解释)
PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...
- SonarQube4.4+Jenkins进行代码检查实例之三-单元测试分析
作者:张克强 作者微博:张克强-敏捷307 在 <SonarQube4.4+Jenkins进行代码检查实例之一> 中介绍了不编译只检查的方式. 在<SonarQube4.4+J ...
- SonarQube4.4+Jenkins进行代码检查实例之二
在 <SonarQube4.4+Jenkins进行代码检查实例之一> 中介绍了不编译只检查的方式. 但是有些代码检查需要使用字节码,比如Findbugs的检查依赖于字节码,实例一中只提取源 ...
- Jenkins 基础入门
原文地址:Jenkins 基础入门 博客地址:http://www.extlight.com 一.前言 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作, ...
- python语言的数据类型图解_Python基础——数据类型(图解+实例,非常详细!)
Python基础--数据类型(图解+实例,非常详细!) Python基础--数据类型(图解+实例,非常详细!) 内容及版权声明:笔记是根据开课吧--Python语法爬虫分析课和自己的理解记录,其中包含 ...
最新文章
- 猎豹MFC--列表控件ListControl
- [转载]如何在只能力加载的有限元程序里面实现按位移加载
- c语言消字母游戏实验报告,C语言编程实验报告格式示例
- Faster-rcnn详解
- nand flash坏块管理OOB,BBT,ECC
- C语言 1A gt $20,C语言输出 1到20 的阶乘之和
- golang byte转string_golang版memcached之groupcache缓存入门
- PartitionAssignor分析
- 请求失败或服务器为及时响应,SQLServer(MSSQLSERVER)请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。...
- hexo next 主题安装 livere 评论插件
- Java编写HTTP请求发送XML报文数据
- linux设置汉语输入法,在Deepin系统下使用韩语(韩文)输入法的方法
- 如何把 json对象转换成 数组
- 色彩处理的5大颜色空间和区别
- 微信小程序跳转美团饿了么指定商家
- C++ 复数计算器 简单代码
- AI绘图原理:让机器也拥有绘画的灵魂
- 循环调用scrapy框架出现的问题:twisted.internet.error.ReactorNotRestartable,解决方法
- Glide加载网络图片模糊变形问题解决办法
- 数据结构与算法——迷宫问题