簡體   English   中英

從隊列 ID 中獲取 Jenkins 作業構建 ID

[英]Get Jenkins Job Build ID from Queue ID

我成功地能夠使用它來啟動 Jenkins 工作:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

我還可以使用以下方法從這項工作中獲取 consoleText:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/lastBuild/consoleText"

但是,如果我背靠背運行多個作業,這不會擴展。 我注意到第一個 curl 命令的返回包括:

Location: http://jenkins_srv:8080/queue/item/123/

我假設123是作業隊列 ID。

我的問題是,如果我將作業121122123背靠背排隊,我用什么來檢查作業隊列項122的狀態? 另外,我用什么來確定最終由作業隊列項122產生的實際構建 ID?

我選擇了 Kdawg 的答案,因為它幫助我朝着我需要的方向前進。 謝謝!

我還包括我自己的答案,因為我實施的解決方案與 Kdawg 的答案不同,我覺得它會為其他人增加價值。

首先,我是詹金斯的新手。 所以如果我說錯了,請隨時糾正我。 其次,我有一個輕微的學習曲線,因為 Jenkins“隊列項目”和 Jenkins“構建工作”之間存在差異。 創建“隊列項”的那一刻,就沒有“構建作業”ID,因為沒有構建作業開始。 此外,一旦構建作業開始,隊列項在刪除前有 5 分鍾的時間。

當我執行這些任務時:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass
curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

Jenkins 將安排 3 個構建作業在隊列中運行。 這些將是“隊列項目”。 這些“隊列項目”將具有“隊列 ID”。 在我的原始問題中給出的示例中,假設這三個 curl 命令使用“隊列 ID” 121122123創建“隊列項”。

為什么這很重要?

因為根據 Jenkins 服務器的負載,排隊的項目可能會也可能不會立即運行。 如果它立即運行,那么 Kdawg 的答案肯定是正確的。 運行他的命令:

curl -X GET http://jenkins_srv:8080/queue/item/121/api/json?pretty=true --user name:pass
curl -X GET http://jenkins_srv:8080/queue/item/122/api/json?pretty=true --user name:pass
curl -X GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true --user name:pass

這將獲得有關每個“隊列項”的隊列信息,並且在返回的內容中,如果構建作業已經開始,肯定有一種方法可以獲得“構建作業”ID。 如果構建作業尚未開始,則此信息將為空白。

這是我覺得增加價值的附加部分。

構建作業開始后,Kdawg 的回答中的信息將填充到三個curl -X GET命令的響應中。 此外,默認情況下,Jenkins 旨在每 5 分鍾清除一次(垃圾收集,選擇您自己的術語)“隊列項”。 因此,換句話說,如果您擁有的只是“隊列項”ID 並且 5 分鍾數據保留窗口過去了,那么您需要另一種機制來從“隊列項”ID 中獲取“構建作業”ID。

因此,就我而言,我使用 Jenkins 作為前端,使用 Ansible 作為后端來執行服務器配置和應用程序部署。 其中一些應用程序部署可能需要 30 分鍾或更長時間,遠遠超過“隊列項目”的 5 分鍾數據保留期。

所以我必須解決的問題是,如果我只有一個“隊列項目”ID,那么我如何找到“構建作業”ID,無論我什么時候檢查,幾秒鍾后或幾小時后?

這是我的解決方案(請注意,我需要 XML 輸出,僅供參考)。

我運行了這個命令:

curl -X POST "http://jenkins_srv:8080/job/MY_JOB/buildwithParameters?this=1&that=2" --user name:pass

此命令將返回以下信息:

Runtime responseHeaders Date: Day, ## Non Year xx:yy:zz GMT
X-Content-Type-Options: nosniff
Location: http://jenkins_srv:port/queue/item/123/
Content-Length: 0
Server: Jetty(9.4.z-SNAPSHOT)

從這里,我可以從Location字段中解析出123

然后我睡了10秒鍾。 睡眠后,我在 10 秒的循環中運行此命令:

curl -X GET http://jenkins_srv:8080/queue/item/123/api/xml

我這樣做直到我:

  1. 我得到了一個隊列項返回,其中包括 Kdawg 示例中顯示的 xpath //executable/number,或者
  2. 我收到 HTML 404 狀態代碼超過 10 分鍾,這意味着該作業尚未排隊,或者我已超過 5 分鍾的數據保留窗口。

以這種方式的循環處理負擔重的 Jenkins 服務器,該服務器在處理隊列請求時反應遲緩。 所以大概如果我到了 10 分鍾的末尾,那么我的方法仍然會處理我的自動化方法已成功排隊並運行作業的用例,但它正在檢查數據保留窗口之外的 Jenkins。 在這種情況下,我將運行以下命令:

curl -X GET http://jenkins_srv:port/job/MY_JOB/api/xml?tree=builds[id,number,result,queueId]&xpath=//build[queueId=123]

這將返回包含queueId123任何“構建作業”的 XML 信息,如下所示:

<?xml version="1.0"?>
    <build _class="hudson.model.FreeStyleBuild">
        <id>456</id>
        <number>456</number>
        <queueId>123</queueId>
        <result>SUCCESS</result>
    </build>

通過這種方式,我能夠權威地獲得一個“構建作業”ID,而只有一個“隊列項”ID,而不管我開始和檢查之間的時間差。

假設你有一個位置http://jenkins_srv:8080/queue/item/123/ ,你可以GET http://jenkins_srv:8080/queue/item/123/api/json?pretty=true來返回有關的信息該隊列項(如果您不關心格式,您也可以不包含?pretty=true ,或者如果您想要 XML 格式的結果,則使用api/xml )。

我不知道是否有關於隊列 API 的標准文檔,但似乎如果隊列項已完成(也許當前正在構建?)它將有一個executable節點。 我的服務器的一個看起來像這樣:

"executable" : {
    "_class" : "org.jenkinsci.plugins.workflow.job.WorkflowRun",
    "number" : 10,
    "url" : "http://192.168.99.100:32769/job/configure/10/"
}

然后,您可以為executable.url指定的 URL GET API。 就我而言, GET http://192.168.99.100:32769/job/configure/10/api/json?pretty=true 從那里,您應該擁有所需的所有信息,包括當前是否正在構建構建、構建花費/已經花費了多長時間、結果等。

此外,如果您想了解整個構建隊列的信息,您可以GET http://jenkins_srv:8080/queue/api/json?pretty=true

令人驚訝的是 Jenkins 沒有使用唯一 ID 跟蹤請求到其結論。

在排隊項和構建項之間持續存在的一個元素是參數列表。 如果您有能力/權限更改作業的配置,則添加客戶端從空中提取的可選參數 REQUEST_ID(例如 UUID)並通過 REST 傳遞。 然后,您可以測驗隊列並查找具有您的 REQUEST_ID 的那個,並且您可以測驗構建列表並查找具有您的 REQUEST_ID 的那個。

有一個有趣的事情是,如果您想在循環中對多個構建進行排隊,您最終可能會得到相同的 QUEUE_ID,尤其是當您具有相同的參數並且排隊的構建尚未啟動時,會發生這種情況。 基本上,Jenkins 假設您只是在嘗試構建它,而不是多個構建,它只是假設它只需要啟動一個構建,因此使用相同的 QUEUE_ID,為了克服這個問題,如果您在構建作業時添加額外的參數像 UQ_ID=CURRENT_TIMESTAMP (此參數不需要在構建中)然后您將獲得唯一的構建號

如果構建中根本沒有參數,您應該至少定義一個參數,因為無參數構建不允許在 api 中傳遞任何參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM