Jenkins Declarative Pipeline如何按周期触发指定Stage单独运行
问题解答
该需求完全可以实现,最优方案基于Jenkins原生能力实现,无需安装额外插件,核心思路是「全局配置定时触发器+Stage层级匹配触发原因」,仅当构建为定时触发时执行指定的耗时Stage,其余场景自动跳过。
实现原理
Jenkins会为每一次构建记录完整的触发来源,定时触发的构建对应的触发类型为hudson.triggers.TimerTrigger$TimerTriggerCause,我们只需要给耗时Stage添加when条件,匹配该触发类型即可实现规则过滤。
现有代码问题修正
你当前的代码存在两处语法错误需要调整:
triggers是Pipeline全局配置项,不能定义在单个Stage内部,写在Stage里的定时规则不会生效- 你定义了两个重名的
Stage 2,会触发流水线校验报错,需要修改为不同的Stage名称
完整实现代码示例
pipeline { agent any // 全局配置定时触发器:H为哈希散列值,避免所有任务同时触发压垮服务器 // 示例为每日凌晨执行,如需固定时间比如凌晨2点可修改为 H 2 * * * triggers { cron('H H * * *') } stages { stage('Stage 1') { steps { script { // do something } } } stage('耗时Stage 2') { // 仅当构建为定时触发时,才执行该Stage when { expression { return currentBuild.buildCauses.any { it instanceof hudson.triggers.TimerTrigger$TimerTriggerCause } } } steps { script { // do something } } } stage('Stage 3') { steps { script { // do something } } } } }
可选扩展配置
如果后续需要支持「定时触发+手动指定参数时也可执行该Stage」,可以修改when条件增加参数判断:
// 先在流水线参数中新增布尔参数 RUN_LONG_STAGE,手动触发时勾选即可执行耗时Stage when { anyOf { expression { return currentBuild.buildCauses.any { it instanceof hudson.triggers.TimerTrigger$TimerTriggerCause } } expression { params.RUN_LONG_STAGE == true } } }
内容的提问来源于stack exchange,提问作者semural
相关产品推荐
相关产品推荐

