簡體   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