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

时间:2014-11-26 06:30:02

标签: java groovy jenkins

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

我发现这个答案很有用。

How can I check via a script or a plugin in Jenkins whether a slave is online before starting a build from another project on it

它允许我查找奴隶是否在线。我的下一步是检查它是否正在运行一个作业。

我正在考虑使用API函数setAcceptingTasks(false)将slave标记为运行Job,以便下次使用isAcceptingTasks()进行查询时,我会得到false,因此无法启动作业奴隶。

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

想到了{p> 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.

3 个答案:

答案 0 :(得分:7)

这是我能够做到的hackish方式。我改变了我的工作流程以找到可用的免费奴隶而不是查找奴隶是否正忙,然后检查下一个看到它是免费的。 这个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)
}

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

如果有更好的方法,请填写。我对这个必须进行的连续民意调查并不满意。 我也不是遗嘱执行人的专家。所以如果存在任何缺陷,请纠正我。

答案 1 :(得分:0)

要获取运行当前版本的节点的名称,只需使用System.getenv(“NODE_NAME”)

  

当Jenkins作业执行时,它会设置一些环境变量..

您可能会发现这些变量非常有用。查看this link

答案 2 :(得分:0)

让我提出一种非常简单有效的方法

每个节点都存储与以下示例有关的信息:是否空闲,是否离线等

您可以使用以下命令获取这些详细信息

curl -X GET --silent -u jenkins_user:${jenkins_pwd} "http://your_jenkins_url:8080/computer/node_name/api/json"

或直接从浏览器

http://your_jenkins_url:8080/computer/node_name/api/jso

此结果提供了与奴隶有关的有价值的信息。

如果您希望将搜索范围缩小到特定的内容,例如,从属是否空闲,则可以在其后面附加以下逻辑

curl -X GET --silent -u jenkins_user:${jenkins_pwd} "http://jenkins_domanin:8080/computer/node_name/api/json" | python -c 'import json,sys,os;obj=json.load(sys.stdin);print obj["idle"]'