spring boot jar 分离自动部署脚本
背景
远程部署时spring boot 包,比较大。可以采用依赖库和业务包分离的方式。提供一个脚本进行自动部署
maven 配置分离jar包
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<!-- 导入系统路径包 -->
<includeSystemScope>true</includeSystemScope>
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 生成的jar中不要包含pom.xml和pom.properties这两个文件 -->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!--这里需要修改为你的项目的主启动类-->
<mainClass>com.ruoyi.RuoYiApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!--设置将 lib 拷贝到应用 Jar 外面-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
部署脚本
#!/bin/bash
AppName="smart_engineering_admin.jar"
RemoteUser="root"
RemoteHost="xxx.xxx.xxx.xxx"
JVM_OPTS=" -Dloader.path=smart_engineering/lib -Dserver.port=8080 -Dname=$AppName -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
start() {
echo "Starting $AppName on $RemoteHost"
# 定义一个内嵌的函数来远程查询 PID
query() {
ssh "${RemoteUser}@${RemoteHost}" "ps -ef | grep java | grep '$AppName' | grep -v grep | awk '{print \$2}'"
}
# 获取远程进程 ID
PID=$(query)
if [ -n "$PID" ]; then
echo "$AppName is already running on $RemoteHost (pid: $PID)..."
else
echo "Starting $AppName on $RemoteHost..."
ssh "${RemoteUser}@${RemoteHost}" "nohup java $JVM_OPTS -jar smart_engineering/$AppName > /dev/null 2>&1 &"
echo "$AppName started successfully on $RemoteHost."
ssh "${RemoteUser}@${RemoteHost}" "tail -f logs/sys-console.log"
fi
}
sync() {
rsync -avc --delete ruoyi-admin/target/lib/ root@140.143.209.33:smart_engineering/lib
scp ruoyi-admin/target/smart_engineering_admin.jar root@140.143.209.33:smart_engineering/
}
stop() {
echo "Stopping $AppName on $RemoteHost"
# 定义一个内嵌的函数来远程查询 PID
query() {
ssh "${RemoteUser}@${RemoteHost}" "ps -ef | grep java | grep '$AppName' | grep -v grep | awk '{print \$2}'"
}
# 获取进程 ID
PID=$(query)
if [ -n "$PID" ]; then
echo "$AppName (pid:$PID) is running. Sending TERM signal..."
ssh "${RemoteUser}@${RemoteHost}" "kill -TERM $PID"
# 等待进程退出
while [ -n "$PID" ]; do
sleep 1
PID=$(query)
done
echo "$AppName has exited."
else
echo "$AppName is already stopped."
fi
}
sync
stop
sleep 2
start
- 优点
- 依赖包不变化不会同步,减少上传的文件
- 每次都同步业务包,保证准确性
- 提升发布速度
要求
- windows 的wsl下可用
- 需要和服务器配置ssh互信
进一步封装
#!/bin/bash
./mvnw -T 1C clean package -P prod
./push_run.sh