公司一直都是手动发布war包的,这里有一个问题,人为的操作是很容易出现问题的,于是想到用jenkins来进行发布war包,减少人工参与

一、安装jenkins(常规操作过程不表)

启动jenkins,修改默认端口号(8080)启动

  1. 打开终端,cd 到Jenkins的安装目录(即jenkins.war所在目录),如:D:\Program Files (x86)\Jenkins

  2. 执行命令:
    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启动

  1. 启动jenkins
    由于我是使用homebrew来安装jenkins的,需要在终端中输入代码:

    shell brew info jenkins

  2. 打开终端,cd 到Jenkins的安装目录(即jenkins.war所在目录)

    cd /usr/local/Cellar/jenkins/2.102/libexec

  3. 启动jenkins,修改默认端口号(8080)启动,执行命令:

    java -jar jenkins.war --ajp13Port=-1 --httpPort=9999

  4. 输入url,访问jenkins:

    http://localhost:9999

3.2 jenkins 配置

3.2.1 系统管理

  1. 系统设置:全局设置&路径。
  • SSH remote hosts
    配置远端SSH连接相关参数
    填写相关参数后,需要点击“check connection”按钮检查是否能成功连通。
    配置远端SSH连接相关参数

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

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

  1. 全局工具配置: 工具配置,包括他们的位置和自动安装器。
  • Maven
    配置打包gitlib代码的相关命令。
    配置打包gitlib代码的相关命令
  1. 管理插件:添加、删除、禁用或启用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脚本步骤:

  1. 备份原来war包解压的folder。
  2. 关闭运行中的tomcat。
  3. 复制上传后的war到webapps目录。
  4. 启动tomcat。
  5. 删除上传到临时文件夹中的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