logo
0
0
WeChat Login
♻️ refactor: 移除本地打包前执行的命令功能

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: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

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-10sSSH连接超时时间

使用示例

# 发布到单台主机 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"

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 "web1@192.168.1.10:22"

配置说明

环境变量

变量名说明
DEPLOY_HOSTSSSH主机列表,格式: user[:password]@host[:port]
DEPLOY_KEYSSH私钥文件路径
DEPLOY_TIMEOUTSSH连接超时时间,如: 30s
DEPLOY_HOOK_PRE发布前在远程主机执行的钩子命令,如: npm install --production
DEPLOY_HOOK_POST发布后在远程主机执行的钩子命令,如: systemctl restart app.service

发布流程

  1. 打包: 在本地将指定目录打包为 tar.gz 格式
  2. 上传: 通过SFTP将压缩包上传到远程服务器
  3. 解压: 在远程服务器解压到版本目录
  4. 切换: 更新软链接指向新版本
  5. 清理: 删除压缩包和旧版本(可选)

故障排查

常见问题

  1. SSH连接失败

    # 检查主机连通性 ssh user@host # 检查密钥权限 chmod 600 ~/.ssh/id_rsa
  2. 权限不足

    # 确保用户有远程目录的写权限 sudo chown -R user:user /data/wwwroot/myapp
  3. 磁盘空间不足

    # 手动清理旧版本(登录服务器) ssh user@host "cd /data/wwwroot/myapp && ls -dt releases/* | tail -n +3 | xargs rm -rf"