美文网首页
【微服务部署】二、Jenkins一键打包部署SpringBoot

【微服务部署】二、Jenkins一键打包部署SpringBoot

作者: 全栈程序猿 | 来源:发表于2023-10-24 16:07 被阅读0次

      本文介绍使用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

    相关文章

      网友评论

          本文标题:【微服务部署】二、Jenkins一键打包部署SpringBoot

          本文链接:https://www.haomeiwen.com/subject/eemkmdtx.html