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代码如下。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("deleteDir") {
11          steps{
12              script{
13                  sh("ls -al ${env.WORKSPACE}")
14                  deleteDir()  // clean up current work directory
15                  sh("ls -al ${env.WORKSPACE}")
16              }
17          }
18      }
19  }
20}
21
22
23
24

解释一下上面的代码,第一个要了解的就是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/

输出结果:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1[pipeline_basic_steps] Running shell script
2+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
3total 40
4drwxr-xr-x  7 jenkins jenkins 4096 Nov 11 04:51 .
5drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 04:51 ..
6-rw-r--r--  1 jenkins jenkins  367 Nov 11 04:51 .classpath
7drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 04:51 .git
8-rw-r--r--  1 jenkins jenkins  357 Nov 11 04:51 Jenkinsfile
9drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 lib
10drwxr-xr-x  5 jenkins jenkins 4096 Nov 11 04:51 pipeline
11-rw-r--r--  1 jenkins jenkins  398 Nov 11 04:51 .project
12drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 .settings
13drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 testdata
14[Pipeline] deleteDir
15[Pipeline] sh
16[pipeline_basic_steps] Running shell script
17+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
18total 8
19drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 04:51 .
20drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 04:51 ..
21[Pipeline] }
22[Pipeline] // script
23[Pipeline] }
24[Pipeline] // stage
25[Pipeline] }
26[Pipeline] // withEnv
27[Pipeline] }
28[Pipeline] // node
29[Pipeline] End of Pipeline
30Finished: SUCCESS
31

上面的deleterDir()方法特别适合这种场景,做完了每一个stage里面的事情,我们需要在post{…}里面写一些clean up操作,如果这个操作是清空WORKSPACE的话,这个deleteDir()就派上用场了。特别是生产环境,我们需要节约jenkins服务器的磁盘空间,有时候清空WORKSPACE是很有必要的操作。

3方法dir()

如果使用了dir语句块,这个方法就是改变当前的工作目录。在dir语句块里执行的其他路径或者相对路径,都是和dir里面设置的文件路径相关,这个和WORKSPACE相对文件路径已经没有关系了。

下面演示下dir改变了当前的工作路径的代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("dir") {
11          steps{
12              println env.WORKSPACE
13              dir("${env.WORKSPACE}/testdata"){
14                  sh "pwd"
15              }
16          }
17      }
18  }
19}
20
21

测试的结果输出日志。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
1[Pipeline] stage
2[Pipeline] { (dir)
3[Pipeline] echo
4/var/lib/jenkins/workspace/pipeline_basic_steps
5[Pipeline] dir
6Running in /var/lib/jenkins/workspace/pipeline_basic_steps/testdata
7[Pipeline] {
8[Pipeline] sh
9[testdata] Running shell script
10+ pwd
11/var/lib/jenkins/workspace/pipeline_basic_steps/testdata
12[Pipeline] }
13[Pipeline] // dir
14

上面在使用了dir("new_path"){…}之后,执行shell 命令pwd,路径果然变了。

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

方法echo就是和groovy中的println没有任何区别,如果看打印的效果。一般来说使用echo就是打印info debug级别的日志输出用,如果遇到错误,就可以使用error(“error message”),如果出现执行到error方法,jenkins job会退出并显示失败效果。

看看这两个方法的demo


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("dir_echo_error_demo") {
11          steps{
12              println env.WORKSPACE
13              dir("${env.WORKSPACE}/testdata"){
14                  sh "pwd"
15              }
16              echo ("list all files under current workd directory")
17              sh("ls -al ${env.WORKSPACE}")
18              echo("some info logs output")
19              error("some error method output")
20          }
21      }
22  }
23}
24
25
26
27

输出日志


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
1[Pipeline] }
2[Pipeline] // stage
3[Pipeline] withEnv
4[Pipeline] {
5[Pipeline] stage
6[Pipeline] { (dir_echo_error_demo)
7[Pipeline] echo
8/var/lib/jenkins/workspace/pipeline_basic_steps
9[Pipeline] dir
10Running in /var/lib/jenkins/workspace/pipeline_basic_steps/testdata
11[Pipeline] {
12[Pipeline] sh
13[testdata] Running shell script
14+ pwd
15/var/lib/jenkins/workspace/pipeline_basic_steps/testdata
16[Pipeline] }
17[Pipeline] // dir
18[Pipeline] echo
19list all files under current workd directory
20[Pipeline] sh
21[pipeline_basic_steps] Running shell script
22+ ls -al /var/lib/jenkins/workspace/pipeline_basic_steps
23total 44
24drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 08:08 .
25drwxr-xr-x 16 jenkins jenkins 4096 Nov 11 07:37 ..
26-rw-r--r--  1 jenkins jenkins  367 Nov 11 08:08 .classpath
27drwxr-xr-x  8 jenkins jenkins 4096 Nov 11 08:08 .git
28-rw-r--r--  1 jenkins jenkins  357 Nov 11 08:08 Jenkinsfile
29drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 lib
30drwxr-xr-x  5 jenkins jenkins 4096 Nov 11 08:08 pipeline
31-rw-r--r--  1 jenkins jenkins  398 Nov 11 08:08 .project
32drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 .settings
33drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 testdata
34drwxr-xr-x  2 jenkins jenkins 4096 Nov 11 08:08 testdata@tmp
35[Pipeline] echo
36some info logs output
37[Pipeline] error
38[Pipeline] }
39[Pipeline] // stage
40[Pipeline] }
41[Pipeline] // withEnv
42[Pipeline] }
43[Pipeline] // node
44sh: line 1: 24892 Terminated              sleep 3
45sh: line 1: 24901 Terminated              sleep 3
46[Pipeline] End of Pipeline
47ERROR: some error method output
48Finished: FAILURE
49

 

 

 

 

 

给TA打赏
共{{data.count}}人
人已打赏
安全经验

职场中的那些话那些事

2021-9-24 20:41:29

安全经验

awk分析nginx日志,获取pv

2021-11-28 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索