如何在詹金斯管道中修复JNLPLauncher异常

Zak*_*akk 5 jenkins jenkins-groovy jenkins-pipeline

我们有使用vSphere的脚本,用于将快照还原到计算机并打开。

然后我们检查代理是否可用,例如:

    def checkAgentAvalability(agName, tolerance) {
    try {
        int sleepTime = 5
        def jenkinsObj = Jenkins.instance.getNode(agName)
        printLogger("INFO", "checkAgentAvalability()  Agent: " + agName + ", tolerance: " + tolerance)
        handleSlaveMode(agName, false)
        sleep (5000)
        for (int i = 0; i < tolerance; i++) {
            if (jenkinsObj.toComputer().isOnline()) {
                if (jenkinsObj.getRootPath() != null && !jenkinsObj.getComputer().getLog().contains('error'))
                {
                    return true
                } else {
                    sleep (5000)
                }
            }
            sleep (5000)
        }
        return false
    }
    catch (err)
    {
        return false
    }
}
Run Code Online (Sandbox Code Playgroud)

我们使用此脚本来启动30台计算机,并准备进行测试。

除了以下例外,我们在随机计算机上遇到了故障:

java.io.NotSerializableException: hudson.slaves.JNLPLauncher
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?我在互联网上找不到根本原因。

如何检查自动创建的代理是否启动?代理启动后,有时我们也会断开连接

谢谢

hak*_*iri 0

您应该使用@NonCPS 注释。一般来说,Jenkins 假设所有对象都是可序列化的,因为它想要暂停/恢复作业。如果不是(例如Computer),他们需要一些特殊的元数据,以便 Jenkins 知道这一点。

@NonCPS
def checkAgentAvalability(agName, tolerance) {
    try {
        ...
Run Code Online (Sandbox Code Playgroud)