如果节点脱机,请跳过Jenkins管道步骤

时间:2016-07-06 19:04:03

标签: jenkins jenkins-pipeline

我有一个Jenkins管道作业,对于部分构建,它使用一个具有大量停机时间的节点。如果节点处于联机状态并且在节点离线时跳过而没有使构建失败,我希望执行此步骤。

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

我尝试以编程方式检查节点是否在线状态。

awk -F"," '{ if(NF > 5) printf("Filename: %s  Index: %d Number of commas : %d\n",FILENAME,NR, NF-1); }' dsc* >> filename.csv

这对抗Jenkins安全沙箱:

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

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

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?'
}

如果节点已启动但正忙于其他作业,则会跳过该步骤。这是我迄今为止提出的最佳解决方案。有没有办法检查节点是否在线而不使用超时?

3 个答案:

答案 0 :(得分:6)

这应该有效:

Enum a => Enum (Sum a)

请参阅{{3}}

答案 1 :(得分:4)

对此有一个管道调用。

nodesByLabel 'my-node'

如果没有节点在线则返回[];否则返回arraylist以及在线实例。

答案 2 :(得分:0)

我只是这样做了:

 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 {
                  ...
             }
         }
     }
}