1. 程式人生 > >Jenkins高階篇之Pipeline方法篇-Pipeline Basic Steps-5-方法timeout,waitUntil,withEnv

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新增多個環境變數,我沒有使用過,下次如果遇到再補上。