我有一個 Jenkins 管道,我想在引數指定的代理或master. 實作這一點的管道代碼是:
pipeline {
agent { label "${params.agent} || master" }
...
}
從以下帖子中,我推測||操作員需要在(雙)引號內:
我可以在宣告性 Jenkins 管道中定義多個代理標簽嗎?
https://serverfault.com/questions/1074089/how-to-apply-multiple-labels-to-jenkins-nodes
Jenkinsfile - 匹配多個標簽的代理
當我運行這項作業時,它似乎總是在master.
當我在陳述句中切換${params.agent}and的順序時,它似乎仍然總是在.
如果我從陳述句中洗掉“”,則作業在-specified 代理上運行。masteragentmaster || masteragentparams
問題:我觀察到 Jenkins“更喜歡”master是巧合,還是讓 Jenkins 默認的語法有問題master?
有沒有辦法讓詹金斯更喜歡非主人,這樣我就可以測驗agent宣告的有效性?
uj5u.com熱心網友回復:
所以,當詹金斯遇到線
agent { label "${params.agent} || master" }
它將執行以下操作之一:
- 將您的作業安排在與該標簽匹配的節點之一上;要么
- 卡住,直到有一個與該標簽匹配的節點,或者直到中止。
關于選項 1,不能保證它會進行回圈、隨機選擇,或者更喜歡某些節點而不是其他節點,等等。實際上,當多個節點匹配時,Jenkins 會更喜歡運行管道的節點在過去。這是一種合理的行為——如果該節點上已經有作業空間,則某些操作(如git checkout)可能會發生得更快,從而節省時間。
關于選項2,這也是一種合理的行為。我們實際上使用它來在不存在的標簽上安排作業,同時操縱標簽以產生匹配的標簽。
因此,您的語法沒有任何問題,并且 Jenkins 的行為符合設計。
如果你想實作一些自定義規則——比如“總是嘗試不同的節點”,或者“盡可能master少地使用”——你必須撰寫代碼。
示例管道(注意我沒有檢查過):
import hudson.model.Hudson
properties([
parameters([
string(name: 'DEPLOY_ON', defaultValue: 'node_name',
description: 'try to run on this node, or master'),
])
])
resulting_node_name = ''
pipeline {
agent { node { label 'master' } }
stages {
stage ('Do on master') {
steps {
script {
resulting_node_name = params.DEPLOY_ON
// note: this gets node by name, but you can get by label if you wish
def slave = Jenkins.instance.getNode(resulting_node_name)
if (slave == null) {
currentBuild.result = 'FAILURE'
}
def computer = slave.computer
if (computer == null || computer.getChannel() == null || slave.name != params.DEPLOY_ON) {
println "Something wrong with the slave object, setting master"
resulting_node_name = 'master'
}
printSlaveInfo(slave)
computer = null
slave = null
}
}
}
stage('Do on actual node') {
agent { node { label resulting_node_name } }
steps {
script {
println "Running on ${env.NODE_NAME}"
}
}
}
}
}
@NonCPS
def printSlaveInfo(slave) {
// some info that you can use to choose the least-busy, best-equipped, etc.
println('====================')
println('Name: ' slave.name)
println('getLabelString: ' slave.getLabelString())
println('getNumExectutors: ' slave.getNumExecutors())
println('getRemoteFS: ' slave.getRemoteFS())
println('getMode: ' slave.getMode())
println('getRootPath: ' slave.getRootPath())
println('getDescriptor: ' slave.getDescriptor())
println('getComputer: ' slave.getComputer())
def computer = slave.computer
println('\tcomputer.isAcceptingTasks: ' computer.isAcceptingTasks())
println('\tcomputer.isLaunchSupported: ' computer.isLaunchSupported())
println('\tcomputer.getConnectTime: ' computer.getConnectTime())
println('\tcomputer.getDemandStartMilliseconds: ' computer.getDemandStartMilliseconds())
println('\tcomputer.isOffline: ' computer.isOffline())
println('\tcomputer.countBusy: ' computer.countBusy())
println('\tcomputer.getLog: ' computer.getLog())
println('\tcomputer.getBuilds: ' computer.getBuilds())
println('====================')
}
uj5u.com熱心網友回復:
h 管道/作業有一個受信任的代理串列,代理上的更多作業成功,代理位于串列頂部,管道/代理將從串列中選擇頂部代理。
如果你的 pipeline 已經在 master 上運行了幾次并且都成功了,即使你給了另一個 agent 來選擇,pipeline 總是首先選擇最信任的 agent
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454493.html
