deploy-go
deploy 是一个基于 SSH / SFTP 的轻量级原子发布 CLI,通过软链接切换实现快速发布与秒级回滚。
特性
- 🚀 原子发布: 通过软链接切换实现零停机发布
- 🔄 快速回滚: 一键回滚到历史版本,秒级恢复
- 🌐 多主机支持: 支持同时部署到多台服务器
- 📦 智能打包: 支持文件包含/排除规则,带进度条显示
- 🪝 钩子支持: 发布前后可执行自定义命令
- 📊 历史记录: 查看部署历史,支持多主机状态对比
- 🔧 灵活配置: 支持环境变量和命令行参数配置
安装
方式一:使用 go install(推荐)
go install cnb.cool/zhiqiangwang/deploy@latest
方式二:手动编译安装
# 克隆项目
git clone https://cnb.cool/zhiqiangwang/deploy
cd deploy-go
# 编译
go build -o deploy .
# 安装到系统路径
sudo mv deploy /usr/local/bin/
快速开始
1. 配置SSH连接
设置环境变量(推荐):
export DEPLOY_HOSTS="user1:[email protected]:22,user2:[email protected]:22"
或者在命令中直接指定:
deploy publish --hosts "user:[email protected]:22" --dir ./myapp --version v1.0.0
2. 发布应用
# 基础发布
deploy publish --dir ./myapp --version v1.0.0
# 指定远程路径
deploy publish \
--dir ./myapp \
--version v1.0.0 \
--remote-repo "/data/wwwroot/myapp/releases" \
--current-link "/data/wwwroot/myapp/current"
# 使用包含/排除规则
deploy publish \
--dir ./myapp \
--version v1.0.0 \
--include "src,public,package.json" \
--exclude "node_modules,.git,*.log"
3. 查看发布历史
deploy history
4. 回滚到历史版本
# 回滚到指定版本
deploy rollback --version v0.9.0
# 使用短选项
deploy rollback -V v0.9.0
命令详解
publish - 发布应用
发布本地目录到远程主机。
标志
| 标志 |
短选项 |
必需 |
默认值 |
说明 |
--dir |
- |
否 |
当前目录 |
本地要发布的目录 |
--version |
-V |
否 |
"main" |
版本号或分支名 |
--hosts |
- |
是 |
- |
主机列表,格式: user[:password]@host[:port] |
--remote-repo |
- |
否 |
/data/wwwroot/{basename}/releases |
远程仓库目录 |
--current-link |
- |
否 |
/data/wwwroot/{basename}/website |
当前版本的软链接 |
--include |
- |
否 |
- |
包含的文件或目录(相对路径) |
--exclude |
- |
否 |
- |
排除的文件或目录(相对路径) |
--hook-pre-host |
- |
否 |
- |
远程发布前执行的命令 |
--hook-post-host |
- |
否 |
- |
远程发布后执行的命令 |
--key |
- |
否 |
- |
SSH私钥文件路径 |
--timeout |
- |
否 |
10s |
SSH连接超时时间 |
使用示例
# 发布到单台主机
deploy publish \
--dir ./frontend \
--version v2.1.0 \
--hosts "deploy:[email protected]:22"
# 发布到多台主机
deploy publish \
--dir ./backend \
--version v1.5.2 \
--hosts "app:[email protected]:22,app:[email protected]:22"
# 使用SSH密钥认证
deploy publish \
--dir ./api \
--version main \
--hosts "[email protected]:22" \
--key ~/.ssh/id_rsa
# 带钩子的发布
deploy publish \
--dir ./app \
--version v3.0.0 \
--hook-pre-host "npm install --production" \
--hook-post-host "systemctl restart app.service"
rollback - 回滚应用
回滚到指定的历史版本。
标志
| 标志 |
短选项 |
必需 |
默认值 |
说明 |
--version |
-V |
是 |
- |
要回滚到的版本号 |
--hosts |
- |
是 |
- |
主机列表 |
--remote-repo |
- |
否 |
- |
远程仓库目录 |
--current-link |
- |
否 |
- |
当前软链接路径 |
使用示例
# 回滚到上一个版本
deploy rollback --version v1.4.2
# 紧急回滚到稳定版本
deploy rollback --version stable-v1.3.1
# 回滚到特定提交
deploy rollback --version abc123def
history - 查看发布历史
查看所有已部署的版本信息。
标志
| 标志 |
说明 |
--hosts |
主机列表 |
--remote-repo |
远程仓库目录 |
--current-link |
当前软链接路径 |
使用示例
# 查看所有主机的发布历史
deploy history
# 查看特定主机的历史(通过hosts过滤)
deploy history --hosts "[email protected]:22"
配置说明
环境变量
| 变量名 |
说明 |
DEPLOY_HOSTS |
SSH主机列表,格式: user[:password]@host[:port] |
DEPLOY_KEY |
SSH私钥文件路径 |
DEPLOY_TIMEOUT |
SSH连接超时时间,如: 30s |
DEPLOY_HOOK_PRE |
发布前在远程主机执行的钩子命令,如: npm install --production |
DEPLOY_HOOK_POST |
发布后在远程主机执行的钩子命令,如: systemctl restart app.service |
发布流程
- 打包: 在本地将指定目录打包为 tar.gz 格式
- 上传: 通过SFTP将压缩包上传到远程服务器
- 解压: 在远程服务器解压到版本目录
- 切换: 更新软链接指向新版本
- 清理: 删除压缩包和旧版本(可选)
故障排查
常见问题
-
SSH连接失败
# 检查主机连通性
ssh user@host
# 检查密钥权限
chmod 600 ~/.ssh/id_rsa
-
权限不足
# 确保用户有远程目录的写权限
sudo chown -R user:user /data/wwwroot/myapp
-
磁盘空间不足
# 手动清理旧版本(登录服务器)
ssh user@host "cd /data/wwwroot/myapp && ls -dt releases/* | tail -n +3 | xargs rm -rf"