专栏名称: java那些事
分享java开发中常用的技术,分享软件开发中各种新技术的应用方法。每天推送java技术相关或者互联网相关文章。关注“java那些事”,让自己做一个潮流的java技术人!《java程序员由笨鸟到菜鸟》系列文章火热更新中。
目录
相关文章推荐
Java编程精选  ·  为什么不建议用 equals 判断对象相等? ·  昨天  
芋道源码  ·  Java 新魔法:利用 Function ... ·  14 小时前  
芋道源码  ·  SpringBoot CORS ... ·  2 天前  
芋道源码  ·  DeepSeek 全面指南:95% ... ·  4 天前  
51好读  ›  专栏  ›  java那些事

「Jenkins+Git+Maven+Shell+Tomcat持续集成」经典教程

java那些事  · 公众号  · Java  · 2019-03-29 16:00

正文

作者:mousycoder(极简小站)

来源地址:segmentfault.com/a/1190000002895521


Jenkins 是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变得可能。现在软件开发追求的是效率以及质量,Jenkins使得自动化成为可能!


亮点

1.采用shell自定义脚本,控制集成部署环境更加方便灵活

2.精简war包中的lib包,常驻tomcat里,减少war包传输时间

3.Jenkins 用户权限管理,不让淘气鬼乱动

4.构建失败发邮件通知相关人员解决

5.自动按天备份war包,Jenkins配置备份以及版本控制化


环境

Ubuntu 14.10 (GNU/Linux 3.16.0-33-generic x86_64)


准备工作

1.Git版本控制服务器

2.Tomcat发布服务器

3.Jenkins服务器(提前安装好Maven,Git,Jdk)


实验时可以在同一台机器配置,但是生产不建议,一台机器挂了,所有服务器都挂了。


废话不多说,直接上干货!


步骤


安装Jenkins

下载Jenkins War包,Jenkins官网 。

启动Jenkins ,将War包放入Tomcat容器里,启动Tomcat。

提示:

此时Jenkins在初始化配置目录,其默认配置目录路径为当前用户下的.jenkins目录,用户也可以自定义目录,Jenkins默认是把配置文件中的数据读到内存中,如果你替换了之前的配置文件,此时需要点击Jenkins的读取设置或者重启Tomcat,如果此时Jenkins页面无响应,则应该查看Tomcat的Catalina.out,多半是由于内存溢出造成(解决方法增大Tomcat调用Java虚拟机时内存大小,本文不做重点),运行Jenkins的服务器配置最好内存1G以上,因为后续会加入一些Jenkins插件,有一些会比较占用内存,导致Jenkins启动不了。


安装Jenkins插件

1.Email Extension Plugin (邮件通知)

2.GIT plugin (可能已经默认安装了)

3.Publish Over SSH (远程Shell)


安装方法:

首页->系统管理->管理插件->可选插件->过滤(搜索插件名)->勾选->点击最下面直接安装即可(需要等待一段时间,详情可以看catalina.out日志变化)



配置Jenkins

配置基本信息

每个选项后都有个问号解释当前含义(此步新手可以略过,默认不填即可)

配置方法:首页->系统管理->系统设置


配置邮件

管理员邮件地址就是邮件的发件人地址(必须和后面邮件配置发件人邮箱一致,否则发不成功邮件)


配置Jdk

JAVA_HOME为Jdk路径 其中Jdk也可以从这里下载安装解压(不推荐,需要填写oracle account)

配置 Maven

配置 Maven Configuration

路径为maven的setting.xml路径(Maven安装略)


配置Maven项目


配置Maven安装目录


配置 Git

其中Path to Git executable为你git执行的路径 一般默认是/usr/bin/git ,如有差异,可以whereis git


配置 Publish over SSH

远程执行shell脚本 采用公钥私钥连接 其中Key里贴的是私钥 远程被管理的主机里贴的是公钥,这2台主机就是相互信任,这样scp等操作就不需要输入用户名和密码。


公钥私钥生成方法:


1.管理主机linux 上 ssh-keygen -t rsa -C "[email protected] 一路回车 会在/root/.ssh下生成id_rsa(私钥) id_rsa.pub(公钥)。


2.copy 公钥的内容到远程需要通信(被管理)的主机 /root/.ssh/authorized_keys 如无此目录文件则手动创建。


配置完之后可以Test Configuration


配置 Job

步骤:首页->新建->构建一个maven项目(输入item名称)->进入该项目->配置

JOB基本信息


项目源码管理

