Jenkins如何查找给定的从属是否正在运行作业

发布于 2021-01-31 22:38:41

我有这个独特的要求来检查给定的节点是否正在运行作业。我正在考虑使用groovy,因为它看起来是最简单的选择。

它使我能够找到从站是否在线。对我来说,下一步是检查它是否正在运行作业。

我正在考虑使用API函数setAcceptingTasks(false)来将slave标记为正在运行作业,以便下次当我使用isAcceptingTasks()查询时,我会得到false,因此不会在该slave上启动job。

但是我宁愿有奴隶标记本身。

我想到了taskAccepted()taskCompleted()
一旦任务被接受,我就可以将setAcceptingTasks设置为false,并在完成任务后再次将isAcceptingTasks设置为true。

但是我不确定这些函数采用的参数,例如执行器和任务。这些函数调用在哪里适合普通脚本。

我不确定任务的假设是否等同于工作是否正确。

这是我到目前为止所得到的:

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。

关注者
0
被浏览
240
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    这是我能够做到的骇人听闻的方式。我更改了工作流程,以找到可用的空闲从服务器,而不是查找从服务器是否忙,然后检查下一个从服务器是否空闲。这个常规脚本计算从站上繁忙执行程序的数量。它不断轮询,直到找到一个在线奴隶,其繁忙的执行者数量为零。我讨厌投票,并会要求知识渊博的会员加入,并提出一些建议以某种方式插入基于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)
    }
    

    它作为作业运行,并在找到合适的从站后立即返回。在詹金斯,返回0是成功的。

    如果有更好的方法,请加入。对于必须进行的连续轮询,我并不满意。我也不是执行人专家。因此,如果存在任何缺陷,请纠正我。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看