Java应用在Linux上用rsync+SSH实现多测试环境增量发布,核心是只传变更、不重传、不依赖密钥、可触发可定时,适用于灰度验证、配置热更等场景。

Java 应用在 Linux 上部署时,用 rsync 配合 SSH 实现多测试环境的增量发布,核心是“只传变、不重传、不依赖密钥、可触发可定时”。它不是替代 CI/CD 平台,而是轻量、可靠、即配即用的文件对齐手段,尤其适合灰度验证、配置热更、静态资源同步等场景。
确认基础环境与权限准备
所有参与发布的机器(构建机 + 各测试服务器)需满足:
- 本地构建机装好 rsync 和 sshpass:
sudo apt install -y rsync sshpass(Ubuntu/Debian) - 各目标测试服务器开启密码登录(
/etc/ssh/sshd_config中设PasswordAuthentication yes,并sudo systemctl restart sshd) - Java 项目打包后输出目录结构清晰,例如
target/myapp.jar、src/main/resources/application-test1.yml等,便于按环境筛选 - 各测试服务器上部署路径统一,如
/opt/app/test-env1/、/opt/app/test-env2/,且目录已存在、属主可写
按环境定制 rsync 同步命令
不同测试环境往往只需更新部分文件(如 jar 包 + 对应 profile),避免全量覆盖。推荐为每个环境写独立命令:
- 推送到 test-env1(含 jar + test1 配置):
sshpass -f ~/.env1_pass rsync -avz --delete --exclude='*.log' --exclude='tmp/' target/myapp.jar src/main/resources/application-test1.yml user@192.168.10.11:/opt/app/test-env1/ - 推送到 test-env2(含 jar + test2 配置 + 静态资源):
sshpass -f ~/.env2_pass rsync -avz --delete --exclude='*.log' target/myapp.jar src/main/resources/application-test2.yml src/main/webapp/ user@192.168.10.12:/opt/app/test-env2/ - 注意:源路径末尾有
/表示同步内容;无/则连目录名一起传——Java 部署中通常要求保持目标目录结构不变,所以webapp/末尾加斜杠
封装为可复用的发布脚本
把命令逻辑收口,提升可维护性:
立即学习“Java免费学习笔记(深入)”;
- 新建
/opt/scripts/publish-to.sh,支持传参指定环境:#!/bin/bash<br>ENV=$1<br>CASE $ENV IN<br> test1) HOST="192.168.10.11"; PASS_FILE="~/.env1_pass"; EXCLUDE="--exclude='logs/' --exclude='temp/'" ;;<br> test2) HOST="192.168.10.12"; PASS_FILE="~/.env2_pass"; EXCLUDE="--exclude='logs/'" ;;<br> *) echo "Usage: $0 {test1|test2}"; exit 1 ;;<br>ESAC<br>sshpass -f $PASS_FILE rsync -avz --delete $EXCLUDE target/myapp.jar src/main/resources/application-${ENV}.yml user@$HOST:/opt/app/${ENV}/ - 赋予执行权限:
chmod +x /opt/scripts/publish-to.sh - 调用方式:
/opt/scripts/publish-to.sh test1
接入发布触发链路
让发布动作真正融入流水线节奏:
- Git 推送后自动触发:在代码仓库的
post-receivehook 中加入/opt/scripts/publish-to.sh test1(适用于简单团队) - Jenkins/GitLab CI 调用:在构建成功后 step 中执行
sh /opt/scripts/publish-to.sh test2,配合凭证管理插件安全传入密码文件路径 - 人工快速验证:开发本地打包后,直接运行
./publish-to.sh test1,5 秒完成差异对齐,无需重新构建或重启服务


















