【微服务部署】二、Jenkins一键打包部署SpringBoot应用步骤详解

  本文介绍使用Jenkins一键将SpringBoot应用打包并上传到生产环境服务器运行,这里使用的是直接在服务器上运行FagJar的方式,首先确保服务器环境配置好,安装必须的JDK运行时环境,运行目录,日志存放目录等。

一、服务器环境配置

  关于JDK的选择,自1.8版本收费之后,我们大多数选择openjdk作为生产环境的运行时环境,和大多数软件安装包一样,在CentOS服务器上,我们可以选择yum方式和下载压缩包的方式进行安装。大多数情况下使用yum方式比较简单方便。也有特殊情况,一些安全要求高单位或系统,只允许在局域网内运行,此时就需要选择压缩包的方式进行安装了。

1. yum方式安装openjdk
  • 查询当前CentOS系统可以安装的openjdk版本,我们只需要运行时环境,所以java-11-openjdk.x86_64是我们需要安装的包,实际相当于jre运行时;里面还有一个包java-11-openjdk-devel.x86_64,这个包是传统意义的jdk就是包含开发和打包工具,在生产环境,没有需要我们可以不安装。
yum search java | grep -i --color openjdk
[root@localhost ~]# yum search java | grep -i --color openjdk
openjdk-asmtools-javadoc.noarch : Javadoc for openjdk-asmtools
icedtea-web.x86_64 : Additional Java components for OpenJDK - Java browser
java-1.6.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.6.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.6.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.6.0-openjdk-javadoc.x86_64 : OpenJDK API Documentation
java-1.6.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.7.0-openjdk.x86_64 : OpenJDK Runtime Environment
java-1.7.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.7.0-openjdk-demo.x86_64 : OpenJDK Demos
java-1.7.0-openjdk-devel.x86_64 : OpenJDK Development Environment
java-1.7.0-openjdk-headless.x86_64 : The OpenJDK runtime environment without
java-1.7.0-openjdk-javadoc.noarch : OpenJDK API Documentation
java-1.7.0-openjdk-src.x86_64 : OpenJDK Source Bundle
java-1.8.0-openjdk.i686 : OpenJDK Runtime Environment 8
java-1.8.0-openjdk.x86_64 : OpenJDK 8 Runtime Environment
java-1.8.0-openjdk-accessibility.i686 : OpenJDK accessibility connector
java-1.8.0-openjdk-accessibility.x86_64 : OpenJDK accessibility connector
java-1.8.0-openjdk-demo.i686 : OpenJDK Demos 8
java-1.8.0-openjdk-demo.x86_64 : OpenJDK 8 Demos
java-1.8.0-openjdk-devel.i686 : OpenJDK Development Environment 8
java-1.8.0-openjdk-devel.x86_64 : OpenJDK 8 Development Environment
java-1.8.0-openjdk-headless.i686 : OpenJDK Headless Runtime Environment 8
java-1.8.0-openjdk-headless.x86_64 : OpenJDK 8 Headless Runtime Environment
java-1.8.0-openjdk-javadoc.noarch : OpenJDK 8 API documentation
java-1.8.0-openjdk-javadoc-zip.noarch : OpenJDK 8 API documentation compressed
java-1.8.0-openjdk-src.i686 : OpenJDK Source Bundle 8
java-1.8.0-openjdk-src.x86_64 : OpenJDK 8 Source Bundle
java-11-openjdk.i686 : OpenJDK Runtime Environment 11
java-11-openjdk.x86_64 : OpenJDK 11 Runtime Environment
java-11-openjdk-demo.i686 : OpenJDK Demos 11
java-11-openjdk-demo.x86_64 : OpenJDK 11 Demos
java-11-openjdk-devel.i686 : OpenJDK Development Environment 11
java-11-openjdk-devel.x86_64 : OpenJDK 11 Development Environment
java-11-openjdk-headless.i686 : OpenJDK Headless Runtime Environment 11
java-11-openjdk-headless.x86_64 : OpenJDK 11 Headless Runtime Environment
java-11-openjdk-javadoc.i686 : OpenJDK 11 API documentation
java-11-openjdk-javadoc.x86_64 : OpenJDK 11 API documentation
java-11-openjdk-javadoc-zip.i686 : OpenJDK 11 API documentation compressed in a
java-11-openjdk-javadoc-zip.x86_64 : OpenJDK 11 API documentation compressed in
java-11-openjdk-jmods.i686 : JMods for OpenJDK 11
java-11-openjdk-jmods.x86_64 : JMods for OpenJDK 11
java-11-openjdk-src.i686 : OpenJDK Source Bundle 11
java-11-openjdk-src.x86_64 : OpenJDK 11 Source Bundle
java-11-openjdk-static-libs.i686 : OpenJDK libraries for static linking 11
java-11-openjdk-static-libs.x86_64 : OpenJDK 11 libraries for static linking
openjdk-asmtools.noarch : To develop tools create proper & improper Java
openprops.noarch : An improved java.util.Properties from OpenJDK

  • 选择openjdk11,执行安装命令
