Jenkins Pipeline中when的用法

news2025/2/26 9:29:53

目录

  • 概述
  • 内置条件
    • branch
    • buildingTag
    • changeset
    • changeRequest
    • equals
    • expression
    • triggeredBy
    • tag
    • environment
    • not
    • allOf
    • anyOf
  • 在进入 stage 的 agent 前评估 when
    • beforeAgent
    • beforeInput
    • beforeOptions
  • 示例
    • 单一条件、声明性流水线
    • 多条件、声明式管道
    • 嵌套条件(与前面的示例行为相同)
    • 多重条件和嵌套条件
    • 表达式条件和嵌套条件
    • beforeAgent
    • beforeInput
    • beforeOptions
    • triggeredBy
    • Groovy正则表达式
  • 扩展

用于学习记录。参考Jenkins官方文档进行翻译补充示例。以英文文档为基准,以中文文档作为辅助。
翻译自:
Jenkins when 英文文档
参考:
Jenkins when 中文文档

概述

When 指令允许 Pipeline 根据给定条件确定是否应执行该阶段。When指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件都必须返回true才能执行该阶段。这与子条件嵌套在 allOf 条件中相同(请参阅下面的示例)。如果使用 anyOf 条件,请注意,一旦找到第一个“true”条件,该条件就会跳过剩余的测试。

可以使用嵌套条件构建更复杂的条件结构:not、allOf 或anyOf。嵌套条件可以嵌套到任意深度。
在这里插入图片描述

内置条件

branch

当正在构建的分支与模式给定的分支匹配时,执行这个阶段, 例如: when { branch 'master' }。注意,这只适用于多分支流水线。

可选参数comparator 可以添加在属性之后,以指定如何评估任何模式的匹配:

  • EQUALS 用于简单的字符串比较
  • GLOB(默认)用于 ANT 样式路径 glob (和下面 changeset的例子一样)
  • REGEXP 用于正则表达式匹配

例如:when { branch pattern: "release-\\d+", comparator: "REGEXP"}

buildingTag

当构建为正在buildingTag时执行该阶段。例如 For example: when { buildingTag() }

changeset

如果构建的 SCM 变更集包含一个或多个与给定模式匹配的文件,则执行该阶段。
例子:
when { changeset "**/*.js" }

changeRequest

如果当前构建是针对“更改请求”(也称为 GitHub 和 Bitbucket 上的拉取请求、GitLab 上的合并请求、Gerrit 中的更改等),则执行该阶段。

当没有传递参数时,该阶段会在每个更改请求上运行,例如:when { changeRequest() }
通过向变更请求添加带有参数的过滤器属性,可以使该阶段仅在匹配的变更请求时运行。可以使用的属性有 id、target、branch、fork、url、title、author、authorDisplayName 和authorEmail。其中每一个都对应于一个CHANGE_*环境变量,
例如:
when { changeRequest target: 'master' }.

可选参数comparator 可以添加在属性之后,以指定如何评估任何模式的匹配:

  • EQUALS 用于简单的字符串比较
  • GLOB(默认)用于 ANT 样式路径 glob (和下面 changeset的例子一样)
  • REGEXP 用于正则表达式匹配

例如:

when { changeRequest authorEmail: "[\\w_-.]+@example.com", comparator: 'REGEXP' }

equals

当期望值等于实际值时执行该阶段,例如:
when { equals expected: 2, actual: currentBuild.number }

expression

当指定的Groovy表达式评估为true时,执行这个阶段, 例如:
when { expression { return params.DEBUG_BUILD } }
注意:
从表达式返回字符串时,必须将它们转换为布尔值或返回null以计算为 false。简单地返回“0”“false”仍将计算为“true”

triggeredBy

触发者 当给定的参数触发当前构建时执行该阶段。例如:

  • when { triggeredBy 'SCMTrigger' }
  • when { triggeredBy 'TimerTrigger' }
  • when { triggeredBy 'BuildUpstreamCause' }
  • when { triggeredBy cause: "UserIdCause", detail: "vlinde" }

tag

