码上拾光

把 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'

顺手解决了三个原来没解决的问题:

  1. 传一半时站点不会半新半旧。 先解到暂存目录,再整体 mv,替换是瞬间的。
  2. 旧文件不残留。 rsync 不加 --delete 会留下已删除的文件,tar 解到新目录天然没有这个问题。
  3. 能回滚。 上一版在 .old,一条 mv 就回去。

暂存和备份目录放在网站根目录之外,不会被公网访问到。

一条命令的返工,换来一个更稳的部署流程。有时候工具不兼容反而是好事。


← 回到文章列表