一文带你搞懂SpringBoot项目实现自动化部署

前言

要实现springboot项目自动化部署,需要了解下面四个技术点:

  1. SpringBoot Profiles
  2. Maven命令
  3. Jenkins的使用
  4. Shell脚本

下面我们会一一来介绍这四个技术点,最后用一个综合事例来给大家呈现springboot项目的自动化部署。

1. SpringBoot Profiles

profiles 是 Spring 框架的一种环境隔离方式,通过分隔配置文件或使用环境分组实现不同环境下的特定配置管理。其目的是在应用启动时,根据指定的 profile 加载对应的配置文件,从而实现多环境管理。

 

配置文件中配置当中通过spring.profiles.active来申明当前可用的profile. 例如:

spring.profiles.active=dev

 

申明了有效的profile的后,可以通过application-{profile}.yml的方式来指定特定的配置文件生效。例如:

application-dev.yml

 

事例:

项目结构如下:

 

TestController:

@RestController
@RequestMapping("/test")
public class TestController {

    @Value("${project.name}")
    private String projectName;

    @GetMapping("/hello")
    public String hello(){
        return "hello world, projectName=" + projectName;
    }

}

  

application.yml

server:
  port: 9091

spring:
  profiles:
    active: dev

application-dev.yml

project:
  name: test

application-product.yml

project:
  name: product

当application.yml中的spring.profiles.active值为dev时,运行结果如下:

 

总结:

可以根据不同的环境使用不同的配置文件来配置整个项目。后面使用发布系统的时候根据不同的环境来发不同的版本。

 

2. Maven命令

Maven就是项目管理工具,用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给maven管理,整个过程就是构建。(这里不多介绍,基本知识不懂的可以网上搜索)

 

intellj idea配置maven

打开File菜单, 点击settings

 

点击菜单View,调出Maven工具

 

打包maven项目:

 

打包结束后,可以在项目目录的target目录看到打包好的jar包

 

当然这里也是可以使用maven命令来打包的

进入到项目根目录,使用mvn clean package来打包,事例如下:

 

mvn命令有两个重要的参数-P和-D

mvn -Pxxx 激活 id 为 xxx 的 profile(如有多个,用逗号隔开)。

mvn -Dxxx=yyy 指定 java 的全局属性。

 

下面的命令是激活id为dev的profile, 并且忽略执行单元测试。

mvn clean -Pdev package -Dmaven.test.skip=true

 

在项目根目录的pom.xml配置profile

<profiles>
  <profile>
    <id>dev</id>
    <properties>
      <environment>dev</environment>
    </properties>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
  </profile>
  <profile>
    <id>product</id>
    <properties>
      <environment>product</environment>
    </properties>
  </profile>
</profiles>

application.yml中的参数变更如下,这里双@符号内可以获取pom.xml里激活的properties

spring:
  profiles:
    active: @environment@

 

这里有个问题,就是打包出来的jar包是不能独立部署运行的,要使得打的包能独立运行,需要使用springboot的maven插件打包。在pom.xml增加如下代码:

<build>
    <finalName>spring-boot-demo</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <includeSystemScope>true</includeSystemScope>
                <mainClass>com.example.MyApplication</mainClass>
                <outputDirectory>target</outputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

 

执行打包命令:mvn clean -Pproduct package

得到结果如下:

 

这里的jar是可以单独执行的,运行命令java -jar spring-boot-demo.jar

 

总结:

好了,到这里项目已经准备就绪了。结合后面的发版工具就可以实现自动化部署了。

3. Jenkins的使用

war包下载地址:http://mirrors.jenkins.io/war-stable/latest/jenkins.war

 

运行最新版的jenkins war包需要安装jdk17。安装好后使用命令启动:

nohup /root/test2/jdk-17.0.14/bin/java -jar /root/test2/jenkins.war --httpPort=8099 --logfile=/root/test2/jenkins.log &

 

查看jenkins.log是否报错,如果报下面错,需要安装fontconfig

java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration

 

安装fontconfig命令

yum install -y fontconfig

重新执行。打开地址:http://ip:8099

如果运行成功,将看到如下页面:

 

管理员密码在jenkins.log里面有,示例:

 

输入管理员密码,点击继续。安装推荐的插件。

 

