Jenkins高级篇之Pipeline方法篇-Pipeline Basic Steps-6-写文件writeFile和git SCM

释放双眼,带上耳机,听听看~!

       这篇打算结束basic pipeline这个插件的方法学习,前面和本篇介绍方法,基本把常用的basic pipeline里面的方法都介绍了一遍。如果以后遇到不会的,可以去这个官方网站去查询新的方法介绍,其实官网也是比较坑的,介绍了这个方法的作用,但是没有给出一个具体的代码的示例。就拿https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/ 这篇插件的官网来说,真的没有一个具体代码示例。我都是边看官网文章具体方法介绍,如果不会这个方法代码,就去google查询,然后在具体jenkins job上不断测试和调整代码,最后把测试通过的代码放在这个系列文章中。

1.writeFile

在前面文章,我介绍了readFile,前面介绍了如何读,那么这里就介绍如何写。readFile和writeFile都是简单的文本文件读写。当你拿到一个文件,不知道选择什么方式来读写,那么这个readFile和writeFile就是最原始的方法。但是,如果是json类型文件,那么我们可以用前面介绍插件的readJson来读取,读取得到是一个json 的对象,就可以直接调用json的方法。

我会在/testdata目录下,写入一个write.txt的文件,先通过writeFile写入,然后通过readFile读取出来。

pipeline代码


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
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("writeFile demo") {
11          steps{
12              script {
13                  write_file_path = "${env.WORKSPACE}/testdata/write.txt"
14                  file_contents = "Hello Anthony!! 这是一个测试例子"
15                  //write into write.txt
16                  writeFile file: write_file_path, text: file_contents, encoding: "UTF-8"
17                  // read file and print it out
18                  fileContents = readFile file: write_file_path, encoding: "UTF-8"
19                  println fileContents
20              }
21          }
22      }
23  }
24}
25
26

测试结果


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1[Pipeline] }
2[Pipeline] // stage
3[Pipeline] withEnv
4[Pipeline] {
5[Pipeline] stage
6[Pipeline] { (writeFile demo)
7[Pipeline] script
8[Pipeline] {
9[Pipeline] writeFile
10[Pipeline] readFile
11[Pipeline] echo
12Hello Anthony!! ����һ����������
13[Pipeline] }
14[Pipeline] // script
15[Pipeline] }
16[Pipeline] // stage
17[Pipeline] }
18[Pipeline] // withEnv
19[Pipeline] }
20[Pipeline] // node
21[Pipeline] End of Pipeline
22Finished: SUCCESS
23

上面看到了乱码,即使我代码中使用了encoding=UTF-8进行读写操作,但是由于github系统不支持保存中文代码,所以这里打印出来内容就是乱码。

其实关于basic pipeline这个插件,有很多操作是写到step(…) 这个代码块里的,在step里可以调用其他构建或者构建后操作,例如构建后操作一般有发送邮件提醒功能。官网也有很多方法和参数关于step的描述,我可以负责任的说,除非你对Jenkins太熟悉,否则你完全可以跳过官网关于step的这个很长篇幅的学习,反正我工作是是很少用到官网介绍关于在step里能实现的一些功能。

2.git plugin插件介绍

下面我们来学习别的常用的插件以及方法,前面我们运行stage,如果你观察了jenkins的job 的stage view,一定会看到第一个stage的名称叫Declarative: Checkout SCM,这个是pipeline自动给加上的。有时候,我们在一个项目自动化中,可能还需要checkout其他git项目的代码。这种有两个git项目地址的自动化项目有很多,下面我就来介绍一下。

环境条件:

1.我分别在github上有两个项目

2.我在jenkins配置了访问github的用户名和密码

这重点提下这个访问github的密码在jenkins上的存储。

我的Jenkins环境上就配置了一个github的访问用户,记住红圈这个id,待会下面代码需要用到。

3.我写两个stage,第二个stage会显示如何在pipeline中下载我第二个github项目

下面是我的pipeline代码


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
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("Hello Demo") {
11          steps{
12              script {
13                  println "Hello Demo!"
14              }
15          }
16      }
17     
18      stage("git checkout") {
19          steps{
20              script {
21                  checkout([$class: 'GitSCM', branches: [[name: '*/master']],
22                      userRemoteConfigs: [[credentialsId: '6f4fa66c-eb02-46dc-a4b3-3a232be5ef6e',
23                          url: 'https://github.com/Anthonyliu86/HelloWorld.git']]])
24              }
25          }
26      }
27  }
28}
29
30

