手工发布步骤
- 获取最新代码。
- 编译打包。
- 上传到服务器,替换文件。
- 停止 tomcat。
- 启动 tomcat。
半自动化,一键发布
可做到手工一键发布,有两种方式。
用脚本来实现
把以下脚本保存为 deploy.sh 并设置可执行权限。每次需要发布的时候,只需要执行该脚本即可。1
2
3
4
5# cd source filder
git pull # 前提是要配置好 git 环境,设置 ssh key 免密码方式访问 git 服务器
mvn clean package -Dmaven.test.skip=true # 前提:配置好 maven。如果是多模块项目,一定要在项目的根目录执行
# cd shell script folder
sh autoDeploy.sh # 脚本内容,见下面 autodeploy.sh 节点。负责发布工作,包括:备份当前版本、停止 tomcat、替换文件、启动 tomcat
多模块的 pom.xml 大概如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>apg</groupId>
<artifactId>domain.com</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<modules>
<module>domain.boot</module>
<module>domain.biz</module>
<module>domain.common</module>
<module>domain.config</module>
</modules>
</project>
脚本结合 Jenkins
在服务器上配置好 Jenkins,根据 Jenkins 的配置,每次需要发布时,更新代码到 Jenkins 配置的版本库对应的【版本/分支/tag】,之后的事情,就交给 Jenkins 来处理。
Jenkins 的操作分三步
- 获取配置的源码最新版本。
- 执行 mvn 构建操作: clean package -Dmaven.test.skip=true
- 执行服务器上自动部署脚本:autoDeploy.sh
配置 Jenkins 的好处
- 可以省掉本地打包再上传服务器的步骤。
- 只要能上网即可操作,无须配置本地环境。
- 这个工作可以交给运维去做。
- 每次构建日志可查。
- 构建情况自动发送到管理员邮箱,方便管理。
- 每次代码更新日志可查,方便运维和测试开展相关工作。
autoDeploy.sh
负责发布工作,包括:备份当前版本、停止 tomcat、替换文件、启动 tomcat1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74#!/bin/bash
uploadPath=/home/utomcat/upload
webPath=/home/utomcat/apps/web
now=`date +%Y%m%d%H%M%S`
tomcatPath=/home/utomcat/tomcat/web
backupPath=/home/utomcat/apps/backup/web
scriptPath=/home/utomcat/shell-script
echo "copy archive file to upload folder..."
sh $scriptPath/cpWarFile.sh
echo "copy finished"
war=$1
cd $uploadPath
if [ -e "$war.war" ]; then
echo -e " war archive: $war.war"
else
echo -e "war archive '$war.war' not exists"
exit -1
fi
# change color
#echo -e "\033[34m"
#create backup dir
if [ ! -d "$backupPath" ]; then
mkdir -p "$backupPath"
fi
echo "tomcat home: $tomcatPath"
echo "backup path: $backupPath"
echo 'try to stop tomcat...'
echo "stop tomcat ..."
pid=`ps aux|grep "java"|grep $tomcatPath|awk '{printf $2}'`
if [ -n $pid ]; then
echo "tomcat pid: $pid";
kill -9 $pid;
fi
echo 'stop tomcat finished...'
echo 'backup current archive...'
if [ -f "$uploadPath/$war.war" ]; then
cp -v "$uploadPath/$war.war" "$backupPath/$1-$now.war";
fi
cd $webPath
rm -rf META-INF/ WEB-INF/
echo "unzip $war.war archive to webPath.."
unzip -q $uploadPath/$war.war
echo "unzip finished"
#sleep 3 #sleep 3s copy config files
echo "chown..."
chown utomcat:gtomcat -R $webPath
echo "copy config files to classes ..."
cp configFiles/* WEB-INF/classes/
#sleep 2
echo 'copy finished'
#echo -e "\033[32m"
echo 'startup tomcat...'
su - utomcat -lc "sh /home/utomcat/shell-script/start.sh" # 以 utomcat 的身份运行 tomcat
echo "startup tomcat finished"
# 如果是手工执行发布任务,可以执行查看日志的脚本
# tail -10f $tomcatPath/logs/catalina.out
cpWarFile.sh
可以直接添加到上面的脚本,单独写到一个文件,只是方便分步执行。1
2
3rm -rf /home/utomcat/upload/domain.boot-1.0.0.war
cp /var/lib/jenkins/workspace/webSite/apg.boot/target/domain.boot-1.0.0.war /home/utomcat/upload/
chown utomcat:gtomcat /home/utomcat/upload/domain.boot-1.0.0.war