一个计算机技术爱好者与学习者

0%

好好学Linux:CentOS7安装部署Jenkins

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服务器编辑hosts
vim /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、安装git
yum install git

3. 安装Jenkins

Jenkins依赖Java,因此首先参考《全平台安装JDK》,安装配置好JDK,然后如下步骤安装Jenkins。

1、添加jenkins源:

1
2
wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo 
rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

2、安装jenkins:

1
yum install jenkins

3、启动jenkins:

1
service jenkins start

Jenkins安装目录:/usr/lib/jenkins/
Jenkins配置文件:/etc/sysconfig/jenkins

4、防火墙设置

1
2
firewall-cmd --add-port=8080/tcp --permanent
systemctl reload firewalld

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
2
scp /var/lib/jenkins/workspace/pandawork-start/target/pandawork-start.war root@192.168.56.105:/opt/apache-tomcat-8.5.43/webapps/
ssh root@192.168.56.105 "nohup sh /opt/apache-tomcat-8.5.43/bin/startup.sh &"

7、Jenkins工作台,点击Web项目,立即构建,控制台输出。


由上图可以看出,Maven项目构建成功,但是在执行远程拷贝脚本的时候出错,说明之前添加的免密登录没有生效。

8、给Jenkins用户添加免密登录。
(1)添加登录权限,vim /etc/passwd,修改jenkins用户权限

1
2
#jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false
jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/bash

(2)切换到jenkins用户,su jenkins

(3)生成密钥,ssh-keygen

(4)密钥添加到Web服务器

1
2
cd /var/lib/jenkins
ssh-copy-id -i .ssh/id_rsa.pub -p 22 root@192.168.56.105

(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
2
3
4
5
6
pwd
for i in `seq 0 120`
do
echo "Project Name: "${projectName}
sleep 1s
done

(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
2
3
4
5
6
<===[JENKINS REMOTING CAPACITY]===>channel started
Remoting version: 3.36
This is a Unix agent
Evacuated stdout
Agent successfully connected and online
...

表示连接成功,成功加入了一个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
2
3
curl -X POST JENKINS_URL/createItem \
--user USER:TOKEN \
--data-urlencode json='{"name":"new_job","mode":"copy","from":"old_job"}'

2、构建

1
2
3
curl -X POST JENKINS_URL/job/JOB_NAME/buildWithParameters \
--user USER:TOKEN \
--data-urlencode json='{"parameter": [{"name":"id", "value":"123"}, {"name":"verbosity", "value":"high"}]}'

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。

更多内容参考:

12. 后记

至此,Jenkins安装配置完成,使用Jenkins配置部署了一个Java Web项目。本文中用到了三台服务器,分别是GitLab服务器、Web服务器和Jenkins服务器。Jenkins从GitLab拉取项目代码,然后在workspace的项目目录中执行mvn install命令生成war包,最后拷贝war包到Web服务器的webapps目录中并启动tomcat。

13. 书签