Jenkins Tomcat部署持续交付实战
Tomcat基础知识
- 目的:将SpringBoot项目部署到Tomcat应用服务器中
- 了解tomcat
- 开源应用服务器
- 支持Servlet,JSP,……,Java系Web应用
- 入门简单
Tomcat安装
环境要求:Java开发和运行时环境
1
2
3
4[root@localhost local]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
下载位置:
https://tomcat.apache.org/
,我们选择在Linux上安装,选择Tomcat9安装方法:下载解压
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@localhost ~]# wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
--2021-02-21 18:14:28-- https://downloads.apache.org/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz
……
[root@localhost ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.43.tar.gz jdk-8u221-linux-x64.tar
[root@localhost ~]# tar -zxvf apache-tomcat-9.0.43.tar.gz
apache-tomcat-9.0.43/conf/
apache-tomcat-9.0.43/conf/catalina.policy
apache-tomcat-9.0.43/conf/catalina.properties
……
[root@localhost ~]# mv apache-tomcat-9.0.43 /usr/local/tomcat9
[root@localhost ~]# cd /usr/local/
[root@localhost local]# ls
bin games jdk1.8 lib64 sbin src
etc include lib libexec share tomcat9
运行和配置入门:
- 启动:
/bin/startup.sh
- 停止:
/bin/shutdown.sh
- 配置文件:
/conf/server.xml
- 日志:
/logs/catalina.out
1
2
3
4
5
6
7
8
9[root@localhost ~]# cd /usr/local/tomcat9/bin/
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat9
Using CATALINA_HOME: /usr/local/tomcat9
Using CATALINA_TMPDIR: /usr/local/tomcat9/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.查看tomcat启动进程
1
2[root@localhost bin]# ps -ef | grep tomcat | grep -v grep
root 16119 1 6 19:45 pts/0 00:00:04 /usr/local/jdk1.8/bin/java -Djava.util.logging.config.file=/usr/local/tomcat9/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat9/bin/bootstrap.jar:/usr/local/tomcat9/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat9 -Dcatalina.home=/usr/local/tomcat9 -Djava.io.tmpdir=/usr/local/tomcat9/temp org.apache.catalina.startup.Bootstrap start查看tomcat日志
1
2
3
4
5
6
7
8
9
10[root@localhost bin]# cd /usr/local/tomcat9/logs/
[root@localhost logs]# ls
catalina.2021-02-21.log host-manager.2021-02-21.log localhost_access_log.2021-02-21.txt
catalina.out localhost.2021-02-21.log manager.2021-02-21.log
[root@localhost logs]# tail -f catalina.out
21-Feb-2021 19:45:13.915 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat9/webapps/docs]
21-Feb-2021 19:45:13.947 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[/usr/local/tomcat9/webapps/docs]的部署已在[47]毫秒内完成
21-Feb-2021 19:45:13.947 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [/usr/local/tomcat9/webapps/examples]
21-Feb-2021 19:45:14.588 信息 [main] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[/usr/local/tomcat9/webapps/examples]的部署已在[641]毫秒内完成
……经过查看后,没有报错信息,Tomcat启动成功,我们浏览器访问:
http://ip:8080
,如果访问不成功,则需要关闭防火墙或者防火墙添加端口号1
2
3
4
5
6[root@localhost logs]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
[root@localhost logs]# firewall-cmd --reload
success
[root@localhost logs]# firewall-cmd --permanent --zone=public --list-ports
8080/tcp注意:如果阿里云服务,需要设置安全组开放8080的端口
完成上面操作,重新加载,访问成功
- 启动:
Tomcat中的授权
1
2[root@localhost ~]# cd /usr/local/
[root@localhost local]# chmod -R a+x tomcat9/
jeesite4 SpringBoot应用
使用的是jeesite4的一个开源项目,项目Git地址:https://gitee.com/jeanlv/jeesite4
将该项目git glone并用Idea打开,加载项目的依赖,具体查看
下载到源代码,我们看到代码结构,目录deploy下是部署相关的脚本,具体部署参考文档:https://jeesite.com/docs/install-deploy/
MySQL安装与配置
Linux中按传统的安装与配置会非常的繁琐,因此本篇采用Docker安装配置
拉去镜像,我们拉去最新的mysql镜像,版本是mysql8系列的
1
2
3
4
5
6
7[root@localhost ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
a076a628af6f: Pull complete
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
……
宿主机创建挂载的目录,并编写mysql相关配置
1
2
3
4
5[root@localhost ~]# mkdir /usr/local/mysql_data
[root@localhost ~]# cd /usr/local/mysql_data
[root@localhost mysql_data]# touch my.cnf
[root@localhost mysql_data]# ls
my.cnfmy.cnf内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
启动mysql容器,并挂载相应的配置
1
2
3
4
5
6[root@localhost ~]# docker run --restart=always --privileged=true -p 3306:3306 --name mysql -v /usr/local/mysql_data/log:/var/log/mysql -v /usr/local/mysql_data/data:/var/lib/mysql -v /usr/local/mysql_data/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql_data/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123123 -d mysql:latest
401b286b9d15c10af4ded23d6f976ab54e445ee33ab7ec950904309c2b259e71
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
401b286b9d15 mysql:latest "docker-entrypoint.s…" 7 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
cca651588eb3 jenkins/jenkins:lts "/sbin/tini -- /usr/…" 2 days ago Up 2 days 50000/tcp, 0.0.0.0:8082->8080/tcp jenkins
根据jeesite4的部署文档中介绍,进入mysql容器中进行【创建用户和授权】设置
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[root@localhost ~]# docker exec -it 401b286b9d15 bash
root@401b286b9d15:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set global read_only=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set global optimizer_switch='derived_merge=off';
Query OK, 0 rows affected (0.00 sec)
mysql> create user 'jeesite'@'%' identified by 'jeesite';
Query OK, 0 rows affected (0.01 sec)
mysql> create database jeesite DEFAULT CHARSET 'utf8' COLLATE 'utf8_general_ci';
Query OK, 1 row affected, 2 warnings (0.00 sec)
mysql> grant all privileges on jeesite.* to 'jeesite'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
回到应用修改数据库连接,并执行脚本进行数据初始化
打开文件jeesit4/web/src/main/resources/config/application.yml,数据库链接修改
在进入jeesit4/web/bin中执行脚本init-data.sh(init-data.bat)进行初始化
完成以上配置,到数据库中检查数据库及数据表的生成
SpringBoot应用到Tomcat部署流

Jenkins自由风格任务部署SpringBoot应用到Tomcat
SpringBoot应用到Tomcat部署的Shell脚本
1 | !/usr/bin/env bash |
Jenkins创建自由风格Job进行部署
注意:Jenkins的安装,如果是Docker安装的Jenkins会非常麻烦,需要挂载Tomcat,但在Docker容器中操作无权限,因此本篇采用的是Jenkins在官网下载的war包,放到Tomcat中启动即可。
[新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页
配置”源码管理” -> “Git”
“构建” -> “增加构建步骤” -> “执行shell”
Shell脚本
1
2
3
4
5
6
7
8
9
10
11BUILD_ID=DONTKILLME
. ~/.bash_profile
export mysql_ip=8.140.xxx.xxx
export mysql_port=3306
export mysql_user=root
export mysql_pwd=123123
export TOMCAT_PATH=/usr/local/tomcat9
export PROJ_PATH=`pwd`/jeesite4
sh jeesite4/deploy/deploy_tomcat.sh
完成以上配置后,点击[保存],回到Job页面,点击[Build Now]
进入Build Number查看“控制台输出”,查看执行的日志
Job执行成功,浏览器访问:http://ip:8080
默认最高管理员账号:system 密码:admin,登录后的页面
Jenkins Pipeline任务部署SpringBoot应用到Tomcat
SpringBoot应用到Tomcat部署的pipeline脚本
1 | node('master') { |
Jenins创建流水线Job进行部署
[新建任务]创建一个“构建一个自由风格的软件项目”的Job,进入配置页
[General] -> [This project is parameterized]进行参数配置,mysql、tomcat路径相关的配置信息等
配置”流水线” -> “定义”选择”Pipeline script from SCM”,配置Git信息
配置Groovy脚本的路径
完成以上配置后,点击[保存],回到Job页面,点击[Build with Parameters],查看配置的参数
点击[开始构建],查看“控制台日志”
查看到是执行成功的,回到Job Build页面,查看流水线执行图
我们看到流水线执行图,清晰明了,很清楚的看到在部署的时候执行的过程,在配置的过程也是灵活便捷,因此在持续交付的过程中,推荐该方式。
这时我们浏览器再次访问:http://ip:8080
,访问成功
用户名:system 密码:admin,查看登录后的页面
之后,我们在配置GitLab或Github的WebHook,就可以完成,提交代码立即构建并部署环境,完成整个流水线的过程。
注意:本篇有个很大的坑,我将Jenkins和SpringBoot应用部署到了同一个tomcat中,因此引发的问题是,Job在跑的时候,会停止tomcat因此,Jenkins也会被干掉,之后的步骤就不会执行,后面在实际操作的时候,注意要区分这里。