本文介绍使用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
| [root@localhost ~]# yum search java | grep -i |
| 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 |
sudo yum install java-11-openjdk.x86_64 -y
- 此时执行java -version可以看到已安装版本,使用which java可以看到java执行路径为/usr/bin/java,但这里不是openjdk的真实安装路径,需要通过命令dirname查看真实路径。
| [root@localhost /] |
| 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 /] |
| /usr/bin/java |
- 查看openjdk真实安装路径,用此路径配置JAVA_HOME
| [root@localhost /] |
| /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 /] |
| [root@localhost /] |
| /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
| |
| server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port` |
| echo "current :" $server_pid |
| |
| 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" |
| |
| 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_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 |
| |
| 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" |
| |
| 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 |
| |
| server_pid=`/usr/sbin/lsof -n -P -t -i :$server_port` |
| echo "current :" $server_pid |
| |
| 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" |
| |
| 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_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 |
| |
| 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 $project_name conslone url" |
- 将部署脚本上传到服务器的/opt/script目录下,并赋予可执行权限
chmod 755 publish_server.sh
二、新建Jenkins配置打包任务,部署SpringBoot应用
1. Dashboard > 新建任务,输入任务名称,选择“构建一个maven项目”,点击确定。


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

- 源码管理:配置git代码地址、用户名密码和版本分支,如果是需要用户名密码的git库,那么下面需要选择访问的用户名密码,这里一定要使用用户名密码方式,使用token的方式无法选中。可以在下方add,也可以在Jenkins全局Credentials 中添加,方便其它任务使用。


- 构建触发器:可选可不选,这个根据自己的需求选择,任务在什么情况下出发构建。

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

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

- Post Steps:将打包后的文件发送到服务器,并执行设置好的脚本,这里选择Run only if build succeeds,当构建成功时Post。

- 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

3. 运行构建任务

- 查看构建日志:点击立即构建之后,下方会出现进度条,点击进度条就可以进入构建日志界面。


4、构建成功后,下方会给出构建成功提示,此时登录远程服务器查看文件是否部署成功即可。

举报
评论 1