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

Jenkins中如何配置Job A成功后次日8点触发Job B的条件?

嗨,这个需求我之前帮不少人解决过,Jenkins里有几种靠谱的实现方式,我给你整理了最实用的两个方案,按需选择就行:

方案一:Freestyle项目结合Groovy脚本(适合传统Freestyle任务)

如果你的Job A是Freestyle类型,咱们可以借助Groovy脚本计算延迟时间,然后触发Job B在次日8点执行:

  1. 先安装必要插件:确保Jenkins已经安装了 Groovy Postbuild Plugin(用来执行Groovy脚本)
  2. 配置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} 秒"
      
  3. 处理脚本权限:第一次运行这个脚本可能会被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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:37:13