公司一直都是手动发布war包的,这里有一个问题,人为的操作是很容易出现问题的,于是想到用jenkins来进行发布war包,减少人工参与
一、安装jenkins(常规操作过程不表)
启动jenkins,修改默认端口号(8080)启动
-
打开终端,cd 到Jenkins的安装目录(即jenkins.war所在目录),如:D:\Program Files (x86)\Jenkins
-
执行命令:
java -jar jenkins.war --ajp13Port=-1 --httpPort=9999
二、需要安装jenkins插件:
1、集成GitLab插件
GitLab Plugin
This plugin integrates GitLab to Jenkins by faking a GitLab CI Server.
用于:
需要配置gitlib中的private Key等相关配置。
2、构建Maven项目需要用到的插件
Maven Integration plugin
This plug-in provides, for better and for worse, a deep integration of Jenkins and Maven: Automatic triggers between projects depending on SNAPSHOTs, automated configuration of various Jenkins publishers (Junit, ...).
用于:
指向本地的相关maven所在,用于打包命令。
3、发布远程war包的,将war包发送到远程Tomcat中
【注意!!!!!!!!】这种方法已经弃用,因为tomcat的自动发布功能经常出现故障,导致发布失败。
Deploy to container Plugin
This plugin allows you to deploy a war to a container after a successful build.
Glassfish 3.x remote deployment
目的:
指定jenkins服务器中的war包路径,通过配置tomcat目录下的tomcat-users.xml文件可以实现远程发布war包到指定路径。但是这里有一个问题,需要启动远程tomcat才可以成功提交,觉得这种方式不是很靠谱,想换一种基于shell命令的方式进行的项目部署。
4、将本地war包上传到远端服务器,然后执行shell脚本
Publish over SSH
5、远程运行shell脚本
SSH
配置在远程tomcat中可以执行的shell脚本命令
三、相关步骤
3.1 jenkins启动
-
启动jenkins
由于我是使用homebrew来安装jenkins的,需要在终端中输入代码:shell brew info jenkins -
打开终端,cd 到Jenkins的安装目录(即jenkins.war所在目录)
cd /usr/local/Cellar/jenkins/2.102/libexec -
启动jenkins,修改默认端口号(8080)启动,执行命令:
java -jar jenkins.war --ajp13Port=-1 --httpPort=9999 -
输入url,访问jenkins:
http://localhost:9999
3.2 jenkins 配置
3.2.1 系统管理
- 系统设置:全局设置&路径。
-
SSH remote hosts
配置远端SSH连接相关参数
填写相关参数后,需要点击“check connection”按钮检查是否能成功连通。

-
Gitlab
Gitlib相关参数配置
这一步需要填写gitLib中的相关参数,复制过来。

-
Publish over SSH
利用SSH,将文件复制到远程服务器特定文件夹中,并且可以执行自定义shell脚本。

- 全局工具配置: 工具配置,包括他们的位置和自动安装器。
- Maven
配置打包gitlib代码的相关命令。

- 管理插件:添加、删除、禁用或启用Jenkins功能扩展插件。
使用的插件:
-
Git Parameter Plug-In
Adds ability to choose from git repository revisions or tags。 -
GitLab Plugin
This plugin integrates GitLab to Jenkins by faking a GitLab CI Server. -
Publish Over SSH
Send build artifacts over SSH -
Maven Integration plugin
This plug-in provides, for better and for worse, a deep integration of Jenkins and Maven: Automatic triggers between projects depending on SNAPSHOTs, automated configuration of various Jenkins publishers (Junit, ...). -
SSH plugin
This plugin executes shell commands remotely using SSH protocol.
3.2.2 项目配置

-
General

-
源码管理

-
构建触发器

-
构建环境

-
Pre Steps

-
Build

-
Post Steps

注意事项:

