天天看點

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           

繼續閱讀