sudo yum install java-11-openjdk.x86_64 -y
  • 此时执行java -version可以看到已安装版本,使用which java可以看到java执行路径为/usr/bin/java,但这里不是openjdk的真实安装路径,需要通过命令dirname查看真实路径。
[root@localhost /]# java -version
openjdk version "11.0.20" 2023-07-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.20+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.20.0.8-1.el7_9) (build 11.0.20+8-LTS, mixed mode, sharing)
[root@localhost /]# which java
/usr/bin/java
  • 查看openjdk真实安装路径,用此路径配置JAVA_HOME
[root@localhost /]# dirname $(readlink $(readlink $(which java)))
/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64/bin
  • 使用vi /etc/profile编辑profile文件,按i编辑,在文件底部加入一下配置,按:wq!保存退出。
JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME
  • 执行source /etc/profile命令, 让profile文件立即生效。
[root@localhost /]# source /etc/profile
[root@localhost /]# echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64

  执行完以上操作之后,Java运行时环境就安装配置好了,但是一定要注意:PATH在配置的时候,一定要把$JAVA_HOME/bin放在前面,不然系统中安装有多个版本的JDK,那么在使用java命令时,系统会找到其他版本的Java。还有以前很多教程配置中的CLASSPATH和tools.jar在JDK1.5以后就不需要配置了。

2. 部署及备份目录准备
  • 新建 /opt/tmp 目录,用于Jenkins打包后,通过 Publish Over SSH插件将包传输到服务器的临时目录。
  • 新建 /opt/bak 目录,用于存储所有部署过的包备份,方便后续版本回滚。此目录可能会占用很大空间,所以需要选择一个磁盘空间大的挂载目录。
  • 新建 /opt/script 目录,用于Jenkins将包传输完成之后,执行安装、备份操作的相关命令脚本。
  • 新建 /data/container/server,作为服务的运行目录,服务FatJar也会部署到此目录。
mkdir -p /opt/tmp /opt/bak /opt/script /data/container/server
chmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/server
3. 部署脚本编写说明
  • 定义入参,可以通过Jenkins任务将参数传入脚本中,我们定义了下面3个参数:
    project_name=gitegg-server : 服务名称
    server_port=8080 : 服务端口号
    server_path="/data/container/server" : 服务运行路径

  • 对参数进行检查,是否未传入参数,这里根据自己的实际情况判断,比如必须传入哪些参数,就设置参数的个数不能小于几。

