把 rsync 换成 tar 管道:一条部署命令的返工
给一台服务器传静态文件,rsync --info=progress2 直接报错。查了一下,macOS 自带的是 openrsync,不是 GNU rsync,一堆参数不认。
装 GNU rsync 当然可以,但我不想让部署依赖本机装了什么。换成 tar 管道:
tar czf - -C dist . | ssh host \
'rm -rf /data/.new && mkdir -p /data/.new && tar xzf - -C /data/.new \
&& rm -rf /data/.old && { [ -d /data/www/site ] && mv /data/www/site /data/.old || true; } \
&& mv /data/.new /data/www/site'
顺手解决了三个原来没解决的问题:
- 传一半时站点不会半新半旧。 先解到暂存目录,再整体
mv,替换是瞬间的。 - 旧文件不残留。 rsync 不加
--delete会留下已删除的文件,tar 解到新目录天然没有这个问题。 - 能回滚。 上一版在
.old,一条mv就回去。
暂存和备份目录放在网站根目录之外,不会被公网访问到。
一条命令的返工,换来一个更稳的部署流程。有时候工具不兼容反而是好事。