等插件安装完毕后。创建一个管理员用户。

 

 

接下来进入到jenkins首页

 

接下来新建Item, 起一个任务名称,选择Freestyle project。

 

下面就是创建项目的步骤。

  1. 首先把项目放到git仓库,国内可以选择gitee, 这样项目在构建的时候会通过git拉取代码到本地。配置如下:

 

 

通过添加Credentials, 可以配置访问git仓库的账户。

配置git的前提是服务器已经安装了git, 可以使用命令安装 

yum install git

 

  1. maven配置,在如下的全局工具配置maven安装的路径,当然前提是安装了maven, maven安装这里不做讲解,网上搜一下,安装好后,配置如下:

 

 

这里配置好后,回到项目里的配置,配置如下,增加构建步骤,选择调用顶层Maven目标。

 

  1. 配置SSH服务器,首先安装插件Publish Over SSh.

 

在系统配置里面,配置SSH服务器地址:

 

 

在高级里面配置密码

 

然后回到项目的配置里面,增加构建后操作步骤,选择Send build artifacts over SSH.

 

高级配置里面如下,这里把构建的jar传到远程服务目录下面,然后运行已经写好的shell脚本。

 

  1. 保存,并点击立即构建,项目就开始构建了,刚开始需要拉取maven依赖的jar包,成功后续的构建会比较快。

 

也可以在首页点击下面的三角构建项目。

 

4. Shell脚本

Linux的Shell脚本命令这里不作详解,大家网上搜索相关文档即可。这里列出一些重点的命令以及语法。

 

  1. $1,$2 可以获取到shell脚本启动时的命令参数。
  2. 函数的定义:function name(){}
  3. 条件语句:if then .. else .. fi
  4. 判断分支:case "" in .... esac
  5. 打印输出命令:echo

 

下面是启动脚本的案例:

# !/bin/bash

APP_HOME=/root/test
APP_NAME=spring-boot-demo.jar
JVM_OPTS="-Xms1g -Xmx1g"

TARGET_DIR=$APP_HOME"/target"
BACKUP_DIR=$APP_HOME"/backup"

function publish(){
    echo 'publish'
    checkdir
    
    if [ ! -e $TARGET_DIR"/"$APP_NAME ]
    then
        echo "no file"
        exit 1
    fi
    
    # 停止应用
    stop
    
    # 备份老应用
    cp $APP_HOME"/"$APP_NAME $BACKUP_DIR"/"$APP_NAME
    
    # 拷贝新应用
    cp $TARGET_DIR"/"$APP_NAME $APP_HOME"/"$APP_NAME
    
    # 启动新应用
    start
}

function rollback(){
    echo 'rollback'
    checkdir
    
    # 停止应用
    stop 
    
    # 拷贝老应用
    cp $BACKUP_DIR"/"$APP_NAME $APP_HOME"/"$APP_NAME
    
    # 启动应用
    start
}

function start(){
    findPid
    if [ -z "$pid" ] 
    then 
        java -jar $JVM_OPTS $APP_HOME/$APP_NAME > /dev/null &
        echo "$APP_NAME start"
    else
        echo "$APP_NAME already started"
        exit 1
    fi
}

function stop(){
    findPid
    if [ -z "$pid" ] 
    then
        echo "$APP_NAME already stoped"
    else
        kill -15 $pid
        sleep 1
        echo "$APP_NAME stoped"
    fi
}

function checkdir(){
    if [ ! -d $TARGET_DIR ] 
    then 
        mkdir $TARGET_DIR
    fi
    
    if [ ! -d $BACKUP_DIR ]
    then 
        mkdir $BACKUP_DIR
    fi
}

pid=
function findPid(){
    pid=$(jps | grep $APP_NAME | awk '{print $1}')
}

case "$1" in
    publish)
    publish
    ;;
    rollback)
    rollback
    ;;
    start)
    start
    ;;
    stop)
    stop
    ;;
    *)
    echo "Usage: {publish | rollback | start | stop}"
    exit 1
    ;;
esac

 

5. 获取工具及源码

关注公众号“全栈程序员老马”,回复jenkins即可获得源码。

 

 

 

posted @ 2025-03-16 11:39  OutOfMemeory  阅读(395)  评论(0)    收藏  举报