一文带你搞懂SpringBoot项目实现自动化部署
前言
要实现springboot项目自动化部署,需要了解下面四个技术点:
- SpringBoot Profiles
- Maven命令
- Jenkins的使用
- 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。

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


通过添加Credentials, 可以配置访问git仓库的账户。
配置git的前提是服务器已经安装了git, 可以使用命令安装
yum install git
- maven配置,在如下的全局工具配置maven安装的路径,当然前提是安装了maven, maven安装这里不做讲解,网上搜一下,安装好后,配置如下:


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

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

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


在高级里面配置密码

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

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

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

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

4. Shell脚本
Linux的Shell脚本命令这里不作详解,大家网上搜索相关文档即可。这里列出一些重点的命令以及语法。
- $1,$2 可以获取到shell脚本启动时的命令参数。
- 函数的定义:function name(){}
- 条件语句:if then .. else .. fi
- 判断分支:case "" in .... esac
- 打印输出命令: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即可获得源码。


浙公网安备 33010602011771号