目录
- Tomcat 部署持续交付实战
- Docker 部署持续交付实战
一、Tomcat 部署持续交付实战
Tomcat基础知识
目的:将Spring -boot项目部署到Tomcat应用服务器中
-
了解Tomcat
- 开源应用服务器
- 支持Servlet,JSP,..... Java系Web应用
- 入门简单
-
运行和配置入门
启动:
bin/startup.sh
停止:
bin/shutdown.sh
-
配置文件:
conf/server.xml
,进入后:set number
可添加行号,/8080
可定位到8080位置
日志:
logs/catalina.out
-
下载位置:https://tomcat.apache.org/
-
安装方法:直接解压
unzip apache-tomcat-xxx.zip
-
修改文件权限:
chmod -R a+x ../apache-tomcat-xxx
-
查看Tomcat进程是否起来:
ps -ef | grep java | grep tomcat
-
访问8080端口:
环境要求:Java开发和运行时环境
Pipeline任务部署Spring应用到Tomcat
-
任务描述:
- 使用Script Pipeline将Spring boot应用部署到Tomcat中运行
将整体任务进行分解拆分,独立出任务子模块
在Script Pipeline中使用Git
在Script Pipeline中使用Maven
在Script Pipeline中引用变量
在Script Pipeline中控制Tomcat
-
部署流程:将spring-boot的打包成web应用的package放到tomcat中运行
-
清洗环境是因为在持续交付过程中,可能会有之前版本的spring-boot应用,所以在持续迭代的过程中需要清理环境,删除之前的版本。所以部署之前需要停止Tomcat,部署完成后再启动Tomcat。
-
-
配置pipeline 部署任务
-
设置pipeline代码路径
-
参数配置
-
进行构建
-
访问8080端口
Pipeline代码讲解:
deploy_tomcat_script_pipeline.groovy
node('master') {
stage('同步源码') {
git([url: 'git@gitee.com:11547299/jeesite4.git', branch: '${branch}'])
}
stage('maven编译打包') {
sh '''
. ~/.bash_profile
export pwd=`pwd`
export os_type=`uname`
cd web/src/main/resources/config
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application.yml
else
sed -i "s/mysql_ip/${mysql_ip}/g" application.yml
sed -i "s/mysql_port/${mysql_port}/g" application.yml
sed -i "s/mysql_user/${mysql_user}/g" application.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application.yml
fi
cd $pwd/root
mvn clean install -Dmaven.test.skip=true
cd $pwd/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U
'''
}
stage('停止 tomcat') {
sh '''
## 停止tomcat的函数, 参数$1带入tomcat的路径$TOMCAT_PATH
killTomcat()
{
pid=`ps -ef|grep $1|grep java|awk '{print $2}'`
echo "tomcat Id list :$pid"
if [ "$pid" = "" ]
then
echo "no tomcat pid alive"
else
kill -9 $pid
fi
}
## 停止Tomcat
killTomcat $tomcat_home
'''
}
stage('清理环境') {
sh '''
## 删除原有war包
rm -f $tomcat_home/webapps/ROOT.war
rm -rf $tomcat_home/webapps/ROOT
'''
}
stage('部署新的war包') {
sh '''
cp web/target/web.war $tomcat_home/webapps/
cd $tomcat_home/webapps
mv web.war ROOT.war
'''
}
stage('启动tomcat') {
sh '''
JENKINS_NODE_COOKIE=dontkillme
cd $tomcat_home/bin
sh startup.sh
'''
}
}
二、Docker部署持续交付实战
Pipeline任务部署Spring Docker应用
- 任务描述
- 使用Declared Pipeline技术,将Spring boot项目部署Docker镜像中
- 涉及知识点
- Declared Pipeline 任务中对Spring boot应用编译、打包
- Declared Pipeline任务中制作Spring Docker镜像
- Declared Pipeline 任务启动Docker实例
- Declared Pipeline 参数与环境变量
- Declared Pipeline容错控制
任务流程图
部署过程代码
- deploy_docker_pipline.groovy 文件
pipeline {
agent {
label 'master'
}
environment {
docker_image_name = 'jeesite4'
docker_container_name = 'iJeesite4'
}
parameters {
string(name: 'branch', defaultValue: 'master', description: 'Git branch')
}
stages{
stage('同步源码') {
steps {
git url:'git@gitee.com:11547299/jeesite4.git', branch:"$params.branch"
}
}
stage('设定配置文件'){
steps{
sh '''
. ~/.bash_profile
export os_type=`uname`
cd ${WORKSPACE}/web/bin/docker
if [[ "${os_type}" == "Darwin" ]]; then
sed -i "" "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml
sed -i "" "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "" "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "" "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
else
sed -i "s/mysql_ip/${mysql_docker_ip}/g" application-prod.yml
sed -i "s/mysql_port/${mysql_port}/g" application-prod.yml
sed -i "s/mysql_user/${mysql_user}/g" application-prod.yml
sed -i "s/mysql_pwd/${mysql_pwd}/g" application-prod.yml
fi
'''
}
}
stage('Maven 编译'){
steps {
sh '''
. ~/.bash_profile
cd ${WORKSPACE}/root
mvn clean install -Dmaven.test.skip=true
cd ${WORKSPACE}/web
mvn clean package spring-boot:repackage -Dmaven.test.skip=true -U
'''
}
}
stage('停止 / 删除 现有Docker Container/Image '){
steps {
script{
try{
sh 'docker stop $docker_container_name'
}catch(exc){
echo 'The container $docker_container_name does not exist'
}
try{
sh 'docker rm $docker_container_name'
}catch(exc){
echo 'The container $docker_container_name does not exist'
}
try{
sh 'docker rmi $docker_image_name'
}catch(exc){
echo 'The docker image $docker_image_name does not exist'
}
}
}
}
stage('生成新的Docker Image'){
steps {
sh '''
cd ${WORKSPACE}/web/bin/docker
rm -f web.war
cp ${WORKSPACE}/web/target/web.war .
docker build -t $docker_image_name .
'''
}
}
stage('启动新Docker实例'){
steps {
sh '''
docker run -d --name $docker_container_name -p 8981:8980 $docker_image_name
'''
}
}
}
}
- application-prod.yaml 文件
#======================================#
#========== Project settings ==========#
#======================================#
# 产品或项目名称、软件开发公司名称
productName: JeeSite 生产环境
companyName: ThinkGem
# 产品版本、版权年份
productVersion: V4.1
copyrightYear: 2020
#是否演示模式
demoMode: false
#======================================#
#========== Server settings ===========#
#======================================#
server:
port: 8980
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
# 将请求协议转换为 https
schemeHttps: false
#======================================#
#========== Database sttings ==========#
#======================================#
# 数据库连接
jdbc:
# Mysql 数据库配置
type: mysql
driver: com.mysql.jdbc.Driver
url: jdbc:mysql://mysql_ip:mysql_port/jeesite?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
username: mysql_user
password: mysql_pwd
testSql: SELECT 1
# MyBatis 相关
mybatis:
# Mapper文件刷新线程
mapper:
refresh:
enabled: false
# 文件相关
file:
# 文件上传根路径,设置路径中不允许包含“userfiles”,在指定目录中系统会自动创建userfiles目录,如果不设置默认为contextPath路径
baseDir: /root/jeesite
Dockerfile 代码
- 起点
alpine-java:jdk8-slim
镜像 - 加载应用web.war
- 解压缩web.war
- 配置java启动参数
- 添加yml配置文件
- 配置应用启动命令
- 添加暴露端口
FROM frolvlad/alpine-java:jdk8-slim
MAINTAINER ThinkGem@163.com
ENV TZ "Asia/Shanghai"
ENV LANG C.UTF-8
VOLUME /tmp
WORKDIR /app
ADD web.war .
RUN jar -xvf web.war
WORKDIR /app/WEB-INF
ENV JAVA_OPTS "-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
ENV JAVA_OPTS "$JAVA_OPTS -Dspring.profiles.active=prod"
ADD application-prod.yml ./classes/config
ENTRYPOINT java -cp /app $JAVA_OPTS org.springframework.boot.loader.WarLauncher
EXPOSE 8980
部署
- 创建Pipeline任务,部署Spring Docker应用
- 构建任务
-
访问8981端口