刪除所有脫機節點,調整下面的腳本並運行doDelete()只對奴隸其中IsOffline之前()是真還是isOnline()是假的。如果你想刪除所有節點(小心),則不要使用以下如果聲明:
if (aSlave.name.indexOf(slaveStartsWith) == 0) {
我也忽略一個奴隸(如果你想一直忽略的奴隸被刪除)。它可以被增強以使用奴隸列表來忽略。
不管怎麼說,下面的腳本將正常刪除任何詹金斯節點奴隸與給定的名稱開始(讓你有更多的控制),它會下線標記(ASAP),但只有後的任何正在運行的作業刪除( s)在給定的奴隸上是完整的。以爲我應該在這裏分享。
使用詹金斯Scriptler插件,可以導入/上傳/運行此腳本:https://github.com/gigaaks/jenkins-scripts/blob/7eaf41348e886db108bad9a72f876c3827085418/scriptler/disableSlaveNodeStartsWith.groovy
/*** BEGIN META {
"name" : "Disable Jenkins Hudson slaves nodes gracefully for all slaves starting with a given value",
"comment" : "Disables Jenkins Hudson slave nodes gracefully - waits until running jobs are complete.",
"parameters" : [ 'slaveStartsWith'],
"core": "1.350",
"authors" : [
{ name : "GigaAKS" }, { name : "Arun Sangal" }
]
} END META**/
// This scriptler script will mark Jenkins slave nodes offline for all slaves which starts with a given value.
// It will wait for any slave nodes which are running any job(s) and then delete them.
// It requires only one parameter named: slaveStartsWith and value can be passed as: "swarm-".
import java.util.*
import jenkins.model.*
import hudson.model.*
import hudson.slaves.*
def atleastOneSlaveRunnning = true;
def time = new Date().format("HH:mm MM/dd/yy z",TimeZone.getTimeZone("EST"))
while (atleastOneSlaveRunnning) {
//First thing - set the flag to false.
atleastOneSlaveRunnning = false;
time = new Date().format("HH:mm MM/dd/yy z",TimeZone.getTimeZone("EST"))
for (aSlave in hudson.model.Hudson.instance.slaves) {
println "-- Time: " + time;
println ""
//Dont do anything if the slave name is "ansible01"
if (aSlave.name == "ansible01") {
continue;
}
if (aSlave.name.indexOf(slaveStartsWith) == 0) {
println "Active slave: " + aSlave.name;
println('\tcomputer.isOnline: ' + aSlave.getComputer().isOnline());
println('\tcomputer.countBusy: ' + aSlave.getComputer().countBusy());
println ""
if (aSlave.getComputer().isOnline()) {
aSlave.getComputer().setTemporarilyOffline(true,null);
println('\tcomputer.isOnline: ' + aSlave.getComputer().isOnline());
println ""
}
if (aSlave.getComputer().countBusy() == 0) {
time = new Date().format("HH:mm MM/dd/yy z",TimeZone.getTimeZone("EST"))
println("-- Shutting down node: " + aSlave.name + " at " + time);
aSlave.getComputer().doDoDelete();
} else {
atleastOneSlaveRunnning = true;
}
}
}
//Sleep 60 seconds
if(atleastOneSlaveRunnning) {
println ""
println "------------------ sleeping 60 seconds -----------------"
sleep(60*1000);
println ""
}
}
現在,我可以創造一個自由風格的詹金斯的工作,在生成操作使用Scriptler script,並使用上述腳本適當地刪除從給定名稱開始的奴隸(將作業參數傳遞給腳本程序腳本)。
如果你足夠快,以獲得以下錯誤消息,這意味着,你跑或者叫做Scriptler腳本在工作(如上圖所示)和限制了工作到運行在非-master又名節點/從屬機器。 Scriptler腳本是SYSTEM Groovy腳本即他們必須在詹金斯大師的JVM運行訪問所有詹金斯資源/調整它們。要解決以下問題,您可以創建一個作業(限制它的主服務器即上運行詹金斯主JVM),這將只接受在scriptler腳本一個參數,並呼籲從第一份工作這項工作(如觸發器,直到作業項目/任務和塊完成):
21:42:43 Execution of script [disableSlaveNodesWithPattern.groovy] failed - java.lang.NullPointerException: Cannot get property 'slaves' on null objectorg.jenkinsci.plugins.scriptler.util.GroovyScript$ScriptlerExecutionException: java.lang.NullPointerException: Cannot get property 'slaves' on null object
21:42:43 at org.jenkinsci.plugins.scriptler.util.GroovyScript.call(GroovyScript.java:131)
21:42:43 at hudson.remoting.UserRequest.perform(UserRequest.java:118)
21:42:43 at hudson.remoting.UserRequest.perform(UserRequest.java:48)
21:42:43 at hudson.remoting.Request$2.run(Request.java:328)
21:42:43 at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
21:42:43 at java.util.concurrent.FutureTask.run(FutureTask.java:266)
21:42:43 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
21:42:43 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
21:42:43 at java.lang.Thread.run(Thread.java:745)
21:42:43 Caused by: java.lang.NullPointerException: Cannot get property 'slaves' on null object
即 如果你有在作業中運行的Scriptler腳本構建步驟(不在MASTER Jenkins機器/ JVM上運行),那麼上述錯誤將會出現並解決,創建一個作業「disableSlaveNodesStartsWith」並將其限制爲在master上運行(更安全側)並調用Scriptler腳本並將參數傳遞給作業/腳本。現在
,從其他的工作,把這種工作:
也許你可以使用https://wiki.jenkins-ci.org/display/JENKINS/Throttle+Concurrent+Builds+插件爲這些作業創建一個類別,並且一次只允許一個作業。 –
@Tizkiko感謝分享。我認爲這是設置給定作業的最大#來運行任何作業的OR max#以在給定節點/從屬節點上運行。在我的情況下,我希望這個工作能夠阻止/等待,直到所有以給定名稱開始的節點從屬節點都完成了對它們正在運行的任何正在進行的工作。這在我的情況下是必需的,因爲我在一臺機器上創建這些奴隸,並自動配置/動態地將它們撕掉 - 但不希望在節點/奴隸閒置之前發生撕裂部分。 –