如何通过Jenkins声明式流水线调度目标任务在特定时间运行
Jenkins声明式流水线定时触发带参任务的正确姿势
问题还原
你当前的流水线配置如下:
pipeline { agent any triggers { cron('H 6 8 * *') } stages { stage('Remove old AMIs from account 1') { steps { script { b = build(job: 'another job', parameters: [string(name: 'ACCOUNT', value: 'account1')]) // some other parameters } } } stage('Remove old AMIs from account 2') // ... removed for brevity } }
这个配置的问题是:手动启动主流水线时会立即触发another job,每月8日6点左右也会触发主流水线,进而执行所有stage触发目标任务。但你需要的是仅让another job在特定时间按指定参数运行,主流水线无需被定时触发或手动启动时立即执行。
解决方案
方案1:直接给目标任务配置定时+参数化
这是最直接的方式,不需要依赖主流水线:
- 进入
another job的配置页面,开启参数化构建过程,添加ACCOUNT等所需参数; - 添加定时触发器(Cron),设置调度规则(比如
H 6 8 * *)。如果需要给不同账号分别定时,可使用Parameterized Scheduler插件,支持在单个定时规则里传递不同参数,或者创建多个定时规则对应不同参数值。
方案2:改造主流水线,仅定时触发时执行build
如果必须通过主流水线来触发,可通过条件判断限制执行时机:
pipeline { agent any triggers { cron('H 6 8 * *') } stages { stage('Remove old AMIs from account 1') { // 仅当定时触发时才执行此stage when { triggeredBy 'TimerTrigger' } steps { script { build(job: 'another job', parameters: [string(name: 'ACCOUNT', value: 'account1')]) // 其他参数配置 } } } stage('Remove old AMIs from account 2') { when { triggeredBy 'TimerTrigger' } steps { // 账号2对应的build逻辑 } } } }
这样手动启动主流水线时,所有stage会因为不满足triggeredBy 'TimerTrigger'条件而跳过,只有定时触发时才会执行build步骤,触发目标任务。
关于你的疑问
build步骤里不能配置triggers参数,build的作用是立即触发指定任务,它没有定时触发相关的配置项。定时触发的逻辑只能在任务自身的触发器配置中设置,或者通过主流水线的定时+条件判断来间接实现。
内容的提问来源于stack exchange,提问作者Steve Button
相关产品推荐
相关产品推荐

