先分清一件事:配置被覆盖回旧值,通常不是发布系统主动改的,而是发布流程中某个环节把旧文件重新写回了目标位置。要追踪来源,最有效的方法是先判断覆盖发生在“构建产物”还是“部署落盘”阶段,再决定查构建日志还是查部署记录。下面按两种条件给出不同选择。
如果每次发布后,robots.txt或站点地图文件的内容都回到某个固定旧版本,而人工修改的版本在构建后消失,那么覆盖点很可能在构建环节。典型原因是构建脚本从某个模板目录或缓存目录复制文件,而这个目录里存放的是旧版本。
判断依据是:对比构建前后的文件内容。构建前手工修改的文件如果被覆盖,说明构建脚本有复制或生成动作;如果构建前未被修改、构建后仍是旧值,说明旧值来自构建输入源。
实施动作:在构建脚本中定位所有涉及robots.txt、sitemap.xml的复制、生成或模板渲染命令,逐一确认其输入路径。将输入路径改为当前维护的配置源,或把旧模板移出构建范围。动作结果是:下一次构建产物的内容应与配置源一致,此时再进入部署环节验证,而不是直接判断问题已解决。
如果构建产物内容正确,但发布后线上文件仍是旧值,覆盖点就在部署环节。常见原因是部署脚本从备份目录、上一版本目录或共享存储中拉取文件,而不是使用本次构建产物。
判断依据是:构建产物校验通过,但部署后目标路径的文件内容与构建产物不一致。此时应检查部署脚本中的源路径和目标路径,确认是否存在从旧版本目录复制文件的操作。
实施动作:在部署脚本中增加一步,在写入目标路径前输出源文件的校验值,部署后再输出目标文件的校验值。两者不一致时,说明写入过程被其他步骤干扰。这个动作的结果是:你能区分是源文件选错,还是写入后被其他任务覆盖,从而决定下一步是修源路径还是查并发任务。
无论覆盖发生在哪个阶段,都需要一个可比较的基准。对robots.txt和站点地图文件计算校验值,例如使用sha256sum,在构建后、部署前、部署后三个时间点分别记录。三个值的变化顺序能直接指向覆盖环节。
如果构建后校验值正确、部署前正确、部署后错误,覆盖在部署写入过程;如果构建后正确、部署前错误,覆盖在构建到部署之间的传输或暂存环节。这个方法的假设是:文件内容变化会导致校验值变化,且没有其他任务在相同路径写入。如果存在多个发布任务并行,需要先确认没有并发写入,否则校验值对比会失去指向性。
有些情况下,构建和部署脚本都没有问题,但线上文件仍显示旧值。这时要考虑外部同步任务或缓存层。例如对象存储的同步任务、CDN 的回源缓存、或另一套发布流水线定时覆盖同一路径。
判断依据是:本地构建产物和部署日志都显示写入的是新值,但通过不同网络位置或不同时间访问,返回内容不一致。此时应检查是否有其他系统对同一路径有写入权限,以及缓存层是否返回了过期内容。
实施动作:暂时限制目标路径的写入权限,只保留当前发布流程可写,然后重新发布一次。如果旧值不再出现,说明存在外部写入源;如果旧值仍出现,说明当前发布流程内部仍有未发现的覆盖步骤。这一步的结果是缩小范围,而不是直接修复,修复动作要等确认具体写入源后再执行。
找到覆盖来源后,不要立即恢复全部发布权限。先在受控条件下发布一次,确认目标文件内容与配置源一致,并记录校验值。如果一致,再逐步恢复其他写入权限或同步任务,每恢复一项就检查一次文件内容。这样做的目的是:如果旧值再次出现,你能知道是哪一项恢复操作引入的。
需要说明的是,robots.txt的抓取限制不等于可靠的索引移除,站点地图也不保证收录。配置覆盖问题解决后,收录状态仍取决于搜索引擎的抓取和索引决策,不能把配置正确直接等同于收录恢复。