jenkins利用pipeline实现多个代码分支打包


      继续使用上次的实验环境,这次是使用pipeline的多分支示例,文章的代码是示例代码中的,我只是加入了Jenkinsfile文件,并提交到我自己的Gitlab仓库。

Jenkins版本为:2.89.4

maven:3.3.9

JDK:1.8.0

因为上一篇直接是Jenkins的项目里写pipeline 脚本,这次使用的是Jenkinsfile,此文件是保存在项目代码的根目录下:

注意:这里的文件名Jenkinsfile要跟配置项目中的名字一致。

 
文件的位置,放在代码的根目录。
  1. [root@jenkins pipeline-test01]# tree -L 1 
  2. ├── Jenkinsfile 
  3. ├── pom.xml 
  4. ├── README.md 
  5. └── src 

先看看Jenkinsfile的文章内容是什么:

  1. [root@jenkins pipeline-test01]# cat Jenkinsfile  
  2. pipeline { 
  3.     agent any 
  4.     stages { 
  5.         stage('Package') { 
  6.             steps { 
  7.                 sh "'mvn' -Dmaven.test.failure.ignore clean package" 
  8.             } 
  9.         } 
  10.         stage('Results') { 
  11.             steps { 
  12.                 junit '**/target/surefire-reports/TEST-*.xml' 
  13.             } 
  14.         } 
  15.         stage('Deploy') { 
  16.             steps { 
  17.                 echo "pipeline success!" 
  18.                 archive 'target/*.jar' 
  19.             } 
  20.         }                    
  21.     } 
  22.     post { 
  23.         always { 
  24.             mail to: 'service@58jb.com', 
  25.                 subject: "Failed Pipeline: ${currentBuild.fullDisplayName}", 
  26.                 body: "Something is wrong with ${env.BUILD_URL}" 
  27.         } 
  28.     } 

这个配置文件跟上一次的配置文件中多了一个post段,这一段是发邮件。这里配置每一次编译打包都发邮件。这里要说明一下,如果因为Jenkinsfile的配置文件错误导致打包项目失败是不会发邮件的,只有在编译,打包项目时不管理成功还是失败都发邮件。

建立方法,进入blue界面,http://10.0.10.100:8080/blue/pipelines,点击右边的新的pipeline,选择代码仓库【Git】

 

 

gitlab的配置 

 

 
它会提示你,如果项目是使用ssh认证的就要添加一个证书,如果是直接公开的项目就是都可以克隆的项目就可以不用。但是上面的Warning提示如果不使用ssh来登陆验证的话无法就无法编辑和保存配置。
 
如果没有添加上面的ssh-key认证的情况如下,击pipelines----分支----Edit时弹出如下提示:
 
 
如果加入了ssh-key认证的方式就可以看到如下效果:
 
 
 
当初次加入项目代码并点击上面的创建pipeline后就会自动获取git项目地址上的所有分支,如果甘个分支下没有Jenkinsfile文件就会有错误提示,而成功的状态为下图那样。,黄叹号表示不稳定,但是通过了测试。
 
 
在分支列表出可以看到有哪些分支。
 
 
点击右边的那几个按钮可以启动、查看构建历史记录,编辑配置和收藏。
 
 接下来添加一个发布到远程机器的shell即可。
 
 
 

 这里特别说明:

这里的ssh免密认证很多人默认会使用root或者其它的用户来做。然而在系统的shell里执行也是没问题可以直接免密登陆或者操作。而在Jenkins这里写上scp命令传文件执行时还是会出现以下错误。

 

为什么明明是在shell里可以执行的,而放到Jenkins上执行就提示认证失败?那是因为默认使用rpm安装的jenkins使用了一个叫jenkins的用户来运行程序。所以执行这个scp命令的用户也就是jenkins用户。

解决方法:

方法1、修改jenkins用户的环境变量,切换到jenkins用户下并创建ssh-keygen,通过它把公钥传到目标服务器上。

修改前:

 

  1. grep "jenkins" /etc/passwd 
  2. jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false 

修改后:

 

  1. [root@jenkins ~]# usermod -s /bin/bash jenkins 
  2.  
  3. [root@jenkins ~]# grep "jenkins" /etc/passwd 
  4. jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/bash 

同时需要给它添加一个密码:

 

  1. [root@jenkins ~]# echo "123456"|passwd --stdin jenkins 
  2. Changing password for user jenkins. 
  3. passwd: all authentication tokens updated successfully 

创建密钥并传到目标服务器:

 

  1. [root@jenkins ~]# su - jenkins 
  2. Last login: Tue Feb 27 15:39:52 CST 2018 on pts/0 
  3. -bash-4.2$ ssh-keygen -t rsa 
  4. Generating public/private rsa key pair. 
  5. Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):  
  6. Enter passphrase (empty for no passphrase):  
  7. Enter same passphrase again:  
  8. Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa. 
  9. Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub. 
  10. The key fingerprint is: 
  11. c9:d3:dc:75:ce:a6:98:05:d7:9e:06:e7:42:60:1b:f0 jenkins@jenkins 
  12. The key's randomart image is: 
  13. +--[ RSA 2048]----+ 
  14. |         ..+     | 
  15. |          o +  . | 
  16. |           E.oo.o| 
  17. |       . + ..++=.| 
  18. |        S o ...+=| 
  19. |         .   +oo | 
  20. |            o .  | 
  21. |                 | 
  22. |                 | 
  23. +-----------------+ 
  24. -bash-4.2$ ssh-copy-i jenkins 
  25. 前提这个主机名要在/etc/hosts文件中添加映射,不然直接使用IP地址。 

完成上面步骤后再执行Pipeline项目即可成功运行。 

方法2、创建一个普通用户,利用它做ssh免密认证,然后给jenkins用户添加一个sudo免密切换到这个普通用户操作的权限即可。