1. 程式人生 > >Jenkins高階篇之Pipeline方法篇-Pipeline Basic Steps-1-方法deleteDir和dir、echo、error

Jenkins高階篇之Pipeline方法篇-Pipeline Basic Steps-1-方法deleteDir和dir、echo、error

這篇開始來學習一個最基礎的pipeline元件,這個也是一個獨立的外掛,在安裝pipeline的時候預設會自動安裝,外掛的名稱是pipeline basic steps, 你可以去你自己jenkins環境,外掛管理下的installed下面找到這個外掛。這篇我們先來學習下兩個關於資料夾路徑操作的方法。

1.pipeline basic steps 官網主頁

官網有這個basic steps下相關方法、指令的介紹,說實話,這個介紹太不友好了。英語好的人,認真讀了還好,不然各種坑。地址是https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/

2.方法deleteDir()

一開始我以為這個是一個指令,並不是一個方法,一般來說,指令就是deleterDir,而方法就得這麼寫deleteDir(), 這個在官網的頁面完全沒有告訴你如何去使用,一行程式碼都沒有。認真看deleterDir的描述才知道,這個是預設遞迴刪除WORKSPACE下的檔案和資料夾。這個方法是沒有引數,也不需要引數(我就傻傻地嘗試了傳遞一個資料夾路徑的字串引數給這個方法)。下面來演示使用這個方法清空當前WORKSPACE。

這篇開始,由於這個外掛方法都很簡單,我就沒有把方法抽取成模組裡的方法,也就是說,這篇程式碼練習,只用pipeline stage job這個groovy檔案,不需要程式碼裡load module這個groovy。

我的pipeline stage job程式碼如下。

import hudson.model.*;

println env.JOB_NAME
println env.BUILD_NUMBER

pipeline{
	
	agent any
	stages{
		stage("deleteDir") {
			steps{
				script{
					sh("ls -al ${env.WORKSPACE}")
					deleteDir()  // clean up current work directory
					sh("ls -al ${env.WORKSPACE}")
				}
			}
		}
	}
}


解釋一下上面的程式碼,第一個要了解的就是sh這個指令,你可以寫成sh 'command...', 也可以寫成sh("command..."), 這個sh是shell的意思,告訴jenkins接下來這裡要執行linux shell指令碼或者命令,所以執行上面的程式碼,需要在linux的節點下執行。第一行shell命令是顯示當然WORKSPACE這個路徑下檔案,第二個是執行deleterDir()方法,預設是清空當然jenkins 專案的WORKSPACE路徑下所有內容。第三行是再次使用ls 命令,列印清除前後的對比。

我的jenkins job:http://65.49.216.200:8080/job/pipeline_basic_steps/1/

為了測試deleteDir是一個方法,而不是一個指令,我做了測試:http://65.49.216.200:8080/job/pipeline_basic_steps/2/

輸出結果:

[pipeline_basic_steps] Running shell script
+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
total 40
drwxr-xr-x  7 jenkins jenkins 4096 Nov 11 04:51 .
drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 04:51 ..
-rw-r--r--  1 jenkins jenkins  367 Nov 11 04:51 .classpath
drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 04:51 .git
-rw-r--r--  1 jenkins jenkins  357 Nov 11 04:51 Jenkinsfile
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 lib
drwxr-xr-x  5 jenkins jenkins 4096 Nov 11 04:51 pipeline
-rw-r--r--  1 jenkins jenkins  398 Nov 11 04:51 .project
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 .settings
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 testdata
[Pipeline] deleteDir
[Pipeline] sh
[pipeline_basic_steps] Running shell script
+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
total 8
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 .
drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 04:51 ..
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

上面的deleterDir()方法特別適合這種場景,做完了每一個stage裡面的事情,我們需要在post{...}裡面寫一些clean up操作,如果這個操作是清空WORKSPACE的話,這個deleteDir()就派上用場了。特別是生產環境,我們需要節約jenkins伺服器的磁碟空間,有時候清空WORKSPACE是很有必要的操作。

3方法dir()

如果使用了dir語句塊,這個方法就是改變當前的工作目錄。在dir語句塊裡執行的其他路徑或者相對路徑,都是和dir裡面設定的檔案路徑相關,這個和WORKSPACE相對檔案路徑已經沒有關係了。

下面演示下dir改變了當前的工作路徑的程式碼

import hudson.model.*;

println env.JOB_NAME
println env.BUILD_NUMBER

pipeline{
	
	agent any
	stages{
		stage("dir") {
			steps{
			    println env.WORKSPACE
			    dir("${env.WORKSPACE}/testdata"){
				    sh "pwd"
			    }
			}
		}
	}
}

測試的結果輸出日誌。

[Pipeline] stage
[Pipeline] { (dir)
[Pipeline] echo
/var/lib/jenkins/workspace/pipeline_basic_steps
[Pipeline] dir
Running in /var/lib/jenkins/workspace/pipeline_basic_steps/testdata
[Pipeline] {
[Pipeline] sh
[testdata] Running shell script
+ pwd
/var/lib/jenkins/workspace/pipeline_basic_steps/testdata
[Pipeline] }
[Pipeline] // dir

上面在使用了dir("new_path"){...}之後,執行shell 命令pwd,路徑果然變了。

4.方法echo("message")和error("error_message")

方法echo就是和groovy中的println沒有任何區別,如果看列印的效果。一般來說使用echo就是列印info debug級別的日誌輸出用,如果遇到錯誤,就可以使用error(“error message”),如果出現執行到error方法,jenkins job會退出並顯示失敗效果。

看看這兩個方法的demo
 

import hudson.model.*;

println env.JOB_NAME
println env.BUILD_NUMBER

pipeline{
	
	agent any
	stages{
		stage("dir_echo_error_demo") {
			steps{
			    println env.WORKSPACE
			    dir("${env.WORKSPACE}/testdata"){
				    sh "pwd"
			    }
			    echo ("list all files under current workd directory")
			    sh("ls -al ${env.WORKSPACE}")
				echo("some info logs output")
				error("some error method output")
			}
		}
	}
}


輸出日誌

[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (dir_echo_error_demo)
[Pipeline] echo
/var/lib/jenkins/workspace/pipeline_basic_steps
[Pipeline] dir
Running in /var/lib/jenkins/workspace/pipeline_basic_steps/testdata
[Pipeline] {
[Pipeline] sh
[testdata] Running shell script
+ pwd
/var/lib/jenkins/workspace/pipeline_basic_steps/testdata
[Pipeline] }
[Pipeline] // dir
[Pipeline] echo
list all files under current workd directory
[Pipeline] sh
[pipeline_basic_steps] Running shell script
+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
total 44
drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 08:08 .
drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 07:37 ..
-rw-r--r--  1 jenkins jenkins  367 Nov 11 08:08 .classpath
drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 08:08 .git
-rw-r--r--  1 jenkins jenkins  357 Nov 11 08:08 Jenkinsfile
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 lib
drwxr-xr-x  5 jenkins jenkins 4096 Nov 11 08:08 pipeline
-rw-r--r--  1 jenkins jenkins  398 Nov 11 08:08 .project
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 .settings
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 testdata
drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 [email protected]
[Pipeline] echo
some info logs output
[Pipeline] error
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
sh: line 1: 24892 Terminated              sleep 3
sh: line 1: 24901 Terminated              sleep 3
[Pipeline] End of Pipeline
ERROR: some error method output
Finished: FAILURE