「Jenkins+Git+Maven+Shell+Tomcat持续集成」实用教程

点击上方 Java后端,选择 设为星标

优质文章,及时送达


作者:极简小站

链接:mousycoder.com/2015/10/14/jenkins-git-maven-shell-tomcat-ci/

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

亮点

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

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

  • Jenkins 用户权限管理

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

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

环境

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

准备工作

  • Git 版本控制服务器

  • Tomcat 发布服务器

  • 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 插件

  • EmailExtensionPlugin (邮件通知)

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

  • PublishOverSSH (远程 Shell)

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

配置 Jenkins

配置基本信息

每个选项后都有个问号解释当前含义,(此步新手可以略过,默认不填即可)
配置方法:首页 -> 系统管理 -> 系统设置

配置邮件

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

配置 Jdk

JAVA_HOME为 Jdk 路径 其中 Jdk 也可以从这里下载安装解压

配置 Maven

配置 Maven Configuration

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

配置 Maven 项目

配置 Maven 安装目录

配置 Git

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

配置邮件

邮件模板配置

配置好邮件的模板 (可自定义 html 编写) User Name 为用户名 Password 为密码 SMTP 不同邮箱不同, 请自行 google(另外 gmail 邮件如无代理翻墙,请勿用,推荐 163 比较好配置)

2020年最新的常问企业面试题大全以及答案

未翻墙

翻墙后

模板效果图

Default Subject 代码:

构建通知:$PROJECT_NAME - Build# $BUILD_NUMBER - $BUILD_STATUS!

模板 Default Content 分享:

(本邮件是程序自动下发的,请勿回复,<span style="color:red">请相关人员fix it,重新提交到git 构建</span>)<br/><hr/>
项目名称:$PROJECT_NAME<br/><hr/>
构建编号:$BUILD_NUMBER<br/><hr/>
GIT版本号:${GIT_REVISION}<br/><hr/>
构建状态:$BUILD_STATUS<br/><hr/>
触发原因:${CAUSE}<br/><hr/>
构建日志地址:<a href="${BUILD_URL}console">${BUILD_URL}console</a><br/><hr/>
构建地址:<a href="$BUILD_URL">$BUILD_URL</a><br/><hr/>
变更集:${JELLY_SCRIPT,template="html"}<br/><hr/>

配置邮件触发器
当失败的时候,会触发邮件通知,这个功能比较实用。

配置 Publish over SSH

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

公钥私钥生成方法:

  1. 管理主机 linux 上 ssh-keygen-t rsa-C"mousycoder@foxmail.com 一路回车 会在 / root/.ssh 下生成 idrsa(私钥) idrsa.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 虚拟机内存配置,不然会内存溢出。

构建命令

我们采用最简单的 clean install 当然这里可以根据各自需求
例如 部署后的产物上传到 nexus 等, 详情参考 Maven 命令

clean install deploy:deploy-file -DgroupId=com.weitoo -DartifactId=common -Dversion=0.1-SNAPSHOT -Dpackaging=jar -Dfile=D:\workspace\server-aggregator\common\target\common-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 root@123.56.xxx.xx:/opt/war/

构建成功远程执行 shell 脚本

execcommand 是远程 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
/opt/sh/kill-tomcat-force.sh
rm -rf "${TOMCAT_HOME}"/webapps/${PROJECT}
cp /opt/war/"${PROJECT}".war "${TOMCAT_HOME}"/webapps/${PROJECT}.war
q
rm -rf /opt/war/${PROJECT}.war
unzip "${TOMCAT_HOME}"/webapps/${PROJECT}.war -d "${TOMCAT_HOME}"/webapps/${PROJECT}
rm -rf "${TOMCAT_HOME}"/webapps/${PROJECT}.war
cp /opt/lib/* "${TOMCAT_HOME}"/webapps/${PROJECT}/WEB-INF/lib/
sleep 3
/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 tomcat|awk '{print $2}'
echo "exec $path/shutdown.sh"
$path/shutdown.sh
sleep 3s
ps -ef|grep $path|grep tomcat|awk '{print $2}'|xargs kill -9
echo "shutdown success"
ps -ef|grep $path|grep java|awk '{print $2}'

分享我的 Tomcat 精简方法

  • 在 tomcat_home/lib 下新建自定义 jar 包文件,导入项目所需其他 jar 包 (以后有新增的话,单独再导一次)

  • 修改 tomcat_home/conf/catalina.properties 搜索 =shared.loader 加上路径

shared.loader=${catalina.base}/lib/server,${catalina.base}/lib/server/*.jar,${catalina.home}/lib/server,${catalina.home}/lib/server/*.jar

此时 Tomcat 运行前会加载 server 下的 lib 包,如果是多个项目公用一个 tomcat 的时候,就需要这里放公共的 lib 包,避免 tomcat 加载多余的 jar 包, 消耗内存。

构建后邮件设置

邮件主题收件人配置

邮件触发器

局部配置会覆盖掉全局配置, 我们之前在全局配置里配置了构建失败邮件触发器, 这里是更加精细的配置,

我们选择构建失败Failure-1st触发器,失败以后发邮件给开发者,(这里可以根据实际需要,配置,可以配置多个触发器)开发者的邮件在RecipientList里配置。

Jenkins 用户权限管理

步骤:首页 -> 系统管理 -> Configure Global Security
基本配置:
只有注册的用户才能操作, 当然如果是大企业的话,可以采用项目矩阵授权策略, 详情可以 Google。

Jenkins 配置的备份和版本控制

很多情况下稍不注意改变了 Jenkins 的配置,把平台弄坏了,又想去恢复,这个时候就得把 Jenkins 的配置文件进行配置或者版本化,只需要把 /root/.jenkins/ 加入 git 版本库里即可, 该目录下包含 Jenkins 所有信息, 包括每次构建历史信息和历史 jar 包
进行全备份然后覆盖掉该文件夹的时候,重新构建 JOB 会出现文件夹已经存在等 exception,只需要手动删掉这些目录即可,不会丢失数据。(这是 Jenkins 的一个 bug, 参考 JENKINS-21330)

参考资料

  • Jenkins 权威指南

  • jdkleo

感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,你的鼓励是作者写作最大的动力,
如果您认为本文质量不错,读后觉得收获很大,不妨小额赞助我一下,让我更有动力继续写出高质量的文章。