Repository UR 项目地址 Credentials授权可以是SSH也可以是用户名密码(SSH方法同上)


选择需要构建的分支,我们项目采用git工作流 默认master和develop 平时开发构建develop分支,正式上线构建master并且打标签(前公司git提交标准化相当复杂,分支相当多,这里大家可以根据实际情况来)。

构建触发器

这里我们选择poll轮询每隔1分钟去检测git仓库代码库版本,如果有更改则立刻构建,这里大家可以根据自己团队实际情况去制定,当然还有另外一个插件gitlab-hook可以主动去通知jenkins构建,不过插件所占内存比较大,需要增大tomcat虚拟机内存配置,不然会内存溢出,个人觉得如果一个团队人很多的话,选择poll更适合并且时间间隔设置长一些,避免频繁构建,gitlab-hook 适合人很少甚至一个人的情况。


构建命令

我们采用最简单的clean install 当然这里可以根据各自需求

例如 部署后的产物上传到nexus等,详情参考 Maven命令


clean install deploy:deploy- file -DgroupId=com.weitoo -DartifactId=common -Dversion= 0.1 - SNAPSHOT -Dpackaging=jar -Dfile=D:workspace server -aggregatorcommon argetcommon -0.1 -SNAPSHOT.jar -Durl= http :// 192.168 .0 .200 : 8081 /nexus/ content /repositories/thirdparty/ -DrepositoryId=thirdparty



Add post-build step

构建成功后执行shell命令

该shell的目的是取出war包lib中其他所有lib包 只留下common-0.1-SNAPSHOT.jar 大大减少war包大小(完整war包30M 传包到阿里云服务器需要2分多,精简后2M,10秒多,大大提高构建速度)。

分享我的Shell


mv ~/.jenkins/ jobs /server/workspace/server/target/server/WEB-INF/lib/common-0.1-SNAPSHOT.jar ~/.jenkins/ jobs /server/workspace/server/target/
rm -rf ~/.jenkins/ jobs /server/workspace/server/target/server/WEB-INF/lib/*
rm -rf ~/.jenkins/ jobs /server/workspace/server/target/server.war
mv ~/.jenkins/ jobs /server/workspace/server/target/common-0.1-SNAPSHOT.jar ~/.jenkins/ jobs /server/workspace/server/target/server/WEB-INF/lib/
cd ~/.jenkins/ jobs /server/workspace/server/target/server/
zip -r ~/.jenkins/ jobs /server/workspace/server/target/server.war * -r
scp /root/.jenkins/ jobs /server/workspace/server/target/server.war [email protected]:/opt/war/


构建成功远程执行shell脚本

exec command 是远程sh的路径


分享我的publish.sh文件

作用是备份每次上传的war包 重启Tomcat。


export JAVA_HOME=/opt/software/jdk1.7.0_25
TOMCAT_HOME= "/opt/software/apache-tomcat-7.0.59"
TOMCAT_PORT=80
PROJECT= "server"
BAK_DIR=/opt/war/bak/ $PROJECT /`date +%Y%m%d`



mkdir -p " ${BAK_DIR} "
cp /opt/war/ " ${PROJECT} " .war " ${BAK_DIR} " / " ${PROJECT} " _`date +%Y%m%d%H%M%S`.war


#shutdown tomcat
/opt/sh/ kill -tomcat-force.sh

#publish project
rm -rf " ${TOMCAT_HOME} " /webapps/ ${PROJECT}
cp /opt/war/ " ${PROJECT} " .war " ${TOMCAT_HOME} " /webapps/ ${PROJECT} .war

#remove tmp
rm -rf /opt/war/ ${PROJECT} .war

#unzip war
unzip " ${TOMCAT_HOME} " /webapps/ ${PROJECT} .war -d " ${TOMCAT_HOME} " /webapps/ ${PROJECT}

rm -rf " ${TOMCAT_HOME} " /webapps/ ${PROJECT} .war

##copy lib
cp /opt/lib/* " ${TOMCAT_HOME} " /webapps/ ${PROJECT} /WEB-INF/lib/

## start tomcat

sleep 3

#start tomcat
/opt/software/apache-tomcat-7.0.59/bin/startup.sh
echo "tomcat is starting!"



分享我的kill-tomcat-force.sh文件

作用是强制关闭tomcat进程


set fileformat=unix


path=/ opt /software/apache-tomcat- 7.0 . 59 /bin

ps -ef| grep $path| grep






请到「今天看啥」查看全文