如果 TAG_NAME变量与给定模式匹配,则执行该阶段。例如:when { tag "release-*" }
如果提供了空模式,则如果 TAG_NAME 变量存在,则该阶段将执行(与buildingTag() 相同)。

可选参数comparator 可以添加在属性之后,以指定如何评估任何模式的匹配:

  • EQUALS 用于简单的字符串比较
  • GLOB(默认)用于 ANT 样式路径 glob (和下面 changeset的例子一样)
  • REGEXP 用于正则表达式匹配
    比如:
    when { tag pattern: "release-\\d+", comparator: "REGEXP"}

environment

当指定的环境变量是给定的值时,执行这个步骤,
例如: when { environment name: 'DEPLOY_TO', value: 'production' }

not

当嵌套条件是错误时,执行这个阶段,必须包含一个条件,
例如: when { not { branch 'master' } }

allOf

当所有的嵌套条件都正确时,执行这个阶段,必须包含至少一个条件,
例如: when { allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' } }

anyOf

当至少有一个嵌套条件为真时,执行这个阶段,必须包含至少一个条件,
例如: when { anyOf { branch 'master'; branch 'staging' } }

在进入 stage 的 agent 前评估 when

beforeAgent

默认情况下, 如果定义了某个阶段的agent,在进入该stageagent 后该 stage 的 when 条件将会被评估。但是, 可以通过在 when 块中指定 beforeAgent 选项来更改此选项。 如果 beforeAgent 被设置为 true, 那么就会首先对 when 条件进行评估 , 并且只有在 when 条件验证为真时才会进入 agent

beforeInput

在输入指令之前评估when 默认情况下,如果定义了阶段的条件,则在输入之前不会评估阶段的条件。但是,可以通过在when块中指定beforeInput选项来更改这一点。如果beforeInput设置为true,则将首先评估when条件,并且仅当when条件评估为true时才会输入输入。beforeInput true 优先于 beforeAgent true。 在选项指令之前评估when 默认情况下,将在输入该阶段的选项(如果已定义)后评估该阶段的条件。

beforeOptions

但是,可以通过在 when 块中指定 beforeOptions 选项来更改此设置。如果beforeOptions设置为true,则将首先评估when条件,并且仅当when条件评估为true时才会输入选项。

示例

单一条件、声明性流水线

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

多条件、声明式管道

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
                environment name: 'DEPLOY_TO', value: 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

嵌套条件(与前面的示例行为相同)

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                allOf {
                    branch 'production'
                    environment name: 'DEPLOY_TO', value: 'production'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
} 

多重条件和嵌套条件

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                branch 'production'
                anyOf {
                    environment name: 'DEPLOY_TO', value: 'production'
                    environment name: 'DEPLOY_TO', value: 'staging'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

表达式条件和嵌套条件

pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                expression { BRANCH_NAME ==~ /(production|staging)/ }
                anyOf {
                    environment name: 'DEPLOY_TO', value: 'production'
                    environment name: 'DEPLOY_TO', value: 'staging'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

beforeAgent

pipeline {
    agent none
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            agent {
                label "some-label"
            }
            when {
                beforeAgent true
                branch 'production'
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

beforeInput

pipeline {
    agent none
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                beforeInput true
                branch 'production'
            }
            input {
                message "Deploy to production?"
                id "simple-input"
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

beforeOptions

pipeline {
    agent none
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                beforeOptions true
                branch 'testing'
            }
            options {
                lock label: 'testing-deploy-envs', quantity: 1, variable: 'deployEnv'
            }
            steps {
                echo "Deploying to ${deployEnv}"
            }
        }
    }
}

triggeredBy

pipeline {
    agent none
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                triggeredBy "TimerTrigger"
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

Groovy正则表达式

上述内容使用正则表达式部分还可以这样写:

when {
    expression{
        def reg = ~'^v2.*'
        def isMatched = (env.TAG_NAME ==~ reg)
        return isMatched
    }
    beforeAgent true
}

在Jenkins的when语法中,没有直接支持使用正则表达式作为条件的内置功能。但是可以使用Groovy语言的正则表达式功能来实现类似的效果。
下面是一个示例,演示如何在Jenkins的when语法中使用Groovy正则表达式:

when {
    expression {
        return params.BRANCH_NAME ==~ /master.*/
    }
}

在上述示例中,params.BRANCH_NAME是一个构建参数,==~Groovy中用于匹配正则表达式的操作符。正则表达式/master.*/用于匹配以"master"开头的任意字符串。
可以根据需要修改正则表达式以满足匹配要求。
注意:正则表达式的语法可能会因具体的需求而有所不同。在使用正则表达式时,请确保使用适当的语法和模式。
需要注意的是,虽然正则表达式可以在when语法中使用,但它并不是when语法的核心功能。when语法的主要目的是根据条件来控制构建过程的执行,而正则表达式只是其中的一种条件判断方式。

扩展

关于Groovy正则表达式的部分,可以进一步查看:
Groovy-正则表达式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1528598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

综合实验---Web---进阶版

目录 实验配置: 1.PHP调整主配置文件时,修改文件内容 1.原内容调整(在编译安装的情况下) 2.调整如下 3.没有调整的,根据之前配置就行 2.配置Nginx支持PHP解析 1.原内容如下 2.调整如下 3.验证PHP测试页 1.原内容如下 2.调整如下 4…

U盘安装Linux系统报dracut-initqueue错误,解决方案

U盘安装Linux系统报dracut-initqueue错误,是因为系统所在U盘路径不对,需要修改 解决方法: dracut:/# cd dev >dracut:/# ls |grep sdb 查看你的u盘是哪个一般是sdbX,X是一个数字,也有可能是sda等,如果上边都不对…

C语言数据结构基础——二叉树学习笔记(二)topk问题

1.top-k问题 1.1思路分析 TOP-K 问题:即求数据结合中前 K 个最大的元素或者最小的元素,一般情况下数据量都比较大 。 比如:专业前 10 名、世界 500 强、富豪榜、游戏中前 100 的活跃玩家等。 对于 Top-K 问题,能想到的最简单直…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序? 1、找到并打开要添加的小程序; 2、打开小程序后,点击右上角的「…」 3、点击后底部弹窗更多选项,请找到并点击「添加到我的小程序」; 4、添加成功后,就可以在首页下拉我的…

代码随想录算法训练营第二十七天 |131.分割回文串,一些思考

实际上,分割子集问题也是组合问题 (图源代码随想录网站) 一个套路,也就是说,每次递归函数参数列表传入start的时候,选中的元素相当于是在最后面划了一条分割线 回文子串的判断剪枝操作就很简单了&#xf…

AIGC元年大模型发展现状手册

零、AIGC大模型概览 AIGC大模型在人工智能领域取得了重大突破,涵盖了LLM大模型、多模态大模型、图像生成大模型以及视频生成大模型等四种类型。这些模型不仅拓宽了人工智能的应用范围,也提升了其处理复杂任务的能力。a.) LLM大模型通过深度学习和自然语…

什么是闭包?闭包的优缺点?闭包的应用场景?

什么是闭包&#xff1f; 闭包是指有权访问另外一个函数作用域中的变量的函数。 闭包形成的必要条件&#xff1a; 函数嵌套内部函数使用外部函数的变量内部函数作为返回值 举个栗子&#xff1a;实现每隔1s递增打印数字 使用闭包实现 for(var i1; i<5; i) {(function(i) {se…

Cointelegraph 策略主管 JASON CHOI确认出席Hack.Summit() 2024区块链开发者大会

随着区块链技术的蓬勃发展和广泛应用&#xff0c;一场备受瞩目的盛会即将拉开帷幕。Hack.Summit() 2024区块链开发者大会&#xff0c;由Hack VC主办&#xff0c;AltLayer和Berachain协办&#xff0c;Solana、The Graph、Blockchain Academy、ScalingX、0G、SNZ和数码港等机构的…

Python——模块

自定义模块 module_exercise.py文件 data 100 def func01():print("func01执行喽") class Myclass:def func02(self):print("func02执行喽")classmethoddef func03(cls):print("func03执行喽") exercise.py文件 # 调用方法1&#xff1a;&quo…

Unity2D实现鼠标拖动物体移动(简单好抄)

1.新建脚本&#xff0c;并将脚本拖到你想要拖动的物体上即可 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class text : MonoBehaviour {private Vector3 offset;public int x 1;void OnMouseDown(…

入门:vue使用Echarts绘制地图的步骤

匠心接单中...8年前端开发和UI设计接单经验&#xff0c;完工项目1000&#xff0c;持续为友友们分享有价值、有见地的干货观点&#xff0c;有业务需求的老铁&#xff0c;欢迎关注发私信。 安装echarts和echarts-map插件 npm install echarts --save npm install echarts-map --…

深入理解mysql 从入门到精通

1. MySQL结构 由下图可得MySQL的体系构架划分为&#xff1a;1.网络接入层 2.服务层 3.存储引擎层 4.文件系统层 1.网络接入层 提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接&#xff0c;客户端发送SQL到服务端&#xff0c;Java中通过JDBC来实现连接数据库。 …

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

代码随想录day25(2)二叉树:验证二叉搜索树(leetcode98)

题目要求&#xff1a;给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 思路&#xff1a;首先对于二叉搜索树&#xff0c;它的中序遍历是有序的。最简单的想法就是将二叉搜索树转成一个数组&#xff0c;验证数组是否有序就可以&#xff08;二叉搜索树中没有重复…

ResNet模型结构

一、ResNet网路模型 ResNet模型由堆叠残差结构所得到 ResNet34 实线和虚线的残差结构不同&#xff1a; 虚线是conv2_x&#xff0c;conv3_x&#xff0c;conv4_x&#xff0c;conv4_x&#xff0c;第一层的残差结构。要将上一层的残差特征矩阵的尺寸和深度调整为当前层所需要的 二…

Aigtek超声功率放大器产品介绍

超声功率放大器是一种特殊类型的功率放大器&#xff0c;专门用于增强和放大超声信号的功率。它在医疗、工业和科学领域中得到广泛应用。 一、超声功率放大器的基本概述 超声功率放大器是一种能够将低功率超声信号放大到更高功率水平的设备。它是超声系统的关键组成部分&#xf…

OPPO 后端二面,凉凉。。。

美众议院通过 TikTok 法案 之前我们讲了 老美要求字节跳动在 165 天内剥离短视频应用 TikTok&#xff0c;当时的最新进度是 TikTok 给 1.7 亿美国用户发弹窗&#xff0c;发动用户群众给国会打电话进行抗议。 但显然这点力度的抗议并不会造成什么实质影响。 昨晚&#xff0c;美国…

门店运营三大核心揭秘:打造高效盈利模式的关键

在当今竞争激烈的商业环境中&#xff0c;开设一家成功的实体店并非易事。对于那些渴望投身实体店创业或已经在创业道路上的人来说&#xff0c;了解如何打造高效盈利模式是至关重要的。作为一名经营鲜奶吧5年时间的创业者&#xff0c;我将持续在网上分享开店的干货和见解&#x…

MySQL最实用面试题(2024-3-14持续更新中)

MySQL篇面试题 一、介绍 ​ 这是由小龙同学自己总结领悟的mysql面试题的解析&#xff0c;也是面试宝典 二、题目 1.数据库三大范式&#xff1a; –作用&#xff1a; ​ 使表结构清晰&#xff0c;减少数据冗余&#xff08;简单讲就是重复&#xff09;&#xff0c;提高查询…

Kafka:分布式消息队列

1. 简介 介绍 Kafka 的概述、优势和劣势&#xff0c;以及应用场景。 2. 基本概念 2.1 架构 一个典型的 Kafka 体系架构包括若干 Producer、若干Broker、若干 Consumer&#xff0c;以及一个ZooKeeper集群。 ZooKeeper是Kafka用来负责集群元数据的管理、控制器的选举等操作的…