首页 > 解决方案 > Jenkins 在给定的时间间隔触发构建步骤/阶段(不是整个作业)

问题描述

我正在尝试建立一个管道,我需要在其中链接多个作业,其中一些作业必须在某个时间开始。

例如:Job1(从午夜开始)-> Job2 -> Job3 ->Job4(从下午 4 点开始)

使用声明性语法:

pipeline {
    agent any
    stages{
        stage('Fetch Latest Code-1') { 
            steps{
                build job: 'Get Latest - All Nodes', quietPeriod: 60
            }        
        }
        stage('CI Day - 1') {
            parallel {
                stage('ANZ CI'){
                    steps{
                        build job: 'ANZ - CI', quietPeriod: 120    
                    }
                }
                stage('BRZ CI'){
                    steps{
                        build job: 'BRZ_CI', quietPeriod: 120
                    }
                }
                stage('NAM CI'){
                    steps{
                        build job: 'NAM - CI', quietPeriod: 120    
                    }
                }
            }
        }
        stage('BEP Part 2') { 
            steps{
                build job: 'BEP_CI_Verification_Job', quietPeriod: 180
            }        
        }
        stage('Intermediate Results') {
            steps{
                build job: 'CI Automation Results', parameters: [string(name: 'Files', value: '_CI_')], quietPeriod: 300
            }
        }        
    }
}

创建此作业时,我已将作业配置为在午夜 12 点开始。因此,第一个作业会在午夜自动开始。 在此处输入图像描述

但是,我还需要在凌晨 1 点开始第二份工作(CI Day - 1),在下午 6 点开始最后一份工作“中间结果”。

由于这些作业是多配置作业(已经尝试在所需的时间单独设置它们,但在通过管道调用时它们会被覆盖)。

此外,在阶段/步骤中是否尝试过 triggers{ cron(0 1 * * 6) }。没运气!

标签: jenkinscronjenkins-pipelinejenkins-declarative-pipeline

解决方案


这是在一天中的给定时间启动另一项工作的快速想法。使用 Groovy 代码,计算所需启动时间和当前时间之间的秒差,并将其用作参数的quietPeriod参数。

如果您收到错误“不允许使用脚本的方法”,则必须使用“管理 Jenkins”>“进行中的脚本批准”来批准方法。

import groovy.time.*

pipeline {
    agent any
    stages{
        stage('Stage 1') { 
            steps{
                script {
                    def secs = secondsUntil hourOfDay: 15, minute: 30, second: 0
                    echo "anotherjob will be triggered in $secs seconds"

                    build job: 'anotherjob', quietPeriod: secs
                }
            }        
        }
    }
}

long secondsUntil( Map dateProperties ) {
    def now = new Date()
    def to = now.clone()
    to.set( dateProperties )
    long duration = TimeCategory.minus( to, now ).toMilliseconds() / 1000
    return duration > 0 ? duration : 0
}

推荐阅读