diff --git a/.github/workflows/test-and-deploy.yml b/.github/workflows/test-and-deploy.yml index f2bcbae..4fdb0c3 100644 --- a/.github/workflows/test-and-deploy.yml +++ b/.github/workflows/test-and-deploy.yml @@ -50,7 +50,7 @@ jobs: - name: 检查部署凭据 run: | if [ -z "${CLOUDFLARE_API_TOKEN}" ]; then - echo "::error::缺少仓库 secret CLOUDFLARE_API_TOKEN,本次没有发布。请在 Settings → Secrets and variables → Actions 里添加一个带 Workers Scripts: Edit 权限的 Cloudflare API token,然后重新运行本工作流。" + echo "::error::缺少 CLOUDFLARE_API_TOKEN,本次没有发布。请在仓库(或组织)的 Settings → Secrets and variables → Actions 里添加一个带 Workers Scripts: Edit 权限的 Cloudflare API token,然后重新运行本工作流。" exit 1 fi - name: 构建并发布 diff --git a/README.md b/README.md index 99c3dbd..f20cfa3 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ bun run deploy # 先构建,再用 bunx wrangler deploy 发布 dist/ 产物只能来自仓库内容:`bun run build` 每次都会清空并重建 `dist/`,`bun run deploy` 也会先跑一遍构建,所以线上不会出现「仓库里已经有这节课、站点上还是 404」的漂移。这个漂移真实发生过:站点一度停在 4 节课,而仓库已经补到 40 节课,原因是构建与部署只在某台机器上手工跑过一次、此后再没人重跑。 -发布前先跑 `bun test`。其中 [`tests/deploy-assets.test.ts`](./tests/deploy-assets.test.ts) 守住这条链路:构建产物覆盖 `courseData` 里的每一节课(缺课、`dist/` 里残留上一次的旧页面都会失败)、课程地址的末尾斜杠跳转(静态资源的 `html_handling`)与 Worker 的中文 404 仍然在,以及部署目标(Worker 名、`dist` 目录、自定义域名)与文档写的是同一个。发布默认是自动的:main 上的每次推送都由 [`.github/workflows/test-and-deploy.yml`](./.github/workflows/test-and-deploy.yml) 接手——先跑 `bun test`,通过后 `bun run deploy` 发布,最后抽检线上(每一节课、末尾斜杠跳转、词条面板、中文 404),任一步失败都会让这次运行变红。它需要仓库 secret `CLOUDFLARE_API_TOKEN`(权限 `Workers Scripts: Edit`;账号 ID 不是凭据,已经写在仓库里),缺这个 secret 时发布步骤会明确失败、不会静默跳过。手动发布仍然可用:在有 Cloudflare 凭据的机器上 `bunx wrangler login` 之后 `bun run deploy`,出错用 `bunx wrangler rollback` 退回上一个版本。 +发布前先跑 `bun test`。其中 [`tests/deploy-assets.test.ts`](./tests/deploy-assets.test.ts) 守住这条链路:构建产物覆盖 `courseData` 里的每一节课(缺课、`dist/` 里残留上一次的旧页面都会失败)、课程地址的末尾斜杠跳转(静态资源的 `html_handling`)与 Worker 的中文 404 仍然在,以及部署目标(Worker 名、`dist` 目录、自定义域名)与文档写的是同一个。发布默认是自动的:main 上的每次推送都由 [`.github/workflows/test-and-deploy.yml`](./.github/workflows/test-and-deploy.yml) 接手——先跑 `bun test`,通过后 `bun run deploy` 发布,最后抽检线上(每一节课、末尾斜杠跳转、词条面板、中文 404),任一步失败都会让这次运行变红。它需要 `CLOUDFLARE_API_TOKEN`(权限 `Workers Scripts: Edit`;账号 ID 不是凭据,已经写在仓库里)——仓库级或组织级共享的 secret 都可以,缺它时发布步骤会明确失败、不会静默跳过。手动发布仍然可用:在有 Cloudflare 凭据的机器上 `bunx wrangler login` 之后 `bun run deploy`,出错用 `bunx wrangler rollback` 退回上一个版本。 发布后可以直接拿同一套浏览器复验打线上——`CSP_E2E_ORIGIN` 会复用已在运行的服务、不再自启开发服务器: diff --git a/docs/feature-checklist.md b/docs/feature-checklist.md index a0773fd..b80a683 100644 --- a/docs/feature-checklist.md +++ b/docs/feature-checklist.md @@ -114,7 +114,7 @@ | 键盘可达与焦点可见 | 已完成 | 全部 40 课都由 `bun run e2e:keyboard` 在无头 Chrome 里发真实按键事件复验(328 项检查:结构检查每课 8 项 + S1-02 与 S3-01 的键盘深路径每课 4 项),覆盖 Tab 绕圈全程可见焦点环、无正数 tabindex 打乱顺序、音效开关 Space 可切换、词条 Enter/Escape 与焦点归还、步进门闩挡得住、提交后焦点交给结果区;`tests/keyboard-access-contract.test.ts` 在 `bun test` 里逐课锁住两处焦点恢复动作(作答重画题面、提交成功),焦点环观感与读屏语气仍待人工确认 | | 可复制的代码模板与错误对照 | 下一步 | 帮助初学者辨识常见 C++ 错误;不在浏览器端执行不受控代码 | | 教师备课打印版 | 下一步 | 便于课堂使用;默认不包含学生账号或行为追踪 | -| 可选的公开静态发布 | 已完成 | 课程站点发布在 ,由 Cloudflare Worker `csp-cpp-courseware` 托管静态资源;`bun run build` 从仓库内容重建 `dist/`,`bun run deploy` 先构建再发布,线上内容就是仓库的构建结果;课程地址的末尾斜杠跳转由静态资源的 `html_handling` 负责(Worker 看不到这类请求),Worker 只把 404 换成中文说明。main 上的推送由 `.github/workflows/test-and-deploy.yml` 自动发布(先 `bun test`,再 `bun run deploy`,最后抽检线上每一节课、末尾斜杠跳转、词条面板与中文 404),需要仓库 secret `CLOUDFLARE_API_TOKEN`。零账号、零排行榜、零在线判题、零个人画像的边界不变 | +| 可选的公开静态发布 | 已完成 | 课程站点发布在 ,由 Cloudflare Worker `csp-cpp-courseware` 托管静态资源;`bun run build` 从仓库内容重建 `dist/`,`bun run deploy` 先构建再发布,线上内容就是仓库的构建结果;课程地址的末尾斜杠跳转由静态资源的 `html_handling` 负责(Worker 看不到这类请求),Worker 只把 404 换成中文说明。main 上的推送由 `.github/workflows/test-and-deploy.yml` 自动发布(先 `bun test`,再 `bun run deploy`,最后抽检线上每一节课、末尾斜杠跳转、词条面板与中文 404),需要 `CLOUDFLARE_API_TOKEN`(仓库级或组织级共享 secret 均可)。零账号、零排行榜、零在线判题、零个人画像的边界不变 | ## 不做