介绍
FIELDNOTES 已有正确的访客测试,但本地发布脚本可能在测试失败后继续执行,也可能发布另一个包。你的任务是将检查决定与实际交付连接起来。
这个全新环境包含第一单元完成的访客检查和未改变的正式站点。你将修复一个简短的 Bash 流程,拒绝坏输入、发布好输入,并证明后续草稿编辑不会改变保存的包。Workstation、Live Website 和 Candidate Preview 均已准备好。这是本地训练流程,不是 GitHub Actions,也不构成生产安全边界。
让失败阻止发布
本步骤将让同一个候选参数贯穿测试和发布。从 Live Website 开始。打开展览、Plan your visit 和访客导览下载。当前入口是 East gate。通过 FIELDNOTES 返回首页。
切换到 Workstation。cat 打印提供的流程:
cat pipeline.sh
初始脚本先检查,再尝试发布固定的 packages/candidate.tar.gz。彼此独立的命令行会在前一条失败后继续。提供的发布器会自行拒绝未经测试的包;你仍需让流程返回失败,并在两个阶段传递正确输入。
Bash 将第一个参数放在 $1 中。candidate="$1" 把它保存到变量。"$candidate" 将值展开为一个参数,即使路径包含空格也如此。&& 仅在前一条命令退出状态为零时执行下一条。零表示成功,非零表示失败。最后执行的命令决定这个小脚本的结果。
使用第一单元的 here-document 方法替换整个脚本。最后的 BASH 结束字面代码块:
cat > pipeline.sh <<'BASH'
#!/bin/bash
candidate="$1"
python3 tools.py check "$candidate" &&
python3 tools.py publish "$candidate"
BASH
#!/bin/bash 指定解释器。你将明确用 bash 运行,因此无需更改可执行权限。两条命令收到完全相同的包参数。不要添加 || true、删除检查,或把参数换成固定的好包。
测试一个坏候选;这次失败是有意的:
bash pipeline.sh packages/wrong.tar.gz
预期出现 FAIL: Wrong visitor guide content,而没有 Published 行。立即检查退出状态:$? 是前一条命令的退出状态,echo 打印它。请在流程之后直接单独运行:
echo $?
预期为 1。在两条之间执行其他命令会替换这个状态。在 Live Website 重新加载并跟随参观和下载链接:健康基线仍可使用。拒绝发布必须让服务继续正常运行。
如果看到 Bash 语法错误,重新读取保存的文件,并恢复上面的配方。脚本自身损坏不代表发布门禁有效。下一步将证明它也能接受正常输入。
发布你测试过的包
本步骤将让正常候选进入正式站点,并区分保存的包内容和可编辑工作副本。从 Workstation 开始。
提供的 packages/candidate.tar.gz 是准备环境时从 drafts/ 构建的。流程必须使用该保存包,不能根据后来草稿目录中的内容重新构建。
先明确检查候选:
python3 tools.py check packages/candidate.tar.gz
它打印通过信息和冻结包标识。现在模拟开发者在打包后的普通编辑。> 仅替换这个草稿文本文件;引号中的文本由 echo 打印:
echo 'UNREVIEWED DRAFT: use the West gate' > drafts/downloads/guide.txt
确认草稿确实改变:
cat drafts/downloads/guide.txt
它打印 UNREVIEWED DRAFT: use the West gate。这是有意的草稿编辑。不要编辑或重新构建保存的包。
对保存的候选运行修正后的流程:
bash pipeline.sh packages/candidate.tar.gz
预期先出现 PASS: visitor checks. Frozen package ...,再出现 Published frozen package ...,两者标识相同。运行器检查冻结副本,并发布完全相同的字节;它会拒绝没有成功检查记录的包内容。标识只是辅助证据,不能代替检查真实站点。
切换到 Live Website,用 FIELDNOTES 返回首页并重新加载。打开 Explore the exhibition、Plan your visit 和 Download visitor guide。虽然草稿存在未审核编辑,页面和下载仍都写着 East gate。再打开 Step-free route 和 Download access guide;Garden ramp 应保留。检查插画和页面样式完整。
切换到 Workstation。curl 发送 HTTP 请求;-sS 隐藏进度但显示连接错误。127.0.0.1 表示当前实验环境,8081 是正式服务端口。这些请求应在 Workstation 中执行,而非你自己电脑的终端:
curl -sS http://127.0.0.1:8081/downloads/guide.txt
正文以 FIELDNOTES Visitor Guide 开头,并包含 Entrance: East gate。这证明正式站点使用保存包,而不是已修改草稿。如果看到草稿文本,检查流程实际发布哪个输入,然后对提供的未改动候选重新运行正确流程。
最后再检查一次拒绝:
bash pipeline.sh packages/missing.tar.gz
预期发生有意的 404 失败,不会发布。在 Live Website 重新加载并再次下载访客导览;已接受的候选仍可使用。流程现在展示了接受与拒绝两种决定。本实验保护静态站点的本地发布路径,不实现访问控制、签名、托管 CI 或数据库迁移回退。
总结
你使用条件执行阻止坏发布,让同一个包贯穿两个阶段,并在草稿后来改变的情况下仍发布精确受测内容。访客和无障碍路径都保持可用。


