deploy 是一个基于 SSH / SFTP 的轻量级原子发布 CLI,通过软链接切换实现快速发布与秒级回滚。
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/
设置环境变量(推荐):
export DEPLOY_HOSTS="user1:password1@192.168.1.10:22,user2:password2@192.168.1.11:22"
或者在命令中直接指定:
deploy publish --hosts "user:password@192.168.1.10:22" --dir ./myapp --version v1.0.0
# 基础发布
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"
deploy history
# 回滚到指定版本
deploy rollback --version v0.9.0
# 使用短选项
deploy rollback -V v0.9.0
发布本地目录到远程主机。
| 标志 | 短选项 | 必需 | 默认值 | 说明 |
|---|---|---|---|---|
--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:password@192.168.1.100:22"
# 发布到多台主机
deploy publish \
--dir ./backend \
--version v1.5.2 \
--hosts "app:secret123@192.168.1.10:22,app:secret123@192.168.1.11:22"
# 使用SSH密钥认证
deploy publish \
--dir ./api \
--version main \
--hosts "deploy@192.168.1.10: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"
回滚到指定的历史版本。
| 标志 | 短选项 | 必需 | 默认值 | 说明 |
|---|---|---|---|---|
--version | -V | 是 | - | 要回滚到的版本号 |
--hosts | - | 是 | - | 主机列表 |
--remote-repo | - | 否 | - | 远程仓库目录 |
--current-link | - | 否 | - | 当前软链接路径 |
# 回滚到上一个版本
deploy rollback --version v1.4.2
# 紧急回滚到稳定版本
deploy rollback --version stable-v1.3.1
# 回滚到特定提交
deploy rollback --version abc123def
查看所有已部署的版本信息。
| 标志 | 说明 |
|---|---|
--hosts | 主机列表 |
--remote-repo | 远程仓库目录 |
--current-link | 当前软链接路径 |
# 查看所有主机的发布历史
deploy history
# 查看特定主机的历史(通过hosts过滤)
deploy history --hosts "web1@192.168.1.10: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 |
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"