Jenkins - 你能在下班后触发一次 stage/step 并且只触发一次(不是每天)吗?

Jenkins - Can you trigger a stage/step after working hours and only once (not everyday)?

我有一个相当大的存储库并且需要包括静态分析,因为对于正常工作日来说它花费的时间太长(大约 4 小时)我们有一个 cron 设置来每天早上自动触发构建纯粹是为了执行静态分析阶段和我们设置它的方式它只在代码发生变化时才进行静态分析,否则静态分析就变得多余了。

问题在于 cron,因为它每天都在设置,我们现在正在丢失构建历史和工件。

我试过有条件地设置 cron,但这似乎没有用,因为它应该在今天早上触发构建,但没有。

triggers {
    cron ( checkBuildStatus() )
}

def checkBuildStatus(){
    if (currentBuild.changeSets.size() > 0){
        return '0 4 * * 1-5 ' 
    }
    else  {
        return ''
    }
}

即使上述实施有效,我仍然不相信它会解决我的“空”构建问题。

有没有办法在下班后触发一次 stage/step,并且只触发一次(不是每天)?

任何建议将不胜感激。

好吧,我们可以尝试用另一种方式解决这个问题。

  1. 让我们再创造一份工作,例如cron触发器。该作业仅通过静态分析触发外部作业。
if (currentBuild.changeSets.size() > 0) {
    build(job: externalJobName, parameters: []) // run another job
}
  1. 您可以保留更多构建。这也可能改变

我决定改变我的方法并找到最佳解决方案。我创建了一个方法,它首先检查当前版本和之前版本之间的代码是否有变化,同时检查分支名称是否为'master'。然后我继续检查星期几并将 cron 设置为第二天(例如,如果构建是在星期一,cron 将设置为星期二早上,然后它将执行静态分析阶段)。现在只有在代码发生变化时才会设置 cron,并且总是只在第二天设置(当然要到下周,但我希望 master 分支至少每周都会有变化,因此重置 cron )

def setCronTrigger(){
    if (currentBuild.changeSets.size() > 0 && BRANCH_NAME.equals('master')){
        Calendar calendar = Calendar.getInstance()
        def day = calendar.get(Calendar.DAY_OF_WEEK)
        cron = '* 4 * * ' + day
        return cron
    }
    else {
        return ''
    }
}