如果节点离线,跳过 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()
有一个管道调用。
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 {
...
}
}
}
}
我有一个 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()
有一个管道调用。
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 {
...
}
}
}
}