如何在jenkins作业失败时保持资源锁定-可锁定资源

unhi4e5o  于 2023-10-17  发布在  Jenkins
关注(0)|答案(2)|浏览(210)

这是为了测试的目的。我有一个测试平台,在这个环境中部署了几个物理DUT,每次开发人员触发PR时,它都会自动触发jenkins构建固件并部署到我们测试环境中的随机DUT上并执行测试。
我们想要做的是在测试失败时保留DUT,并且我们可以通过锁定资源来避免在该DUT上执行测试。有没有什么方法可以通过lockable-resource来实现?
这是我的测试脚本。

pipeline {
    agent {
        label 'one_slave'
    }
    options {
        lock(resource: "DUT_1", variable: 'LOCKED_RESOURCE', quantity: 1)
    }
    stages{
        stage("test"){
            steps {
                error("Build failed because of this and that..")
            }
        }
    }
    post {
        failure{
            script {
                // To keep the failed DUT locked.
            }
        }
    }
}

我尝试导入org.jenkins.plugins.lockableresources.LockableResourcesManager并使用reserve函数,但得到错误消息`Error when executing failure post condition:

groovy.lang.MissingMethodException: No signature of method: java.lang.Class.reserve() is applicable for argument types: () values: [[resources:DUT_1, userName:Lyndon]]`

我也检查了这篇文章Jenkins lockable resource - lock without unlocking,但我不认为这是同一个场景。我的场景是在构建完成后锁定资源。

nhn9ugyo

nhn9ugyo1#

你几乎就在那里,只是错过了一个参数类型-你试图保留的资源应该被 Package 到一个列表中。Javadocs在这里。

hmmo2u0o

hmmo2u0o2#

在检查了LockableResourcesManager中是否有任何可用的函数可以用于我的情况后,我发现steal可以为我做这件事。https://github.com/jenkinsci/lockable-resources-plugin/blob/3a5c1a140712e4b310e60e9880bcf195fbee674e/src/main/java/org/jenkins/plugins/lockableresources/LockableResourcesManager.java#L801
我的解决方案是

import org.jenkins.plugins.lockableresources.LockableResourcesManager as LRM
import java.time.LocalDateTime

pipeline {
    agent any
    options {
        lock(label: "DUT_1", variable: 'LOCKED_RESOURCE', quantity: 1)
    }
    stages{
        stage("test"){
            steps {
                error("Build failed because of this and that..")
            }
        }
    }
    post {
        failure{
            script {
                LRM lrm = LRM.get()
                resources = lrm.getResources()
                target_resources = resources.findAll {  // since the resource name is unique, this will get the only one resource
                    resource -> resource.getName() == env.LOCKED_RESOURCE
                }
                lrm.steal(target_resources, "${currentBuild.projectName}${currentBuild.displayName}")
                Date date = new Date();
                target_resources[0].setReservedTimestamp(date)
            }
        }
    }
}

因此,在构建完成后,资源将被steal步骤窃取,状态将保持reserved状态,然后我可以手动取消保留它。

相关问题