在日常的 Java 开发流程中,将项目打包并部署到远程服务器是一个极其高频的操作。传统的做法往往是:手动执行 ./gradlew bootJar,打开 FTP 客户端,找到 JAR 包,然后慢悠悠地上传。如果网络环境不佳,或者需要经过复杂的**堡垒机(JumpServer)**跳转,这一过程简直是开发者的噩梦。
今天,我要向大家推荐一款大幅提升部署效率的 Gradle 插件------dev.coolrequest.gosync 。它不仅支持极致的增量同步 ,还能自动化处理堡垒机穿透。
github:
1. 痛点分析:为什么需要 gosync?
在传统的部署模式下,我们面临两个主要问题:
- 重复传输: 即使只改了一行代码,也需要上传整个几百 MB 的 JAR,浪费带宽和时间。
- 堡垒机阻隔: 许多公司内网环境必须通过 JumpServer 登录,手动在终端敲命令跳转、再进行文件传输,流程繁琐且难以自动化。
dev.coolrequest.gosync 正是为了解决这些问题而生的。
2. 核心特性
- 智能增量同步 (Smart Sync): 插件会计算本地文件与远程文件的 MD5 校验和。只有在文件内容发生变化时才会触发上传。如果 MD5 一致,直接跳过。
- 依赖自动提取: 自动分析项目的 Runtime 依赖,并将所有依赖包与主程序分离,确保远程
lib目录始终与本地同步。 - 原生支持堡垒机 (JumpServer): 支持配置自动化指令序列,模拟键盘输入,自动完成堡垒机菜单选择并穿透到目标主机。
- 高效集成: 无缝集成到 Gradle 构建生命周期,实现"构建即部署"。
- 无依赖:所有操作都依靠SSH、大量交互命令实现,服务器不需要安装任何软件
3. 快速上手
在你的 build.gradle 文件中添加以下配置,即可开启自动化部署之旅。
配置示例:
groovy
plugins {
id("dev.coolrequest.gosync") version "1.1"
}
goSync {
// 连接模式:可选 "simple" (直连) 或 "jumpserver" (堡垒机)
serverType = "jumpserver"
// 服务器/堡垒机地址
serverAddress = "192.168.1.100"
port = 2222
userName = "admin"
userPass = "your_password"
/**
* 堡垒机专有配置:afterConnectedCommand
* 用于模拟进入堡垒机后的交互命令。
* \r 代表回车。例如:p\r25\r2\r 表示:
* 输入 p -> 回车 -> 输入 1 -> 回车 -> 输入 2 -> 回车
*/
afterConnectedCommand = "p\r25\r2\r"
// 远程服务器存放依赖库(JAR)的绝对路径
libDirectory = "/app/deploy/libs"
// 远程服务器存放主程序 JAR 的绝对路径
mainJarDirectory = "/app/deploy/app-main"
}
4. 工作原理深度解析
gosync 的工作流程非常严谨且高效:
- 构建后触发: 插件会自动挂载在 Gradle 的
jar任务之后。当你执行构建时,它会自动启动。 - 依赖扫描: 插件会提取项目所有的运行时依赖(Runtime Dependencies)。
- MD5 比对:
- 计算本地主 JAR 及所有依赖 JAR 的 MD5 值。
- 通过 SSH 连接远程服务器,获取对应路径下文件的 MD5。
- 按需上传:
- 如果远程不存在该文件 -> 上传。
- 如果远程存在但 MD5 不匹配 -> 覆盖上传。
- 如果 MD5 完全一致 -> 跳过。
- 自动化穿透: 如果配置为
jumpserver模式,插件会建立一个交互式会话,按照afterConnectedCommand预设的指令流自动"敲击键盘",穿透菜单界面,最终定位到目标机进行 SFTP 传输。
5. 如何执行?
你可以手动触发同步任务:
bash
./gradlew goSync
或者,如果你已经配置了任务依赖,只需执行标准的构建命令,部署工作就会在后台静默完成。
6. 总结
dev.coolrequest.gosync 是一款非常懂开发者的插件。它将"增量更新"和"自动化穿透"这两个痛点结合得非常优雅。对于那些深陷复杂内网环境、或是厌倦了漫长上传等待的同学来说,这绝对是一把利器。