Jenkins是基于Java开发的一种持续集成工具,主要用于持续、自动构建/测试软件项目、监控外部任务的运行,功能包括:
持续的软件版本发布/测试项目。
监控外部调用执行的工作。
为什么使用Jenkins?
先来看看一般的后端项目发布流程:
1、本地或打包服务器利用maven打成war包
2、远程或者SSH连上项目服务器
3、停掉tomcat,删除旧包和缓存,将新打的包放进去
4、重启tomcat,完成
看似步骤简单,其实占用了大量开发和运维的时间。
使用Jenkins后:
1、点击立即构建,完成。
什么?点击个按钮就完成了?没错,就是个按钮。其实在你点击按钮后Jenkins已经帮你把上述该走的流程后台跑了一遍了。再搭配Gitlab的githooks可实现提交代码后自动构建发布,连按钮也不需要点了。
在开发项目的过程中会部署测试环境来验证产品功能,重复以上操作会显得很繁琐,浪费大量时间,所以使用Jenkins来实现持续集成,对整个开发项目的过程有着重要的意义。使用Jenkins后,可节省手动发布时间成本,避免人工打包出错,同时也能及时发现系统开发集成过程中产生的问题。
本文接下来介绍如何基于Jenkins+Maven+Git(GitLab)持续集成Java项目。

上图为Java测试环境从代码提交到应用部署的自动化完整流程。
下面我们具体来看Jenkins的安装和配置。
现场测试环境如下,两台Linux虚拟机,安装好以下软件:
| 名称 | IP | 安装软件 |
| 代码托管、持续集成 | 192.168.3.144 | JDK1.8、Maven3.5.4、Git1.7.1、Gitlab、Jenkins |
| 应用服务器 | 192.168.3.145 | JDK1.8、Tomcat |
分别检验上述软件的安装情况:
检验JDK环境

检验Maven

检验Git

检验Gitlab

添加访问Gitlab的ssh凭证
在192.168.3.144使用root用户生成公钥和私钥
执行ssh-keygen-t rsa,在/root/.ssh/目录生成公钥和私钥
id_rsa:私钥文件id_rsa.pub:公钥文件

把生成的公钥放在Gitlab中
登录192.168.3.144->点击头像->Settings->SSHKeys

Jenkins提前安装完毕。以Tomcat的war包形式来安装,启Jenkins。

安装相关插件
发布插件Deploy to container Plugin
Maven插件Maven Integration plugin
Git插件Git plugin
SSH插件Publish Over SSH
Gitlab插件GitLab Plugin
Gitlab钩子插件Gitlab Hook Plugin
在Jenkins中配置SSHServers

构建Maven项目

源码管理
填写git地址信息,由于已配置ssh,无需配置认证凭据

构建触发器
Buildwhen a change is pushed to GitLab:检测到Gitlab项目代码提交后就触发

同时需要在Gitlab的Webhooks中配置上图圈出的地址,勾上Pushevents触发

打包前步骤
根据自己需求可以添加一些操作:如一些shell命令

Build打包构建
RootPOM:指定pom.xml的文件路径(这里是相对路径)
Goalsand options:mvn的选项,构件参数

构建后操作
把构建好的jar包推送至应用主机,并执行启停脚本拉起应用服务

stop.sh
#!/bin/sh
APP_NAME=amp_dev_server.jar
tpid=`ps-ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [${tpid} ]; then
echo'Stop Process...'
kill-15 $tpid
fi
sleep5
tpid=`ps-ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [${tpid} ]; then
echo'Kill Process!'
kill-9 $tpid
else
echo'Stop Success!'
fi
start.sh
#!/bin/sh
source/etc/profile
APP_NAME=amp_dev_server.jar
tpid=`ps-ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [${tpid} ]; then
echo 'App is running.'
else
echo 'App is NOT running.'
fi
#!/bin/sh
rm-f tpid
nohupjava -jar home/gpadmin/soft/amp_dev_server/amp_dev_server.jar--spring.profiles.active=test>/home/gpadmin/soft/amp_dev_server/amp_dev_server.log 2>&1&
echo$! > tpid
echoStart Success!
到此配置完成,保存即可。
Jenkins常用构建方式有三种:
手动构建:用于测试环境或者预上线环境部署,只需要在Jenkins的界面点立即构建即可执行
触发式构建:用于开发环境部署,开发人员可以push代码或者合并代码到Gitlab项目的开发分支上,Jenkins就自动部署代码到对应服务器
定时构建:在参数化构建基础上添加,可以每天定时打包
验证项目是否构建成功

Jenkins使用各种颜色表示任务当前的状态:
蓝色:任务最近一次构建是成功的
红色:任务最后一次构建是失败的
黄色:任务最后一次构建表示成功了,但不稳定(主要是因为有失败的测试)
灰色:任务从未被执行过或被禁用了
Jenkins使用一组天气图标表示任务长期的一个状态,他们分别是:
万里晴空,任务80%以上的集成都是成功的
稍有乌云,任务有60%~80%的集成是成功的
乌云密布,任务只有40%~60%的集成是成功的
阴雨绵绵,任务的集成成功率只有20%~40%
电闪雷鸣,任务的集成成功率不到20%
实际上,产品在从需求到部署的过程中,会经历若干种不同环境,例如各种自动化测试运行环境、仿真环境、生产环境等。这些环境的搭建、配置、管理过程中,产品对应也需要在不同环境中进行部署,状况也会比较复杂,从头到尾地全自动持续部署的确困难。但如果能克服困难,做到持续交付,保证代码在整个上线流程环境没问题,整个团队就能做到有的放矢,也更加有力的保证了代码上线质量。所以,持续集成、持续部署和持续交付提供了一个优秀的DevOps环境,对于整个团队来说,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。未来已经改变,不变者终将被淘汰。




