两台电脑一条命令:给本地采集器做一个靠得住的安装和更新

两台电脑一条命令:靠得住的安装和更新 — 封面

我的工作台靠两台电脑上的采集器喂数据:一台 Mac,一台 Windows。采集器是几个 Python 脚本加一份配置,最初每次改完代码,我都要手动把文件拷到两台电脑上,再对照着改配置。拷漏一个文件、配置少一个字段,问题往往要过一天、等到第二天定时任务跑完才会暴露。

后来我把它改成了一条命令安装和更新。这篇讲这条命令背后做了哪些事,以及为什么要这样做。

一、文件从哪来:和部署走同一条路

采集器的代码放在站点的运维仓库里。服务器每 5 分钟拉一次仓库,有新提交就自动部署(详见《个人站点也能 GitOps》),采集器文件顺带同步到工作台下的一个目录,并且和工作台一样需要登录才能下载。

这样就只有一个来源:改代码、提交、等工作台显示新提交部署完成,然后在各台电脑上跑安装命令。要是没等部署完就装,装到的还是旧版本。

二、先校验,再动手

仓库里有一份 MANIFEST.txt,列出每个文件的 sha256,由一个小脚本在提交前生成。安装器下载完所有文件后,逐个算哈希和清单比对,有任何一个对不上就停下,什么都不改。

# make_manifest.py 生成的清单,一行一个文件
3f9a...c21e  collect.py
8b07...4d90  advisor.py
...

# 安装器里的校验(示意)
while read -r sum name; do
  echo "$sum  $tmp/$name" | shasum -a 256 -c --status \
    || { echo "校验失败: $name"; exit 1; }
done < "$tmp/MANIFEST.txt"

这一步挡的是两种情况:下载到一半断了,以及清单和文件不是同一次提交的。前者在网络不稳的环境里并不少见。

三、哪些文件能动,哪些不能

采集器目录里有两类文件:一类是代码,每次更新都该覆盖;另一类是这台电脑自己的东西,比如访问令牌、本机配置、历史记录、缓存。后者一旦被覆盖,轻则重新配置,重则丢掉积累的数据。

  • 代码文件:覆盖前先把旧文件整体备份一份,出问题可以直接退回。
  • 本机状态文件:令牌、历史记录、缓存,安装器一律不碰。它们在仓库里也被 .gitignore 排除,根本不会出现在下载列表里。
  • 旧的脚本:Windows 上还有一套更早的 PowerShell 采集脚本和它的启动脚本,仍在负责同步项目。新安装器明确跳过它们,新旧两套并行,互不干扰。

四、配置:只补缺的,不改有的

新版本经常会加配置项。如果安装器直接用新的默认配置覆盖,本机改过的设置就没了;如果完全不管,新功能又会因为缺字段而报错。

做法是合并:以本机现有配置为准,只把默认配置里有、本机没有的字段补进去。Windows 和 Mac 各有一份默认配置,因为两台电脑用的模型和开启的功能不一样。

def merge_missing(local: dict, default: dict) -> list[str]:
    """把 default 里有、local 里没有的键补进 local;返回补了哪些"""
    added = []
    for k, v in default.items():
        if k not in local:
            local[k] = v
            added.append(k)
        elif isinstance(v, dict) and isinstance(local[k], dict):
            added += [f"{k}.{x}" for x in merge_missing(local[k], v)]
    return added

安装结束时把补了哪些字段打印出来,我就知道这次更新带来了什么新配置。

五、装完当场验证

安装器的最后一步是在这台电脑上把单元测试跑一遍,并打印当前提示词的版本号。测试过了,说明代码和这台电脑的 Python 环境是配得上的;版本号对上了,说明装到的确实是刚提交的那一版。

Windows 上,安装器还会顺手注册定时任务。原来要在“任务计划程序”里点好几层的事,现在不用再手动做。

六、密码不落地

下载需要工作台的登录密码。安装命令里不写死密码,而是运行时提示输入:Mac 上用 read -rs,Windows 上用 Read-Host -AsSecureString,输入不回显,用完马上清掉变量。

# Mac(zsh)
read -rs "PW?password: "; echo; export PW
curl -fsS -u "user:$PW" https://example.com/collector/install.sh -o /tmp/install.sh \
  && bash /tmp/install.sh
unset PW

这样命令可以放心地存进笔记、贴进文档,里面没有任何秘密。

小结

一条安装命令里真正重要的不是“一条”,而是它把几件容易出错的事固定下来:文件来源唯一、下载完先校验、本机状态不碰、配置只补不改、装完当场测试。哪怕只有两台电脑,这些也值得做,因为最容易出错的就是“只是拷几个文件”这种事。


上一篇
下一篇