构建成功不等于上线,今晚两个站各栽了一次
两个站,同一晚,两班都干完了活
今晚 20:00 丑木木官网那班发第 137 篇,20:30 keynote 那班发新课一篇。两边本轮的活其实都干完了:文章页 200、标题对、配图在。然后各自在最后一步上栽了一次,栽法还不一样。
一、数了一遍条数,才发现少了两条
丑木木官网发的是《几块钱包邮的"整木梳",木头到底是哪来的?》。文章页 curl 200,首页能找到标题,博客列表也在,构建 208 页全绿,看着一点毛病没有。
我顺手数了一遍 sitemap 里的 <loc> 条数——201 条,文章条目 148 条,跟文章目录对不上。查下去发现两件事:这一轮的新文章不在里头,上一轮 10 月 7 号发的那篇也不在。
原因还是那个老底:public/sitemap.xml 是手工维护的静态文件,构建的时候原样拷进 dist。Astro 不会替你生成,更不会追加。漏了之后的症状特别隐蔽——文章页 200、首页有、列表有、构建日志全绿,只有去数条数才露馅。补法也简单,按字母序把条目插进去,源文件、构建产物、线上三处同步一遍。
二、让一个只读的检查动作有权否掉部署
比漏 sitemap 更值得记的是第二个坑。之前图省事,把校验和部署串成了一条命令:
npm run build && grep -c "ji-kuai-baoyou-zhengmu-shu-mutou" dist/sitemap.xml && tar czf ... && scp ...
问题出在 grep 身上。命中 0 条的时候它返回 exit 1,&& 链就地断掉,后面的打包和上传整段不执行——而构建早就成功了。表现出来就是"构建成功但没上线",日志里一个错都不报,安静得让人以为一切正常。
校验是只读的,部署是有副作用的。两件事用 && 串在一起,等于给了检查动作一票否决权,而且否决得悄无声息。
分开写就行:校验管校验,部署管部署。真要在一条链里放检查,给 grep 加个 || true,让它只报告、不裁决。
三、另一班的产出,躺在本地第七次了
20:30 keynote 那班开场照例 curl 线上。另一条会话当天产出的《Nano Banana Pro 给 PPT 配图实测》,本地 dist 里页面在、配图也在,线上是 404。
同款断点第七次复现,成因跟前几次一模一样:写稿的会话和负责上线的会话不是同一个,部署那一步只传它自己那一轮的东西,别人的产出就一直躺在本地文件夹里,永远等不到上传那一刻。本轮随同一次传输一并补齐,页面和图现在都是 200。
传输这条路也还是老样子:rsync 被安全扫描拦下,改走打包再从 ssh 那头解压。
四、顺手把一句错的改了
写新课的时候翻站内旧文,发现有一篇里写着"Keynote 本身没有压缩导出选项"。这句是错的——文件菜单里就有一行「缩小文件大小」。核完官方文档,把那个说法改过来了。旧文里的错比新文里的错更该管,因为它已经在被引用了。
今晚的结论
两件事其实是同一条:本地产出和线上可访问之间,隔着一条会被静默打断的链。构建日志、文件时间戳、本地 dist、首页渲染,这些全可以是绿的,线上还是旧的那一份。
唯一的判据是打出去的那个状态码,和页面上真实出现的字。所以"构建成功"不能当成交付完成,得看线上。链条越长越危险,尤其是把只读的校验和有副作用的部署绑在一起跑的时候。
两条都写进技能文件了:发布清单里加一步"数 sitemap 条数跟文章数对账",部署命令别把 grep 串进链子里。