繁体   English   中英

詹金斯如何查找给定的奴隶是否正在运行作业

[英]Jenkins How to find if a given slave is running a Job

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

我发现这个答案很有用。

在从另一个项目开始构建之前,如何通过 Jenkins 中的脚本或插件检查从属设备是否在线

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

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

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

taskAccepted()taskCompleted()浮现在脑海中。 一旦任务被接受,我可以将 setAcceptingTasks 调用为 false,并在任务完成后再次将 isAcceptingTasks 设置为 true。

\n

但我不确定这些函数采用的参数,例如执行程序和任务。 这些函数调用在哪里适合一个 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 上繁忙的 executors 的数量。 它不断轮询,直到找到一个忙碌的执行器数量为零的在线从站。 我讨厌投票,并会要求知识渊博的成员提供建议,以某种方式插入基于 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)
}

这作为作业运行,并在找到合适的从站后立即返回。 Return 0 在 Jenkins 中是成功的。

如果有更好的方法,请参与。我对这种必须进行的连续投票并不满意。 我也不是执行者的专家。 所以如果有任何缺陷,请纠正我。

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

每个节点存储与它是否相关的信息,例如:空闲与否,离线与否等。

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

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"]'

要获取正在运行当前构建的节点的名称,只需使用 System.getenv("NODE_NAME")

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

您可能会发现这些变量非常有用。 检查此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM