You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 16:15:09