之前,有人和我说,pipeline教程这里,关于如何创建pipeline的git项目和,如何在jenkins上做pipeline的测试这块,在前面文章交代不清楚。这里我补上一篇,通过这一篇,小白也能开始自己动手写一个pipeline的项目。接下来,我还会写几篇文章,主要是实际工作中pipeline项目的一些技巧,我认为算是学习pipeline的中级篇,我也不知道有没有高级篇,学习完前面pipeline语法文章和实践篇和这几篇技巧篇,我觉得,你可以在你自己项目推广pipeline这种持续集成测试的方案。
1.在github上创建一个仓库
如果你git命令不熟悉,或者本机环境没有安装git client,你还是选择在github的界面上选择新建一个仓库。只需要输入仓库名称,点击创建就行,勾选还是不勾选readMe不是重点。下面截图,是我在我个人的github中创建的一个pipeline项目,主要用来介绍实际工作中的pipeline代码的一些技巧。是博客中pipeline文章系列的补充。
这样我们的练习的项目就创建并初始化好了。接下来,我们所有文件新建和代码都在Eclipse中完成。上面红圈url是git项目的地址,我们需要拷贝下来,待会Eclipse中导入这个git项目需要用到。
2.导入github项目到Eclipse中
在Eclipse中的Package Explorer空白处,点击右键,然后选择Import…菜单。然后选择Git-> Projects from git, 点击Next菜单,然后选择Clone URL, 继续点击Next按钮。然后把上面github项目地址黏贴上去。
黏贴地址之后,用户名和密码是自动识别,如果你浏览器没有登录github,而且在eclipse上没有添加github的用户名。你可能需要输入用户名和密码,下次就会记住,自动补齐这些信息。然后一直默认点击Next直到导入结束。
3.Pipeline的项目的风格
我建议大家按照这样代码结构去搭建你pipeline项目。就是两个文件夹下有两个文件,一个是stage,用来定义多个stage, 在jenkins stage view可以看到效果。第二个就是stage代码中需要调用一些封装好的方法,我把放到另外一个文件夹中。这些方法有可能是通用的方法,例如工具类,也有一些业务流程的封装。
这里提一下Jenkinsfile这个概念,我记得我之前博客说过,jenkinsfile就是我们写多个stage的那个文件,这个文件名称可以就是jenkinsfile这个单词,也可以是任何xxx.groovy,现在我们演示就是第二个情况,这个projectA-stage.groovy, 我们接下来会在jenkins的job的配置页面需要用到。
4.第一次git 提交
这次我在两个groovy文件没有写任何代码,两个是空文件。下面我们利用Eclipse这个git插件,借用图形化界面来帮我们使用git提交代码到远程仓库。
拖拽上面两个groovy结尾文件,然后右侧写一句简单的commit message。中文和英文都可以,不过建议写英文。确认无误之后,点击commit and push按钮,过一会显示一个提交成功的消息,说明这次代码变更成功提交了远程仓库。
5.Pipeline脚本开发编辑器推荐
有些人说,Eclipse上已经安装了groovy默认的编辑器,为什么还要安装其他的插件呢?可以这样说,pipeline脚本和纯groovy代码不一样,如果没有插件,写代码很不方便,没有任何高亮的语法,看起来很不舒服,就像在记事本里写代码一样。这个插件的名称叫做jenkins editor, 一般来说pipeline的代码文件,如果在jenkins上跑,这个文件一般叫Jenkinsfile,所以这个插件就叫这个名称,请看下图我安装过的版本。
以后,我们这里遇到groovy结尾的文件,都右键,选择打开方式,选择Jenkins Editor打开。如果一个组多个人写代码,这个插件统一也是有好处。尽量保持了代码格式样式风格一致性。
6.开始写stage.groovy文件
我这里写一个最简单的pipeline代码,打印hello pipeline和打印当前jenkins 的Job名称和Job构建号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1import hudson.model.*;
2
3
4pipeline{
5
6 agent any
7 stages{
8 stage("Hello Pipeline") {
9 script {
10 println "Hello Pipeline!"
11 println env.JOB_NAME
12 println env.BUILD_NUMBER
13 }
14 }
15 }
16
17}
18
19
20
7.安装Jenkins环境和几个常见问题
如果你没有Jenkins环境,你自己在windows上或者虚拟机器上安装一个linux,然后部署一个jenkins服务。个人推荐centos上安装jenkins,主要步骤如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1# 安装JAVA, 默认是openjdk-1.8.0以上
2yum install -y java
3
4
5wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo
6
7rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key
8
9yum install -y jenkins
10
11#启动jenkins 服务
12service jenkins start | restart | stop
13#设置开启启动
14chkconfig jenkins on
15
PS:我前面文章中出现的jenkins环境,由于我的VPS机器IP被封了,所以不能提供服务。
这里简单题下几个Jenkins常见问题和解决办法。
问题1:yum install jenkins之后,启动不了jenkins, 这种问题一般是Java没有安装正确,造成的。
问题2:虚拟机中启动了jenkins服务,但是你自己笔记本电脑浏览器打不开jenkins登录界面。解决办法就是,到虚拟机中关闭防火墙:systemctl stop firewalld.service
问题3:虚拟机第一次安装jenkins并启动服务之后,无法安装默认插件,页面提示网络问题,需要设置代理或者跳过安装。解决办法是:先新开一个浏览器tab,输入http://192.168.24.130:8080/pluginManager/advanced,找到下图红圈,把之前https改成http.
然后回到虚拟机,service Jenkins restart 之后,再次浏览器打开,就能出现选择默认插件还是自定义安装插件的页面。
8.创建并配置一个pipeline Jenkins job
选择新建job, job类型选择pipeline,输入名称,点击确定。
具体参考这个文章:https://blog.csdn.net/u011541946/article/details/83118096
这篇文章对应的项目git,https://github.com/Anthonyliu86/pipeline-skills-demo 不要看我git项目,由于随着文章增多,我pipeline代码也不断提交,本篇代码,上面已经贴出来。
9.启动测试和观察
点击立即构建,然后我们观察下控制台,如果你以后做pipeline项目或者Jenkins类似持续集成项目,日志控制台是你每天都要监控的事情,在你开发脚本阶段。
我这就报错,然后我们看看报错,然后如何解决。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 1Started by user root
2Obtained src/Jenkinsfile/projectA-stages.groovy from git https://github.com/Anthonyliu86/pipeline-skills-demo.git
3Running in Durability level: MAX_SURVIVABILITY
4org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
5WorkflowScript: 8: Unknown stage section "script". Starting with version 0.5, steps in a stage must be in a ‘steps’ block. @ line 8, column 3.
6 stage("Hello Pipeline") {
7 ^
8
9WorkflowScript: 8: Expected one of "steps", "stages", or "parallel" for stage "Hello Pipeline" @ line 8, column 3.
10 stage("Hello Pipeline") {
11 ^
12
132 errors
14
15 at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
16 at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)
17 at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
18 at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
19 at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
20 at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
21 at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
22 at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
23
上面重点看workflowScript:8 Expected one of steps, 意思在第8行代码,没有找到steps这个关键字。所以,我们的代码需要调整下,把script放在steps范围之内包裹起来。
接下来,我们借助jenkins replay的插件,我们原地修改并测试,默认是安装了这个插件,我们发现这里之前报错脚本没有加载进来就报错,也就是编译报错,所以我们还是要通过Eclipse修改代码提交,然后再次测试。
修改代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1import hudson.model.*;
2
3
4pipeline{
5
6 agent any
7 stages{
8 stage("Hello Pipeline") {
9 steps {
10 script {
11 println "Hello Pipeline!"
12 println env.JOB_NAME
13 println env.BUILD_NUMBER
14 }
15 }
16 }
17 }
18
19}
20
21
22
提交到github之后,jenkins点击立即构建,这次就成功了,完整日志如下。
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 1Started by user root
2Obtained src/Jenkinsfile/projectA-stages.groovy from git https://github.com/Anthonyliu86/pipeline-skills-demo.git
3Running in Durability level: MAX_SURVIVABILITY
4[Pipeline] Start of Pipeline
5[Pipeline] node
6Running on Jenkins in /var/lib/jenkins/workspace/ProjectA-pipeline-demo
7[Pipeline] {
8[Pipeline] stage
9[Pipeline] { (Declarative: Checkout SCM)
10[Pipeline] checkout
11using credential 03214975-2168-4795-981a-ddd935f62a76
12Cloning the remote Git repository
13Cloning repository https://github.com/Anthonyliu86/pipeline-skills-demo.git
14 > git init /var/lib/jenkins/workspace/ProjectA-pipeline-demo # timeout=10
15Fetching upstream changes from https://github.com/Anthonyliu86/pipeline-skills-demo.git
16 > git --version # timeout=10
17using GIT_ASKPASS to set credentials
18 > git fetch --tags --progress https://github.com/Anthonyliu86/pipeline-skills-demo.git +refs/heads/*:refs/remotes/origin/*
19 > git config remote.origin.url https://github.com/Anthonyliu86/pipeline-skills-demo.git # timeout=10
20 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
21 > git config remote.origin.url https://github.com/Anthonyliu86/pipeline-skills-demo.git # timeout=10
22Fetching upstream changes from https://github.com/Anthonyliu86/pipeline-skills-demo.git
23using GIT_ASKPASS to set credentials
24 > git fetch --tags --progress https://github.com/Anthonyliu86/pipeline-skills-demo.git +refs/heads/*:refs/remotes/origin/*
25 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
26 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
27Checking out Revision 70e67020389d17701784a1fc46b5d50fdfd06211 (refs/remotes/origin/master)
28 > git config core.sparsecheckout # timeout=10
29 > git checkout -f 70e67020389d17701784a1fc46b5d50fdfd06211
30Commit message: "fix: add steps"
31First time build. Skipping changelog.
32[Pipeline] }
33[Pipeline] // stage
34[Pipeline] withEnv
35[Pipeline] {
36[Pipeline] stage
37[Pipeline] { (Hello Pipeline)
38[Pipeline] script
39[Pipeline] {
40[Pipeline] echo
41Hello Pipeline!
42[Pipeline] echo
43ProjectA-pipeline-demo
44[Pipeline] echo
453
46[Pipeline] }
47[Pipeline] // script
48[Pipeline] }
49[Pipeline] // stage
50[Pipeline] }
51[Pipeline] // withEnv
52[Pipeline] }
53[Pipeline] // node
54[Pipeline] End of Pipeline
55Finished: SUCCESS
56
以上就是Pipeline项目的开发环境介绍,上面整个过程包含pipeline项目代码风格,如何创建git项目,如何提交代码,如何查看运行结果,如何根据错误,去修改代码,解决报错或者bug。接下来几篇文章,我就来介绍前面没有介绍过一些语法或者叫技巧。