au_deploy
v1.0.9
Published
Automatically deploy the package to the server
Downloads
97
Maintainers
Readme
au_deploy
au_deploy 是一个基于 SFTP 的自动化部署命令行工具,用于把本地打包产物上传到服务器指定目录。
脚本会根据当前执行命令所在目录,自动推导本地打包产物路径和服务器发布目录。上传时会先把新版本传到 .uploading 临时路径,上传成功后再备份旧版本并切换到正式路径,尽量避免上传中断导致线上目录缺失或内容不完整。
执行命令后会先询问是否确认部署。输入 Yes(或 Y)后才执行后续逻辑;输入 No(或 N)会直接取消部署。
功能
- 自动识别当前项目名,并上传对应的打包产物。
- 执行部署前通过
Yes/No进行人工确认。 - 支持目录和单文件上传。
- 上传前自动清理上一次残留的
.uploading临时路径。 - 已存在同名远端文件或目录时,会先重命名为备份。
- 备份名格式为
原文件名.bakYYYYMMDD.HHMMSS,例如au_deploy.bak20260707.125959。 - 自动清理 48 小时前的历史备份,近 48 小时内的备份会保留。
- 目录上传显示文件数量进度,单文件上传显示字节进度。
- 上传成功后输出页面访问链接。
- 支持彩色日志输出,方便区分信息、成功、警告、错误和进度。
- 支持通过
AU_DEPLOY_USERNAME和AU_DEPLOY_PASSWORD环境变量传入服务器登录凭据,并优先于命令行参数。
安装
全局安装:
npm i au_deploy -g项目内安装(开发依赖):
npm i au_deploy -D如果发布 npm 时改成了 scoped package,例如 @your-scope/au_deploy,安装命令中的包名替换成实际包名即可。
使用
进入需要部署的项目目录后,根据安装方式执行对应命令。
请在源码项目目录中执行部署命令。工具会根据当前目录名和父级目录名推导本地打包产物及服务器发布目录。
全局安装后
推荐使用环境变量传入服务器用户名和密码:
au_deploy --host <host> --port <port>
示例:
au_deploy --host 120.25.233.113 --port 22兼容旧用法,也可以通过命令行参数传入用户名和密码:
au_deploy --host <host> --port <port> --username <username> --password <password>
示例:
au_deploy --host 120.25.233.113 --port 22 --username h5_dev --password ******** 不推荐长期使用 --password,因为命令参数可能出现在 Shell 历史记录或进程列表中。
项目内安装后
通过 npx 执行项目本地安装的命令:
npx au_deploy --host <host> --port <port>
示例:
npx au_deploy --host 120.25.233.113 --port 22兼容旧用法,也可以通过命令行参数传入用户名和密码:
npx au_deploy --host <host> --port <port> --username <username> --password <password>
示例:
npx au_deploy --host 120.25.233.113 --port 22 --username h5_dev --password ******** 两种安装方式支持的参数和环境变量完全一致。
参数说明
| 参数 | 必填 | 说明 |
| --- | --- | --- |
| --host | 是 | 服务器地址,也会用于生成最终访问链接 |
| --port | 是 | SSH/SFTP 端口,通常为 22 |
| --username | 否 | 服务器登录用户名;建议改用 AU_DEPLOY_USERNAME |
| --password | 否 | 服务器登录密码;建议改用 AU_DEPLOY_PASSWORD |
环境变量
| 环境变量 | 说明 |
| --- | --- |
| AU_DEPLOY_USERNAME | 服务器登录用户名 |
| AU_DEPLOY_PASSWORD | 服务器登录密码 |
macOS / Linux 可以临时这样使用:
配置环境变量
zsh(macOS 默认)
打开配置文件:
nano ~/.zshrc在文件末尾添加:
export AU_DEPLOY_USERNAME='你的服务器用户名' export AU_DEPLOY_PASSWORD='你的真实密码'保存并退出 nano:按
Control + O,按Enter确认,再按Control + X。重新加载配置:
source ~/.zshrc
bash
打开配置文件:
nano ~/.bash_profile在文件末尾添加:
export AU_DEPLOY_USERNAME='你的服务器用户名' export AU_DEPLOY_PASSWORD='你的真实密码'保存并退出 nano:按
Control + O,按Enter确认,再按Control + X。重新加载配置:
source ~/.bash_profile
如果还会直接启动交互式非登录 Bash,可将环境变量写入 ~/.bashrc,并在 ~/.bash_profile 中添加:
[ -f ~/.bashrc ] && source ~/.bashrc这样环境变量只需保存在 ~/.bashrc 中,无需重复配置。
Windows
打开“高级系统设置”,进入“环境变量”,然后在“用户变量”中分别新建:
| 变量名 | 变量值 |
| --- | --- |
| AU_DEPLOY_USERNAME | h5_dev(或你的服务器用户名) |
| AU_DEPLOY_PASSWORD | 你的真实密码 |
保存后重新打开命令提示符、PowerShell 或终端,使配置生效。
验证配置
不要使用 echo "$AU_DEPLOY_PASSWORD" 验证,否则密码会直接显示在终端中。
验证当前终端:
if [ -n "${AU_DEPLOY_PASSWORD:-}" ]; then
echo "AU_DEPLOY_PASSWORD 已设置"
else
echo "AU_DEPLOY_PASSWORD 未设置"
fi也可以分别验证 zsh 和 bash:
zsh -ic '[[ -n ${AU_DEPLOY_PASSWORD:-} ]] && echo "zsh:已设置" || echo "zsh:未设置"'
bash -lc '[[ -n ${AU_DEPLOY_PASSWORD:-} ]] && echo "bash:已设置" || echo "bash:未设置"'关闭并重新打开终端后再次验证,可确认配置在 Shell 重启后仍然有效。
删除环境变量
打开此前写入环境变量的配置文件,例如:
nano ~/.zshrc # 或 nano ~/.bash_profile # 或 nano ~/.bashrc删除以下配置行并保存:
export AU_DEPLOY_USERNAME='你的服务器用户名' export AU_DEPLOY_PASSWORD='你的真实密码'从当前终端中立即清除变量:
unset AU_DEPLOY_USERNAME AU_DEPLOY_PASSWORD重新加载修改过的配置文件,或关闭并重新打开终端。
验证密码变量已删除:
if [ -z "${AU_DEPLOY_PASSWORD:-}" ]; then echo "AU_DEPLOY_PASSWORD 已删除" else echo "AU_DEPLOY_PASSWORD 仍然存在" fi
Windows 用户可在“高级系统设置”→“环境变量”→“用户变量”中删除对应变量,然后重新打开终端。
CI/CD 中建议把 AU_DEPLOY_USERNAME 和 AU_DEPLOY_PASSWORD 配置到平台提供的 Secret / Environment Variables 中,不要提交到代码仓库。
目录约定
脚本会以“执行命令时所在目录”为当前项目目录:
currentDirName = 当前目录名
parentName = 当前目录的父级目录名本地打包产物路径会根据父级目录名推导:
| 父级目录名 | 本地打包产物根目录 |
| --- | --- |
| skills | act_test |
| act_dev | act_test |
| page_dev | page_test |
例如当前执行目录是:
/project/act_dev/au_deploy则脚本会尝试上传:
/project/act_test/au_deploy服务器目标目录会根据父级目录名推导:
| 父级目录名 | 服务器目标目录 |
| --- | --- |
| skills | remote/h5/act |
| act_dev | remote/h5/act |
| page_dev | remote/h5 |
如果父级目录名不在上述配置中,脚本会直接报错,避免误上传到错误目录。
访问链接
上传成功后,脚本会输出访问链接:
访问链接:http://<host>/h5/<当前执行目录名称>/index.html或:
访问链接:http://<host>/h5/act/<当前执行目录名称>/index.html链接生成规则:
remote/h5会转换为/h5。remote/h5/act会转换为/h5/act。- 当前执行目录名会作为页面目录名。
- 最后固定拼接
index.html。 - 如果
--host传入了http://或https://,脚本会去掉协议后再统一输出http://链接。
例如当前目录名是 au_deploy,--host 是 120.25.233.113:
remote/h5/au_deploy -> http://120.25.233.113/h5/au_deploy/index.html
remote/h5/act/au_deploy -> http://120.25.233.113/h5/act/au_deploy/index.html访问链接只会在上传成功后输出,上传失败时不会输出。
部署流程
假设当前项目名为 au_deploy,服务器正式路径为:
remote/h5/act/au_deploy部署时流程如下:
- 校验本地打包产物是否存在。
- 连接服务器。
- 确保服务器目标目录存在。
- 列出目标目录第一层级内容,方便确认远端状态。
- 清理残留的临时上传路径,例如
remote/h5/act/au_deploy.uploading。 - 上传新版本到
.uploading临时路径。 - 上传成功后,清理 48 小时前的历史备份。
- 如果服务器存在同名正式路径,则重命名为备份,例如
au_deploy.bak20260707.125959。 - 将
.uploading临时路径重命名为正式路径。 - 如果正式路径切换失败,脚本会尝试把刚才生成的备份恢复回正式路径。
- 上传成功后输出访问链接。
备份和清理规则
当服务器已存在同名文件或目录时,不会直接覆盖,而是先重命名为备份:
au_deploy -> au_deploy.bak20260707.125959备份清理规则:
- 只清理与当前上传目标同名的备份。
- 只清理超过 48 小时的备份。
- 近 48 小时内的备份会保留,方便回滚。
例如当前上传目标是 au_deploy,脚本只会处理类似下面的备份:
au_deploy.bak20260707.010135
au_deploy.bak20260707.010234不会处理其他项目的备份文件。
上传进度
目录上传时,进度按已上传文件数量统计:
上传进度:3/20 (15%) 目标文件 -> remote/h5/act/au_deploy/index.html单文件上传时,进度按字节大小统计:
上传进度:256.0KB/1.2MB (21%)日志说明
脚本会输出彩色日志:
- 青色:普通信息。
- 绿色:连接成功、上传完成、访问链接等成功信息。
- 黄色:备份、清理、切换等需要关注的操作。
- 红色:错误信息。
- 蓝色:上传进度。
- 灰色:服务器目录列表。
- 亮白色:本地路径、远端路径和访问链接。
注意事项
- 请在源码项目目录中执行命令,不要在打包产物目录中执行。
- 执行目录的父级目录名必须是
skills、act_dev或page_dev。 - 服务器需要允许当前账号通过 SFTP 创建目录、上传文件、重命名和删除文件。
- 访问链接默认使用
http://,如果线上实际使用 HTTPS,需要手动替换协议或后续扩展脚本配置。 AU_DEPLOY_USERNAME和AU_DEPLOY_PASSWORD只存在于运行环境中,不应该写入 README 示例之外的真实凭据,也不要提交到 Git。- 如果部署中断,下次部署会先清理残留的
.uploading临时路径。
常见问题
为什么推荐使用 AU_DEPLOY_PASSWORD?
因为 --password 属于命令行参数,可能被 shell history 记录,也可能在命令运行期间通过进程列表看到。环境变量也不是绝对安全,但比把密码直接写在命令参数里更适合作为 npm CLI 的默认方案。
服务器没有同名文件时会发生什么?
脚本会输出新文件/目录提示,不会生成备份,上传完成后直接把 .uploading 临时路径切换为正式路径。
上传失败会影响线上目录吗?
如果失败发生在临时上传阶段,正式路径不会被移动。如果失败发生在最终切换阶段,脚本会尝试把刚刚重命名出来的备份恢复为正式路径。
为什么访问链接和服务器目录不完全一样?
服务器目录以 remote 作为发布根目录,但浏览器访问路径从 h5 开始。因此脚本会把 remote/h5 转成 /h5,把 remote/h5/act 转成 /h5/act。
