计划的(cron)Jenkins作业是否可以访问以前的作业状态

e4yzc0pl  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(186)

下面是一个简化的例子。我有一个名为comp 01的节点。我有一个名为Compatibility的Jenkins作业。

兼容性计划如下:

0 12 * * 1 %IntegrationNode=Software_1
0 17 * * 1 %IntegrationNode=Software_2
0 22 * * 1 %IntegrationNode=Software_3
0 2 * * 2 %IntegrationNode=Software_4
0 7 * * 2 %IntegrationNode=Software_5

作业按计划开始。但有时,由于某些验证失败,前一个作业花费的时间比预期的要长。因此,下一个作业在前一个作业完成之前开始。
在Jenkins中有没有一种方法可以让下一个已排程的工作留在队列中,直到前一个工作完成为止?或者我们可以根据前一个工作的状态来排程?

  • 我们已尝试限制此作业的执行程序,但当多个作业排队时,将无法观察到预期的行为。
  • 我们也尝试过创建资源组并向其添加多个节点,但当队列中有多个作业时,仍然无法观察到预期的行为。
    **EDIT-1:**我们不能使用options { disableConcurrentBuilds() },因为我们在不同的节点上并发启动作业。在这里,我们要努力确保在某个节点上启动作业时,同一节点的其他已调度作业应等待当前作业完成。
ncgqoxb0

ncgqoxb01#

您是否尝试过设置以下选项?

options { disableConcurrentBuilds() }

更新

AFAIK对于你的问题没有带外解决方案。但是你肯定可以实现一些东西。没有看到你的实际管道,我不能给予一个具体的答案。但是这里有一些选择。

选项01

使用Lockable Resources并为每个Jenkins IntegrationNode创建一个资源,并在运行作业时获取该资源,下一个构建将等待,直到释放锁。

lock(resource: 'IntegrationNode1', skipIfLocked: false) {
    echo "Run your logic"  
}

选项02您可以实现等待逻辑以检查上一个生成的状态。下面是一个示例管道和可能的Groovy代码,您可以利用它们。

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                script {
                        echo "Waiting"
                        def jobName = "JobA"
                        def buildNum = "92"
                        waitUntil { !isPending(jobName, buildNum) }

                        echo "Actual Run"
                    }

               }
            }

        }
}

def isPending(def JobName, def buildNumber) {
    def buildA = Jenkins.instance.getItemByFullName(JobName).getBuild(buildNumber)
    return buildA.isInProgress()
}

相关问题