我的测试运行日志


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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
1[Pipeline] echo
2pipeline_basic_steps
3[Pipeline] echo
480
5[Pipeline] node
6Running on Jenkins in /var/lib/jenkins/workspace/pipeline_basic_steps
7[Pipeline] {
8[Pipeline] stage
9[Pipeline] { (Declarative: Checkout SCM)
10[Pipeline] checkout
11 > git rev-parse --is-inside-work-tree # timeout=10
12Fetching changes from the remote Git repository
13 > git config remote.origin.url https://github.com/Anthonyliu86/Pipeline-learn-demo-anthony.git # timeout=10
14Fetching upstream changes from https://github.com/Anthonyliu86/Pipeline-learn-demo-anthony.git
15 > git --version # timeout=10
16using GIT_ASKPASS to set credentials
17 > git fetch --tags --progress https://github.com/Anthonyliu86/Pipeline-learn-demo-anthony.git +refs/heads/*:refs/remotes/origin/*
18 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
19 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
20Checking out Revision 4abe7ec1dba5ffd25f258347b8f9594377eefb3f (refs/remotes/origin/master)
21 > git config core.sparsecheckout # timeout=10
22 > git checkout -f 4abe7ec1dba5ffd25f258347b8f9594377eefb3f
23Commit message: "add git check demo"
24 > git rev-list --no-walk 9689ab8bad547bdfc21d9b8a742b8df3a4dc3376 # timeout=10
25[Pipeline] }
26[Pipeline] // stage
27[Pipeline] withEnv
28[Pipeline] {
29[Pipeline] stage
30[Pipeline] { (Hello Demo)
31[Pipeline] script
32[Pipeline] {
33[Pipeline] echo
34Hello Demo!
35[Pipeline] }
36[Pipeline] // script
37[Pipeline] }
38[Pipeline] // stage
39[Pipeline] stage
40[Pipeline] { (git checkout)
41[Pipeline] script
42[Pipeline] {
43[Pipeline] checkout
44 > git rev-parse --is-inside-work-tree # timeout=10
45Fetching changes from the remote Git repository
46 > git config remote.origin.url https://github.com/Anthonyliu86/HelloWorld.git # timeout=10
47Fetching upstream changes from https://github.com/Anthonyliu86/HelloWorld.git
48 > git --version # timeout=10
49using GIT_ASKPASS to set credentials
50 > git fetch --tags --progress https://github.com/Anthonyliu86/HelloWorld.git +refs/heads/*:refs/remotes/origin/*
51 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
52 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
53Checking out Revision 6038053d56db63710721b0847398e2a02ca8d7f1 (refs/remotes/origin/master)
54 > git config core.sparsecheckout # timeout=10
55 > git checkout -f 6038053d56db63710721b0847398e2a02ca8d7f1
56Commit message: "Update test1"
57First time build. Skipping changelog.
58[Pipeline] }
59[Pipeline] // script
60[Pipeline] }
61[Pipeline] // stage
62[Pipeline] }
63[Pipeline] // withEnv
64[Pipeline] }
65[Pipeline] // node
66[Pipeline] End of Pipeline
67Finished: SUCCESS
68

这种git 下载代码的方式,在任何基于git的版本控制服务器都可以,常见的github,gittree,gitlab等。一般在pipeline代码中,很常见在不同stage中使用不同git仓库地址的代码,所以git SCM操作,可以写在不同stage中。这个到指定git服务器上拉取代码是很常见的pipeline代码操作,其他关于什么github集成插件里面方法的几乎可以不去了解。

到这里,暂时结束学习不同pipeline 插件如何在pipeline 代码里使用,如果你想查询你知道的插件,如何写pipeline去实现,去https://jenkins.io/doc/pipeline/steps/

这个地址查询插件名称就好。例如,我就看到钉钉提醒,之前在我博客介绍简单二次开发这个插件。接下来文章,我可能会借着selenium UI自动化具体项目来结合pipeline,演示如何做集成测试,所有的Jenkins UI操作都通过用pipeline代码的方式来实现。

 

 

 

 

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

职场中的那些话那些事

2021-9-24 20:41:29

安全经验

elk+redis 搭建nginx日志分析平台

2021-11-28 16:36:11

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