继续使用上次的实验环境,这次是使用pipeline的多分支示例,文章的代码是示例代码中的,我只是加入了Jenkinsfile文件,并提交到我自己的Gitlab仓库。
Jenkins版本为:2.89.4
maven:3.3.9
JDK:1.8.0
因为上一篇直接是Jenkins的项目里写pipeline 脚本,这次使用的是Jenkinsfile,此文件是保存在项目代码的根目录下:
注意:这里的文件名Jenkinsfile要跟配置项目中的名字一致。
文件的位置,放在代码的根目录。
[root@jenkins pipeline-test01]# tree -L 1
.
├── Jenkinsfile
├── pom.xml
├── README.md
└── src
先看看Jenkinsfile的文章内容是什么:
[root@jenkins pipeline-test01]# cat Jenkinsfile
pipeline {
agent any
stages {
stage('Package') {
steps {
sh "'mvn' -Dmaven.test.failure.ignore clean package"
}
}
stage('Results') {
steps {
junit '**/target/surefire-reports/TEST-*.xml'
}
}
stage('Deploy') {
steps {
echo "pipeline success!"
archive 'target/*.jar'
}
}
}
post {
always {
mail to: 'service@58jb.com',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
}
这个配置文件跟上一次的配置文件中多了一个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,通过它把公钥传到目标服务器上。
修改前:
grep "jenkins" /etc/passwd
jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/false
修改后:
[root@jenkins ~]# usermod -s /bin/bash jenkins
[root@jenkins ~]# grep "jenkins" /etc/passwd
jenkins:x:996:994:Jenkins Automation Server:/var/lib/jenkins:/bin/bash
同时需要给它添加一个密码:
[root@jenkins ~]# echo "123456"|passwd --stdin jenkins
Changing password for user jenkins.
passwd: all authentication tokens updated successfully
创建密钥并传到目标服务器:
[root@jenkins ~]# su - jenkins
Last login: Tue Feb 27 15:39:52 CST 2018 on pts/0
-bash-4.2$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/jenkins/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/jenkins/.ssh/id_rsa.
Your public key has been saved in /var/lib/jenkins/.ssh/id_rsa.pub.
The key fingerprint is:
c9:d3:dc:75:ce:a6:98:05:d7:9e:06:e7:42:60:1b:f0 jenkins@jenkins
The key's randomart image is:
+--[ RSA 2048]----+
| ..+ |
| o + . |
| E.oo.o|
| . + ..++=.|
| S o ...+=|
| . +oo |
| o . |
| |
| |
+-----------------+
-bash-4.2$ ssh-copy-i jenkins
前提这个主机名要在/etc/hosts文件中添加映射,不然直接使用IP地址。
完成上面步骤后再执行Pipeline项目即可成功运行。
方法2、创建一个普通用户,利用它做ssh免密认证,然后给jenkins用户添加一个sudo免密切换到这个普通用户操作的权限即可。