Jenkins高階篇之Pipeline方法篇-Pipeline Basic Steps-5-方法timeout,waitUntil,withEnv
繼續來學習basic pipeline這個外掛的提供的方法,本篇主要學習timeout和waitUntil兩個關於時間監控的方法。有時候,我們需要對一個stage執行時間進行精確監控。例如執行這個stage大概20分鐘一定可以完成,那麼我們就可以使用timeout 設定20分鐘,如果操作20分鐘還沒有執行結束,那麼當前這個pipeline stage就會被自動取消,狀態顯示為aborted。而waitUntil是一個等待一個條件出現就會終止執行等待的方法。下面我分別用一個簡單例子來程式碼演示。withEnv是設定環境變數的,有時候我們還會設定一些普通變數放這個位置。
1.方法timeout
叫方法或者指令都可以,timeout的基本格式如下,例如我有一個程式碼塊執行監控執行時間,那麼放在timeout(){...}就好,
time(時間設定,預設是分鐘為單位) {
// 需要監控的程式碼執行
}
我寫一個一分鐘超時的簡單程式碼。
import hudson.model.*; println env.JOB_NAME println env.BUILD_NUMBER pipeline{ agent any stages{ stage("init") { steps{ script { timeout(1) { sh('java -version') //sleep 61 } } } } } }
上面我沒有執行sleep語句,那麼這個列印java -version的程式碼肯定能在一分鐘之內完成,這個job執行的狀態是成功。那麼,如果我取消sleep這個前面註釋,也就是這個程式碼要執行61秒以上的時間,但是我給了timeout是1分鐘,那麼這個job跑起來就會自動cancel,狀態是aborted。
日誌如下:
[Pipeline] { [Pipeline] timeout Timeout set to expire in 1 min 0 sec [Pipeline] { [Pipeline] sh [pipeline_basic_steps] Running shell script + java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK Server VM (build 25.181-b13, mixed mode) [Pipeline] sleep Sleeping for 1 min 1 sec Cancelling nested steps due to timeout [Pipeline] } [Pipeline] // timeout [Pipeline] } [Pipeline] // script [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Timeout has been exceeded Finished: ABORTED
2.方法waitUntil
在waitUntil{...}裡面的程式碼會無限制迴圈執行下去,直到返回true,如果返回是false,會在很短時間內再次嘗試,沒有嘗試次數限制,如果有異常,會退出。這個我沒有實際用過,不好舉例。
import hudson.model.*;
println env.JOB_NAME
println env.BUILD_NUMBER
pipeline{
agent any
stages{
stage("init") {
steps{
script {
timeout(5) {
waitUntil {
script {
// 監控某一個服務是否啟動完成程式碼
}
}
}
}
}
}
}
}
我沒有想出一個實際例子,這裡寫一個虛擬碼。場景就是,在5分鐘之內,我使用waitUntil去一直輪詢檢查某一個服務是否啟動完成。
3.withEnv
import hudson.model.*;
println env.JOB_NAME
println env.BUILD_NUMBER
pipeline{
agent any
stages{
stage("init") {
steps{
withEnv(['java_home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-3.b13.el6_10.i386/jre']) {
sh("$java_home/bin/java -version")
}
script {
println "test with withEnv feature"
}
}
}
}
}
這個用withEnv新增多個環境變數,我沒有使用過,下次如果遇到再補上。