封尘网

让学习成为一种习惯!

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

继续使用上次的实验环境,这次是使用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免密切换到这个普通用户操作的权限即可。

提醒:本文最后更新于 508 天前,文中所描述的信息可能已发生改变,请谨慎使用。