我有一个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?'
}
如果节点已启动但正忙于其他作业,则会跳过该步骤。这是我迄今为止提出的最佳解决方案。有没有办法检查节点是否在线而不使用超时?
答案 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 {
...
}
}
}
}