如题

手工发布步骤

  1. 获取最新代码。
  2. 编译打包。
  3. 上传到服务器,替换文件。
  4. 停止 tomcat。
  5. 启动 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 的操作分三步

  1. 获取配置的源码最新版本。
  2. 执行 mvn 构建操作: clean package -Dmaven.test.skip=true
  3. 执行服务器上自动部署脚本:autoDeploy.sh

配置 Jenkins 的好处

  1. 可以省掉本地打包再上传服务器的步骤。
  2. 只要能上网即可操作,无须配置本地环境。
  3. 这个工作可以交给运维去做。
  4. 每次构建日志可查。
  5. 构建情况自动发送到管理员邮箱,方便管理。
  6. 每次代码更新日志可查,方便运维和测试开展相关工作。

autoDeploy.sh

负责发布工作,包括:备份当前版本、停止 tomcat、替换文件、启动 tomcat

1
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
3
rm -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

tomcat 相关文章