如何根据指定的条件进行不同的逻辑处理,这是很多场景中需要碰到的情况。将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版,环境准备请参看
获取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"