我有一个独特的要求来检查给定节点是否正在运行作业。我正在考虑使用 groovy,因为它看起来是最简单的选择。
我发现这个答案很有用。
它可以让我知道从站是否在线。我的下一步是检查它是否正在运行作业。
我正在考虑使用 API功能setAcceptingTasks(false)将从站标记为正在运行作业,以便下次我使用 isAcceptingTasks() 进行查询时,我得到错误,因此不会在该奴隶上启 Action 业。
但我宁愿拥有奴隶标记本身。
taskAccepted()和 taskCompleted()浮现在脑海中。 一旦接受任务,我可以将 setAcceptingTasks 调用为 false,并在任务完成后再次将 isAcceptingTasks 设置为 true。 罢工>
但我不确定这些函数采用的参数,例如执行器和任务。这些函数调用适合在 groovy 脚本中的什么位置。
我不确定我承担的任务是否等同于工作是否真实。
这是我到目前为止所得到的:
import hudson.model.*
def requiredNodes = ['Slave1', 'Slave2', 'Slave3'];
def status = 0;
for (node in requiredNodes)
{
println "Searching for $node";
slave = Hudson.instance.slaves.find({it.name == node});
if (slave != null)
{
computer = slave.getComputer();
if (computer.isOffline())
{
println "Error! $node is offline.";
status = 1;
}
else
{
println "OK: $node is online";
if(computer.isAcceptingTasks())
{
//Launch job
}
}
}
else
{
println "Slave $node not found!";
status = 1;
}
}
status;
编辑:每个从属设备上的执行器数量为 1。
最佳答案
这是我能够做到这一点的黑客方式。我更改了工作流程以查找可用的空闲从属设备,而不是查找从属设备是否繁忙,然后检查下一个从属设备是否空闲。
这个 Groovy 脚本计算 Slave 上繁忙执行器的数量。它不断轮询,直到找到一个繁忙执行器数量为零的在线从站。我讨厌投票,并会请求知识渊博的成员提出建议,以某种方式插入 Jenkins 基于事件的通知。
import hudson.FilePath
import hudson.model.Node
import hudson.model.Slave
import jenkins.model.Jenkins
import groovy.time.*
Jenkins jenkins = Jenkins.instance
def jenkinsNodes =jenkins.nodes
while(1)
{
for (Node node in jenkinsNodes)
{
sleep(1000)
// Make sure slave is online
if (!node.getComputer().isOffline())
{
//Make sure that the slave busy executor number is 0.
if(node.getComputer().countBusy()==0)
{
println "'$node.nodeName' can take jobs !!!"
return 0
}
else
{
println "$node.nodeName' is busy !!!"
}
}
else
{
println "'$node.nodeName' is offline !!!"
}
}
sleep(1000)
}
这作为作业运行,并在找到合适的从站后立即返回。在 Jenkins 中返回 0 表示成功。
我愿意接受更好的方法。我对我必须做的这种连续民意调查并不满意。
关于java - Jenkins 如何查找给定的从属设备是否正在运行作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27142674/