Jenkins中如何配置Job A成功后次日8点触发Job B的条件?
嗨,这个需求我之前帮不少人解决过,Jenkins里有几种靠谱的实现方式,我给你整理了最实用的两个方案,按需选择就行:
方案一:Freestyle项目结合Groovy脚本(适合传统Freestyle任务)
如果你的Job A是Freestyle类型,咱们可以借助Groovy脚本计算延迟时间,然后触发Job B在次日8点执行:
- 先安装必要插件:确保Jenkins已经安装了
Groovy Postbuild Plugin(用来执行Groovy脚本) - 配置Job A的Post-build Actions:
- 进入Job A的配置页面,拉到「Post-build Actions」区域,点击「Add post-build action」选择「Execute Groovy script」
- 在脚本框里粘贴下面的代码,注意把
"Job B"改成你实际的任务名称(如果任务在文件夹里,要写完整路径比如"MyFolder/Job B"):import java.util.Calendar // 获取当前时间和次日8点的时间对象 def now = Calendar.getInstance() def tomorrow8 = Calendar.getInstance() tomorrow8.set(Calendar.HOUR_OF_DAY, 8) tomorrow8.set(Calendar.MINUTE, 0) tomorrow8.set(Calendar.SECOND, 0) // 如果当前时间已经过了8点,就把目标时间设为明天的8点 if (now.after(tomorrow8)) { tomorrow8.add(Calendar.DAY_OF_MONTH, 1) } // 计算需要延迟的秒数 def delayMillis = tomorrow8.getTimeInMillis() - now.getTimeInMillis() def delaySeconds = delayMillis / 1000 // 触发Job B的延迟构建 def job = Jenkins.instance.getItemByFullName("Job B") def cause = new hudson.model.Cause.UpstreamCause(build) job.scheduleBuild2((int)delaySeconds, cause) println "已成功调度Job B在 ${tomorrow8.getTime()} 执行,延迟时长:${delaySeconds} 秒"
- 处理脚本权限:第一次运行这个脚本可能会被Jenkins拦截,你需要进入「Manage Jenkins」→「In-process Script Approval」,批准脚本中用到的方法权限。
方案二:Jenkins Pipeline(推荐,更灵活易维护)
如果Job A是Pipeline项目,直接在Pipeline脚本的post成功阶段添加调度逻辑就好,代码更直观:
pipeline { agent any stages { stage('Job A构建') { steps { // 这里写你的Job A构建步骤 echo '正在执行Job A的构建任务...' } } } post { success { script { import java.util.Calendar def now = Calendar.getInstance() def targetTime = Calendar.getInstance() // 设置目标时间为上午8点 targetTime.set(Calendar.HOUR_OF_DAY, 8) targetTime.set(Calendar.MINUTE, 0) targetTime.set(Calendar.SECOND, 0) // 如果当前时间已经过了8点,就把目标时间往后推一天 if (now.after(targetTime)) { targetTime.add(Calendar.DAY_OF_MONTH, 1) } // 计算延迟秒数 def delaySeconds = (targetTime.timeInMillis - now.timeInMillis) / 1000 echo "即将调度Job B在 ${targetTime.time} 执行,延迟:${delaySeconds.intValue()} 秒" // 触发Job B,quietPeriod参数就是延迟的秒数 build job: 'Job B', wait: false, quietPeriod: delaySeconds.intValue() } } } }
注意事项
- 确保Jenkins服务在调度期间不会重启,否则未执行的延迟任务会丢失。如果担心这个问题,可以安装
Persistent Queue Plugin来持久化待执行的任务。 - 脚本中的任务名称必须和Jenkins里的Job B完全一致,包括所在的文件夹路径。
- 如果需要给Job B传递参数,可以在
build方法里添加parameters参数,比如parameters: [[$class: 'StringParameterValue', name: 'PARAM_NAME', value: 'PARAM_VALUE']]
内容的提问来源于stack exchange,提问作者Dheeraj
相关产品推荐
相关产品推荐

