点击上方 Java后端,选择 设为星标
优质文章,及时送达
作者:极简小站
mousycoder.com/2015/10/14/jenkins-git-maven-shell-tomcat-ci/
亮点
-
采用 shell 自定义脚本, 控制集成部署环境更加方便灵活
-
精简 war 包中的 lib 包, 常驻 tomcat 里,减少 war 包传输时间
-
Jenkins 用户权限管理
-
构建失败发邮件通知相关人员解决
-
自动按天备份 war 包, Jenkins 配置备份以及版本控制化
环境
准备工作
-
Git 版本控制服务器
-
Tomcat 发布服务器
-
Jenkins 服务器 (提前安装好 Maven,Git,Jdk)
步骤
安装 Jenkins
此时 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
配置 Git
PathtoGitexecutable
为你 git 执行的路径 一般默认是 / usr/bin/git , 如有差异,可以 whereis git
配置邮件
构建通知:$PROJECT_NAME - Build# $BUILD_NUMBER - $BUILD_STATUS!
(本邮件是程序自动下发的,请勿回复,<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
不需要输入用户名和密码。
-
管理主机 linux 上
ssh-keygen-t rsa-C"mousycoder@foxmail.com
一路回车 会在 / root/.ssh 下生成 idrsa(私钥) idrsa.pub(公钥)。
/root/.ssh/authorized_keys
如无此目录文件则手动创建。Repository UR 项目地址 Credentials 授权可以是 SSH 也可以是用户名密码 (SSH 方法同上)
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
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/
execcommand
是远程 sh 的路径
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!"
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_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 的时候,就需要这里放公共的 lib 包,避免 tomcat 加载多余的 jar 包, 消耗内存。
我们选择构建失败Failure-1st触发器,失败以后发邮件给开发者,(这里可以根据实际需要,配置,可以配置多个触发器)开发者的邮件在RecipientList里配置。
Jenkins 用户权限管理
基本配置:
只有注册的用户才能操作, 当然如果是大企业的话,可以采用项目矩阵授权策略, 详情可以 Google。
Jenkins 配置的备份和版本控制
/root/.jenkins/ 加入 git 版本库里即可, 该目录下包含 Jenkins 所有信息, 包括每次构建历史信息和历史 jar 包
进行全备份然后覆盖掉该文件夹的时候,重新构建 JOB 会出现文件夹已经存在等 exception,
只需要手动删掉这些目录即可,不会丢失数据。(
这是 Jenkins 的一个 bug, 参考 JENKINS-21330)
参考资料
-
Jenkins 权威指南
-
jdkleo
如果您认为本文质量不错,读后觉得收获很大,不妨小额赞助我一下,让我更有动力继续写出高质量的文章。
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。