我正在嘗試創建一個 Jenkins 管道,其中包含需要用戶輸入的階段。但是,在 Jenkins 等待用戶單擊“繼續”或“中止”的這些時間段內,代理似乎保持在線。
有一種方法可以在沒有代理在線/使用的情況下暫停階段:
- 設定
agent none在 Jenkinsfile 的頂層。默認情況下,不會為任何階段分配代理。 - 為每個階段專門設定一個代理。
- 在您希望暫停而不使用代理的階段,添加一個
when包含expression塊的子句(詢問用戶是否要繼續),然后添加beforeAgent以確保在啟動代理之前發生此運算式。
這看起來像下面這樣:
pipeline {
agent none
stages {
stage ('Stage I want to Pause') {
when {
beforeAgent true
expression {
input message: 'Do you want to continue?'
return true
}
}
agent { label MyAgent }
steps {
echo "Performing task..."
}
}
}
}
但是,據我所知,這種方法有一個很大的缺點。代理需要在每個階段設定這一事實意味著在每個階段之后代理都會關閉,并且新的代理會重新啟動。
如果您有一個安裝某些包的階段,這就是一個問題,因為第二階段出現的代理將沒有這些包。
是否有任何其他方法可以實作此目的,或者如果兩個連續階段使用相同的代理標簽,是否有一種方法可以使代理保持運行狀態?
uj5u.com熱心網友回復:
解決方案
回答我自己的問題。
在我的問題中,我發布了一個在不使用代理的情況下暫停階段的分步程序(即在恢復/批準管道之前關閉代理)
這個程序有一個很大的缺點——agent none全域設定并為每個階段指定一個代理意味著為每個階段創建一個新代理。這并不理想,特別是如果您在一個階段安裝了下一階段需要的軟體包。
這個問題的解決方案是在 Declarative Pipeline 1.3 中引入的Sequential Stages 。您可以將階段包裝在另一個父階段中,這意味著它們都將使用相同的代理。
因此,總而言之,這里是如何在不使用代理的情況下暫停 Jenkinsfile 中的一個階段,同時對要在一個代理上運行的任何內容使用順序階段。
- 設定
agent none在管道的頂層。默認情況下,不會為任何階段分配代理。 - 專門為任何“父”階段設定代理。
- 在此父階段中,為您希望僅在一個代理上執行的任何任務創建“子階段”。您不需要在子階段指定代理。他們將使用父母的代理人。
- 對于您希望在不消耗代理的情況下暫停的任何階段,請專門設定一個代理。然后添加一個
when包含運算式塊的子句(詢問用戶是否要繼續),并添加beforeAgent true以確保在啟動代理之前發生此運算式。
這是一個例子:
pipeline {
agent none // By default, no agent will come up
stages {
stage ('Parent Stage') {
agent { label MyAgent }
stage ('Child Stage 1. Package installs for example.'){
// You don't need to specify agent here as it uses parent
steps {
// Install packages
}
}
stage ('Child Stage 2. Uses same agent as previous stage.') {
steps {
// Step operations which require above packages
}
}
}
stage ('Stage I want to pause without consuming agent') {
when {
beforeAgent true
expression {
input message: 'Do you want to continue?'
return true
}
}
agent { label MyAgent }
steps {
echo "Performing task..."
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/533815.html
