1. Jenkins简介
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
本文研究一下在CentOS7(IP为192.168.56.104)上安装部署Jenkins,可以管理部署GitLab中的项目(IP为192.168.56.103)到Web服务器(IP为192.168.56.105)。
2. 环境准备
1、在Jenkins服务器编辑hostsvim /etc/hosts
,添加:
1 | 192.168.56.103 gitlab.voidking.com |
2、创建密钥ssh-keygen
/root/.ssh目录下生成了私钥id_rsa和公钥id_rsa.pub。
3、添加公钥到gitlab
浏览器访问 https://gitlab.voidking.com/profile/keys ,把公钥粘贴进去。
4、安装gityum install git
3. 安装Jenkins
Jenkins依赖Java,因此首先参考《全平台安装JDK》,安装配置好JDK,然后如下步骤安装Jenkins。
1、添加jenkins源:
1 | wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo |
2、安装jenkins:
1 | yum install jenkins |
3、启动jenkins:
1 | service jenkins start |
Jenkins安装目录:/usr/lib/jenkins/
。
Jenkins配置文件:/etc/sysconfig/jenkins
。
4、防火墙设置
1 | firewall-cmd --add-port=8080/tcp --permanent |
5、基本设置
浏览器访问 http://192.168.56.104:8080 ,即可看到jenkins页面。cat /var/lib/jenkins/secrets/initialAdminPassword
查看管理员密码,填入页面,继续;安装推荐的插件;创建第一个管理员;设置Jenkins URL;开始使用Jenkins。
4. 使用Jenkins
1、新建项目
点击新建Item或者创建一个新任务,新建项目。
选择Freestyle project,输入名称,确定。
2、设置源码管理
点击源码管理Tab页,选择Git,Repository URL填入git@gitlab.voidking.com:root/voidking.git
。此时提示没有权限访问,Credentials后面点击添加,Jenkins。
Domain全局凭据(unrestricted),类型选择SSH Username with private key,范围选择全局,Username输入root,然后把id_rsa中的内容粘贴进去,添加。然后在Credentials一栏root,页面上的警告就消失了。最后保存即可。
3、构建项目
在voidking项目页面,点击立即构建,即可完成项目构建。点击控制台输出,可以看到整个构建过程。
从构建过程可以看出,整个过程只拉取了一次代码,其他啥也没做,代码存放在/var/lib/jenkins/workspace/voidking目录。
5. 构建JavaWeb项目
构建JavaWeb项目的基本原理:Jenkins从GitLab拉取项目代码,然后在workspace的项目目录中执行mvn install命令生成war包,最后拷贝war包到Web服务器的webapps目录中并启动tomcat。
5.1. GitLab项目准备
1、使用本地环境(JDK+Tomcat+Maven),生成JavaWeb项目的war包并放入Tomcat进行测试,本文中使用pandawork-start项目。
2、上传Maven JavaWeb项目的源码到gitlab。如果gitlab不允许git push -f
,那么在gitlab中点击项目名,Settings,Repository,修改Protected Branches的配置即可。
5.2. Web服务器准备
1、安装JDK,参考参考《全平台安装JDK》。
2、安装Tomcat,参考CentOS7设置tomcat开机自启动。
3、安装Mysql,参考CentOS7设置mysql开机自启动。
4、配置免密登录,使Jenkins服务器可以免密访问Web服务器,使Jenkins可以免密访问Web服务器。ssh-copy-id -i .ssh/id_rsa.pub -p 22 root@192.168.56.105
5.3. Jenkins服务器配置
Jenkin服务器配置主要参考Jenkins安装及自动部署Maven项目。
1、安装配置Maven,参考centos7 安装maven。
2、登录Jenkins,系统管理,插件管理,可选插件,下载Maven Integration。
3、返回工作台,系统管理,全局工具配置。配置JDK,配置Maven,保存。
4、Jenkins工作台,新建项目,构建一个Maven项目。源码管理配置gitlab中的Java Web项目。
5、Build选项卡,Goals and Options,输入clean install -Dmaven.test.skip=true。
6、Post Steps选项卡,Add post-build step,执行shell,填入拷贝war包和启动tomcat命令,保存。
1 | scp /var/lib/jenkins/workspace/pandawork-start/target/pandawork-start.war root@192.168.56.105:/opt/apache-tomcat-8.5.43/webapps/ |
7、Jenkins工作台,点击Web项目,立即构建,控制台输出。
由上图可以看出,Maven项目构建成功,但是在执行远程拷贝脚本的时候出错,说明之前添加的免密登录没有生效。
8、给Jenkins用户添加免密登录。
(1)添加登录权限,vim /etc/passwd
,修改jenkins用户权限
1 | #jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false |
(2)切换到jenkins用户,su jenkins
(3)生成密钥,ssh-keygen
(4)密钥添加到Web服务器
1 | cd /var/lib/jenkins |
(5)再次构建项目,执行成功!
8、测试服务
浏览器访问 http://192.168.56.105:8080/pandawork-start/ ,即可看到hello world。
6. job并发构建
需求:已知有10个Java项目,名称分别为test1、test2、…、test10,现在想要使用jenkins对这10个项目进行构建。问题来了,如果使用同一个job,那么每个项目构建时都需要等待前一个项目构建完成,效率很低。如果使用10个job,那么这10个job的配置基本相同,以后如果有修改,维护成本很高。
这种情况下该怎么处理?使用job并发构建,参考jenkins 多用户同时触发构建。
1、登录Jenkins,系统管理,插件管理,可选插件,在过滤中输入build name
出现了 Build Name and Description Setter 插件,安装它。
安装完成重启jenkins。
2、创建一个自由风格的job,名为test
(1)参数化构建过程,添加字符参数,输入projectName
(2)勾选 在必要的时候并发构建
(3)增加构建步骤,Update build name,Use macro,Build name macro template,输入#${BUILD_NUMBER}_${projectName}
(4)勾选 Insert macro first
(5)增加构建步骤,执行shell,输入
1 | pwd |
(6)两次点击Build with Parameters,分别输入项目名test1和test2进行构建。
可以看到,Build History里的构建名称是两个不同的名称。
3、清除workspace
并发构建后,workspace下会生成test和test@2两个目录,如果并发量高了还会更多,此时需要清除workspace。
在job配置页面,增加构建后操作步骤,选择 Delete workspace when build is done。
7. 添加slave节点
1、新建节点
系统管理,新建节点,输入节点名称,选中固定节点,确定。
2、完善节点细节
输入描述(主机名),执行器数量(一般和节点CPU核数相同,此处填4),远程工作目录(/home/jenkins),标签(用于构建哪些项目,此处填project1),用法(只允许运行绑定到这台机器的Job),启动方式(Launch agent agents via SSH),主机(节点IP),Host Key Verification Strategy(Non verifying Verification Strategy),可用性(尽量保持代理在线)
3、证书配置
以上配置还漏了一个Credentials,这个需要详细说一下。
(1)在master节点使用root用户生成密钥对,ssh-keygen
(2)在slave节点添加master节点的公钥,vim /root/.ssh/authorized_keys
,把master节点的id_rsa.pub内容添加进去。
(3)在jenkins节点配置页面,上图红框的地方,添加,Jenkins。
(4)添加凭据,Domain(全局凭据),类型(SSH Username with private key),范围(全局),描述(root private key),Username(root),Private Key选中Enter directly,Key(粘贴master节点的id_rsa),添加。
4、启动代理
节点列表,点击节点名称,启动代理,建立master节点与slave节点的连接。
启动日志显示:
1 | <===[JENKINS REMOTING CAPACITY]===>channel started |
表示连接成功,成功加入了一个jenkins slave节点。
8. 指定slave节点构建
8.1. 方法一
1、在配置job时,勾选限制项目的运行节点,标签表达式输入“project1”(和slave节点的标签对应)。
2、构建项目,因为slave的执行器数量设置为4,所以当同时构建的数量在4以内时,会使用slave1;当同时构建的数量超过4个时,会使用slave2。
8.2. 方法二
1、登录Jenkins,系统管理,插件管理,可选插件,在过滤中输入node
找到 Node and Label parameter plugin 插件,安装它。
2、参数化构建过程,添加参数,Node。按住ctrl选择使用的机器,并且选中Allow multi node selection for concurrent builds。
9. 使用上次的参数构建
如果一个job的参数很多,那么每次构建都要输入很多参数,很麻烦,此时可以使用Rebuilder插件。
1、登录Jenkins,系统管理,插件管理,可选插件,在过滤中输入rebuilder
找到 Rebuilder 插件(This plugin is for rebuilding a job using the same parameters.),安装它。
2、构建项目页面,可以看到Rebuild Last选项,点击它使用上次参数再次构建。
也可以进入某次Build History,可以看到Rebuild选项,点击它,即可使用该次构建的参数再次构建。
10. 任务超时自动停止
如果一个构建任务,因为网络或者其他原因阻塞了,卡住了10分钟以上,这时我们希望这个任务能够自动停止。
1、登录Jenkins,系统管理,插件管理,可选插件,在过滤中输入timeout
。
找到 Build Timeout 插件(This plugin allows builds to be automatically terminated after the specified amount of time has elapsed.),安装它。
2、进入需要配置的job,配置,构建环境,勾选 Abort the build if it’s stuck。
- Time-out strategy 保持默认 Absolute
- Timeout minutes 调整为 10
- Time-out variable 不用填
- Time-out actions,Add action,Abort the build
11. Jenkins API
1、创建job
1 | curl -X POST JENKINS_URL/createItem \ |
2、构建
1 | curl -X POST JENKINS_URL/job/JOB_NAME/buildWithParameters \ |
3、查看buildnum
1 | curl -X POST JENKINS_URL/job/JOB_NAME/lastBuild/buildNumber |
如果使用postman测试的话,--user USER:TOKEN
对应 Authorization 中的 Basic Auth,Username和Password。--data-urlencode json
对应 Body 中的 x-www-form-urlencoded。
更多内容参考:
- Remote access API
- Python Jenkins documentation
- jjb/python-jenkins
- 使用API对Job进行操作
- build now option is not coming for job in jenkins
- Jenkins api too slow
12. 后记
至此,Jenkins安装配置完成,使用Jenkins配置部署了一个Java Web项目。本文中用到了三台服务器,分别是GitLab服务器、Web服务器和Jenkins服务器。Jenkins从GitLab拉取项目代码,然后在workspace的项目目录中执行mvn install命令生成war包,最后拷贝war包到Web服务器的webapps目录中并启动tomcat。