echo "param validate"
if [ $# -lt 1 ]; then  
  echo "you must use like this : ./publish_gitegg_server.sh [projectname] [server port] [server home dir]"  
  exit  
fi 
  • 入参赋值,如果有参数传入,则取服务参数,如果没有参数传入则取默认值
if [ "$1" != "" ]; then
   project_name="$1"
fi
if [ "$2" != "" ]; then
   server_port="$2"
fi
if [ "$3" != "" ]; then
   server_path="$3"
fi
  • Jenkins调用sh命令时,可能会找不到JAVA_HOME,导致服务无法运行,所以在次数在配置一下
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64
  • 停止服务
#check server process
server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port`
echo "current :" $server_pid
#shutdown server
kill -9 $server_pid
echo "server shutting down"
while [ -n "$server_pid" ]
do
 sleep 5
 server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port`
 echo "scan server pid :" $server_pid
done
echo "server shutt down"
  • 部署服务运行的FatJar
#publish project
echo "scan no server pid,$project_name publishing"
rm -rf "$server_path"/$project_name*.jar
cp /opt/tmp/$project_name*.jar "$server_path"/$project_name.jar
  • 备份本次发布的FatJar
#bak project
BAK_DIR=/opt/bak/$project_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp "$server_path"/$project_name.jar "$BAK_DIR"/"$project_name"_`date +%H%M%S`.jar
#remove tmp
rm -rf /opt/tmp/$project_name*.jar
  • 执行运行命令
cd "$server_path"
source /etc/profile
nohup java -jar -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m "$project_name".jar --server.port="$server_port" > log.file 2>&1 &
  • 打印执行完成的命令
echo "Server is starting,please try to access $container_name conslone url"
  • 完整的安装部署脚本
project_name=gitegg-server
server_port=8080
server_path="/data/container/server"
#param validate
if [ $# -lt 1 ]; then  
  echo "you must use like this : ./publish_qxq_server.sh [projectname] [server port] [server home dir]"  
  exit  
fi
if [ "$1" != "" ]; then
   project_name="$1"
fi
if [ "$2" != "" ]; then
   server_port="$2"
fi
if [ "$3" != "" ]; then
   server_path="$3"
fi
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64
#check server process
server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port`
echo "current :" $server_pid
#shutdown server
kill -9 $server_pid
echo "server shutting down"
while [ -n "$server_pid" ]
do
 sleep 5
 server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port`
 echo "scan server pid :" $server_pid
done
echo "server shutt down"
#publish project
echo "scan no server pid,$project_name publishing"
rm -rf "$server_path"/$project_name*.jar
cp /opt/tmp/$project_name*.jar "$server_path"/$project_name.jar
#bak project
BAK_DIR=/opt/bak/$project_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp "$server_path"/$project_name.jar "$BAK_DIR"/"$project_name"_`date +%H%M%S`.jar
#remove tmp
rm -rf /opt/tmp/$project_name*.jar
#start server
cd "$server_path"
source /etc/profile
nohup java -jar -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m "$project_name".jar --server.port="$server_port" > log.file 2>&1 &
echo "Server is starting,please try to access $project_name conslone url"
  • 将部署脚本上传到服务器的/opt/script目录下,并赋予可执行权限
chmod 755 publish_server.sh

二、新建Jenkins配置打包任务,部署SpringBoot应用

1. Dashboard > 新建任务,输入任务名称,选择“构建一个maven项目”,点击确定。
Dashboard

新建任务
2. 项目配置,进入到任务配置页
  • 丢弃旧的构建 :这里在保持构建的最大个数填写5,当然可以根据自己情况填写,否则旧的构建包会一直存在占用磁盘空间。


    丢弃旧的构建
  • 源码管理:配置git代码地址、用户名密码和版本分支,如果是需要用户名密码的git库,那么下面需要选择访问的用户名密码,这里一定要使用用户名密码方式,使用token的方式无法选中。可以在下方add,也可以在Jenkins全局Credentials 中添加,方便其它任务使用。
源码管理
访问凭证
  • 构建触发器:可选可不选,这个根据自己的需求选择,任务在什么情况下出发构建。


    构建触发器
  • 构建环境:这里不需要选择,在介绍构建NodeJS项目时,需要选中NodeJS环境。


    构建环境
  • Build:这里填写Maven打包命令,可以添加参数选择打包环境test或prod等。


    Build
  • Post Steps:将打包后的文件发送到服务器,并执行设置好的脚本,这里选择Run only if build succeeds,当构建成功时Post。
Post Steps1
  • Exec command:将打好的包发布到环境之后,在环境上执行的部署脚本命令。/opt/script/publish_server.sh 是脚本文件、gitegg-application是项目名称、8182 是项目端口号、/data/container/server 是jar包存放路径。
/opt/script/publish_server.sh gitegg-application 8182 /data/container/server
Post Steps2
3. 运行构建任务
  • 立即构建
立即构建
  • 查看构建日志:点击立即构建之后,下方会出现进度条,点击进度条就可以进入构建日志界面。
查看构建日志
日志
4、构建成功后,下方会给出构建成功提示,此时登录远程服务器查看文件是否部署成功即可。
部署成功
GitEgg-Cloud是一款基于SpringCloud整合搭建的企业级微服务应用开发框架,开源项目地址:

Gitee: https://gitee.com/wmz1930/GitEgg

GitHub: https://github.com/wmz1930/GitEgg

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容