如何在不重啟服務器的情況下停止 Jenkins 上的殭屍作業?
一、概述
在 Jenkins 中,殭屍作業是一個陷入無限循環的構建,消耗資源並可能導致其他構建出現問題。重要的是立即停止殭屍作業,以防止它們在 Jenkins 服務器上造成進一步的問題。
在本教程中,我們將解釋如何在不重啟服務器的情況下識別和停止 Jenkins 上的殭屍作業。
2. 理解問題
殭屍作業由一個永無止境的持續進程組成。它可能由於各種原因而發生,例如構建[step](https://www.jenkins.io/doc/pipeline/steps/workflow-basic-steps/)
卡住或作業由於外部依賴性而無法完成。殭屍作業可能會因資源消耗和其他構建失敗而導致問題。此外,這使得很難看到其他構建的狀態。因此,立即停止殭屍作業以防止此類問題至關重要。
3.創建殭屍作業
在 Jenkins 中,我們可以使用無限管道作業通過在管道中產生錯誤來創建殭屍作業。為了說明這一點,讓我們為它創建一個管道作業:
pipeline {
agent any
stages {
stage('Infinite Loop') {
steps {
script {
while (true) {
println 'This is an infinite loop!'
Thread.sleep(10000)
}
}
}
}
}
}
在此管道作業中,腳本步驟包含一個無限循環,內部調用了Thread.sleep(10000)
。 Thread.sleep()
方法將導致腳本在繼續循環之前暫停10
秒。這將使 s top
按鈕更難中斷構建。在運行這個作業時,我們會得到以下錯誤:
Scripts not permitted to use staticMethod java.lang.Thread sleep long. Administrators can decide whether to approve or reject this signature.
管理員用戶可以選擇批准或拒絕此簽名。 Jenkins 服務器配置為阻止管道腳本中的Thread.sleep()
方法。此安全功能可防止惡意腳本在服務器上造成問題。為了批准請求,管理員用戶需要執行以下步驟:
- 轉到詹金斯儀表板
- 在 Jenkins 儀表板中單擊“
Manage Jenkins
” - 單擊
In-process Script Approval
以批准Thread.sleep()
簽名
再次構建作業時,我們將無法使用stop
按鈕停止這個殭屍作業。
4.停止殭屍作業
在 Jenkins 中,我們可以使用構建視圖中的stop
按鈕終止正常作業。此外,這將終止該構建並釋放其所有依賴項。但是,如果作業卡住無法停止,則必須強行終止。
4.1.使用Finish
方法
要停止殭屍作業,可以直接在構建中使用 Jenkins API。通過使用 Jenkins builds finish
方法,我們可以將構建標記為已完成並為其分配結果狀態。要運行腳本,我們需要執行以下步驟:
- 轉到詹金斯儀表板
- 在 Jenkins 儀表板中單擊“
Manage Jenkins
” - 在
Script Console
中添加以下腳本
Jenkins.instance.getItemByFullName("sampleZombieJob")
.getBuildByNumber(17)
.finish(hudson.model.Result.ABORTED, new java.io.IOException("Aborting build"));
在Script Console
中運行以下腳本以強制終止構建。
4.2.使用線程Interrupt
方法
我們還可以使用Script Console
中的Thread.interrupt()
方法停止殭屍作業:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('sampleZombieJob')) {
println "Stopping $it.name"
it.interrupt()
}
}
該腳本將中斷sampleZombieJob
的最後一次構建並釋放它消耗的所有資源。
4.3.使用Thread Stop
方法
腳本控制台還允許我們使用Thread.stop()
方法停止殭屍作業:
Thread.getAllStackTraces().keySet().each() {
if (it.name.contains('sampleZombieJob')) {
println "Stopping $it.name"
it.stop()
}
}
上面的腳本將終止殭屍作業並釋放其所有資源。 Thread.stop()
方法可能會導致數據丟失並使服務器不穩定。一般來說,我們應該通過點擊構建頁面的stop
按鈕或者使用interrupt()
方法來停止構建。 Thread.stop()
方法只能用作最後的手段。
5.結論
在本文中,我們學習瞭如何停止 Jenkins 上的殭屍作業。首先,我們使用 Jenkins 管道創建了一個殭屍作業。之後,我們討論了殺死殭屍進程的可能解決方案。
我們還可以在 GitHub 上找到用於創建和停止殭屍作業的腳本。