- 构建设置
保持默认即可
3.3 shell脚本
shell脚本步骤:
- 备份原来war包解压的folder。
- 关闭运行中的tomcat。
- 复制上传后的war到webapps目录。
- 启动tomcat。
- 删除上传到临时文件夹中的war包。
#!/bin/bash
#defined
#TOMCAT_INFO
TOMCAT_HOME="/u03/samp/soft/apache/tomcats/tomcat-flow-19008"
TOMCAT_PORT="19008"
TOMCAT_NAME="tomcat-flow-19008"
TOMCAT_WEBAPPS_NAME="webapps"
TOMCAT_SHUTDOWN=$TOMCAT_HOME/bin/shutdown.sh
TOMCA_START=$TOMCAT_HOME/bin/startup.sh
PROJECT_NAME="fzsFlow"
##临时上传的war包名称
TEMP_UPLOAD_WAR_NAME="tempUploadWar"
## 时间戳 eg:20180510142558
DATE_TIME=$(date +%Y%m%d%H%M%S)
## 备份文件夹名称,备份服务器中正在运行的folder
BACKUP_RUNNING_WAR_FOLDER_NAME="backupRunningWar"
#创建备份文件夹
function createBackFolder(){
## 创建备份文件夹(若没有则创建) begin
echo ---------------------------备份文件夹$TEMP_UPLOAD_WAR_NAME,备份临时上传的war(若没有则创建) beginning
if [ -d "$TOMCAT_HOME/$TEMP_UPLOAD_WAR_NAME" ] ; then
echo "文件夹存在!"
else
echo "文件夹不存在,创建文件夹:$TEMP_UPLOAD_WAR_NAME"
cd $TOMCAT_HOME
mkdir $TEMP_UPLOAD_WAR_NAME
fi
echo ---------------------------备份文件夹$TEMP_UPLOAD_WAR_NAME,备份临时上传的war(若没有则创建) end
echo ---------------------------备份文件夹$BACKUP_RUNNING_WAR_FOLDER_NAME,备份服务器中正在运行的folder(若没有则创建) beginning
if [ -d "$TOMCAT_HOME/$BACKUP_RUNNING_WAR_FOLDER_NAME" ] ; then
echo "文件夹存在!"
else
echo "文件夹不存在,创建文件夹:$BACKUP_RUNNING_WAR_FOLDER_NAME"
cd $TOMCAT_HOME
mkdir $BACKUP_RUNNING_WAR_FOLDER_NAME
fi
echo ---------------------------备份文件夹$BACKUP_RUNNING_WAR_FOLDER_NAME,备份服务器中正在运行的folder(若没有则创建) end
# 创建备份文件夹 end
}
#备份运行中的代码
function backUpRunningCode(){
echo ---------------------------备份服务器原来文件夹 beginning
## 先备份原war解压后的folder
cd $TOMCAT_HOME/$TOMCAT_WEBAPPS_NAME
zip -r $TOMCAT_HOME/$BACKUP_RUNNING_WAR_FOLDER_NAME/"$PROJECT_NAME$DATE_TIME.zip" $PROJECT_NAME
echo 查看备份目录下的zip文件:
ls -lt $TOMCAT_HOME/$BACKUP_RUNNING_WAR_FOLDER_NAME
echo ---------------------------备份服务器原来文件夹 end
}
#删除运行中的Tomcat
function killRunningTomcat(){
## Kill 所有运行中的Tomcat begin
echo ---------------------------找出所有的Tomcat pid 并kill掉 beginning
TOMCAT_PID=$(ps -ef|grep $TOMCAT_NAME|grep start|grep -v 'grep'|grep -v 'jenkins_restart.sh'|grep -v 'zip -r'|awk '{print $2}')
#遍历是否存在其他tomcat,如果有的话,kill掉
while [ -n "$TOMCAT_PID" ]
do
echo "scan tomcat pid :" $TOMCAT_PID
$TOMCAT_SHUTDOWN
sleep 3s
kill -9 $TOMCAT_PID
sleep 3s
TOMCAT_PID=$(ps -ef|grep $TOMCAT_NAME|grep start|grep -v 'grep'|grep -v 'jenkins_restart.sh'|grep -v 'zip -r'|awk '{print $2}') ##再查找一次tomcat的pid
done
echo ---------------------------找出所有的Tomcat pid 并kill掉 end
## Kill 所有运行中的Tomcat end
}
## 删除webapps下的war包和war包解压后的文件夹
function removeOldWarFolder(){
echo ---------------------------删除webapps下的war包和war包解压后的文件夹 beginning
rm -rf $TOMCAT_HOME/$TOMCAT_WEBAPPS_NAME/$PROJECT_NAME.war
rm -rf $TOMCAT_HOME/$TOMCAT_WEBAPPS_NAME/$PROJECT_NAME
echo ---------------------------删除webapps下的war包和war包解压后的文件夹 end
}
## 复制war包到webapps目录
function copyUploadWar2Webapps(){
echo ---------------------------复制war包到webapps目录 beginning
cp $TOMCAT_HOME/$TEMP_UPLOAD_WAR_NAME/$PROJECT_NAME.war $TOMCAT_HOME/$TOMCAT_WEBAPPS_NAME
echo ---------------------------复制war包到webapps目录 end
}
## 启动tomcat
function startTomcat(){
echo ---------------------------启动Tomcat beginning
$TOMCA_START
echo ---------------------------启动Tomcat end
}
## 删除之前上传的临时war包
function removeTempUploadWarPkg(){
echo ---------------------------删除之前上传的临时war包 beginning
rm -rf $TOMCAT_HOME/$TEMP_UPLOAD_WAR_NAME/$PROJECT_NAME.war
echo ---------------------------删除之前上传的临时war包 end
}
## 删除1天前上传的备份的war包
function removeBackUpFiles(){
echo ---------------------------删除1天前上传的备份的war包 beginning
find $TOMCAT_HOME/$BACKUP_RUNNING_WAR_FOLDER_NAME -mtime +0 -name "$PROJECT_NAME*.zip" -exec rm -rf {} \;
echo ---------------------------删除1天前上传的备份的war包 end
}
#创建备份文件夹(若没有则创建)
createBackFolder
#备份运行中的代码
backUpRunningCode
#关闭所有运行的Tomcat
killRunningTomcat
#删除服务器中的war+folder
removeOldWarFolder
#拷贝上传后的war到webapps
copyUploadWar2Webapps
#启动Tomcat
startTomcat
#删除上传的临时war包
removeTempUploadWarPkg
#删除1天前上传的备份的war包
removeBackUpFiles