如果节点离线,跳过 Jenkins 管道步骤

Skip Jenkins Pipeline Steps If Node Is Offline

我有一个 Jenkins Pipeline 作业,在构建的一部分中,它使用了一个停机时间很长的节点。如果节点在线,我希望执行此步骤;如果节点离线,我希望在构建失败的情况下跳过此步骤。

这个是相关的,但是和skipping parts of a Matrix Project的问题不同。

我试过像这样以编程方式检查节点是否在线。

jenkins.model.Nodes.getNode('my-node').toComputer().isOnline()

这与 Jenkins 安全沙箱相冲突:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: unclassified method java.lang.Class getNode java.lang.String

我尝试设置一个超时,如果节点离线,该超时将被触发。

try {
    timeout(time: 10, unit: 'MINUTES') {
        node('my-node') {
            // Do optional step
        }
    }
} catch (e) {
    echo 'Time out on optional step. Node down?'
}

这有一个主要的缺点。我必须知道该步骤需要的最长时间,然后在节点关闭时等待更长时间。我尝试通过 "canary" 步骤解决该问题:

try {
    timeout(time: 1, unit: 'SECONDS') {
        node('my-node') {
            echo 'Node is up. Performing optional step.'
        }
    }
    node('my-node') {
        echo 'This is an optional step.'
    }
} catch (e) {
    echo 'Time out on optional step. Node down?'
}

如果节点启动但忙于另一项工作,则跳过该步骤。这是迄今为止我想出的最好的解决方案。有没有一种方法可以在不使用超时的情况下检查节点是否在线?

这应该有效:

Jenkins.instance.getNode('my-node').toComputer().isOnline()

http://javadoc.jenkins-ci.org/jenkins/model/Jenkins.html

有一个管道调用。

nodesByLabel 'my-node'

Returns [] 如果没有节点在线; returns arraylist 否则为在线实例。

我只是这样做了:

 pipeline {
     agent none
     environment { AGENT_NODE = "somenode" }
     stages {
         stage('Offline Node') {
             when {
                 beforeAgent true
                 expression {
                     return nodesByLabel(env.AGENT_NODE).size() > 0
                 }

             }
             agent {
                  label "${env.AGENT_NODE}"
             }
             steps {
                  ...
             }
         }
     }
}