fix: use sandboxed Chrome in staging gate
This commit is contained in:
@@ -50,7 +50,7 @@ jobs:
|
|||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
python -m pip install -r requirements.txt -r requirements-dev.txt
|
python -m pip install -r requirements.txt -r requirements-dev.txt
|
||||||
python -m pip install playwright
|
python -m pip install playwright
|
||||||
python -m playwright install --with-deps chromium
|
python -m playwright install --with-deps chrome
|
||||||
npm ci --prefix frontend
|
npm ci --prefix frontend
|
||||||
|
|
||||||
- name: Run Python quick quality gate
|
- name: Run Python quick quality gate
|
||||||
|
|||||||
+6
-6
@@ -1519,17 +1519,17 @@
|
|||||||
- 修复版本:待提交(本地可测)
|
- 修复版本:待提交(本地可测)
|
||||||
|
|
||||||
|
|
||||||
## BUG-083 | staging 质量门未固定 Chromium 运行时导致真实浏览器验收偶发失败
|
## BUG-083 | staging 质量门使用无可用 Linux sandbox 的浏览器运行时导致验收失败
|
||||||
|
|
||||||
- 状态:resolved
|
- 状态:resolved
|
||||||
- 首次发现:2026-07-27
|
- 首次发现:2026-07-27
|
||||||
- 最近更新:2026-07-27
|
- 最近更新:2026-07-27
|
||||||
- 影响面:生时校正 V4 的 390px 真实浏览器验收、staging 镜像发布与后续部署
|
- 影响面:生时校正 V4 的 390px 真实浏览器验收、staging 镜像发布与后续部署
|
||||||
- 用户现象:PR 质量门已通过且相同提交的其余 1031 个测试成功,但推送到 `staging` 后唯一的真实 Chromium 测试未能取得 DevTools 端口,导致不可变镜像未发布、部署未继续。
|
- 用户现象:PR 质量门已通过且相同提交的其余 1031 个测试成功,但推送到 `staging` 后唯一的真实 Chromium 测试未能取得 DevTools 端口,导致不可变镜像未发布、部署未继续。
|
||||||
- 触发条件:`backend-quality-gate.yml` 在未安装 Playwright Chromium 的 GitHub Runner 上执行真实浏览器合同,只能依赖 Runner 当时预装的系统 Chrome。
|
- 触发条件:`backend-quality-gate.yml` 未显式供应带系统 sandbox 的浏览器,或安装 Playwright 默认的 `chromium-headless-shell` 后直接用原始二进制启动。
|
||||||
- 根因:staging 质量门新增了真实 Chromium 测试,却没有像既有 `release-quality-gate.yml` 一样显式安装受控的 Playwright Chromium 与系统依赖;同一 SHA 因 Runner 自带浏览器状态不同出现一次通过、一次启动超时。
|
- 根因:真实浏览器测试刻意保留 Chromium sandbox,但 Playwright 默认下载的 `chromium-headless-shell` 是原始构建;当前 GitHub Linux Runner 无法为该原始二进制建立所需 sandbox,进程以 `SIGTRAP` 退出。仅依赖 Runner 偶然预装的 Chrome 也不具备可重复性。
|
||||||
- 修复:复用既有 release gate 的浏览器准备步骤,在 staging 质量门安装 Playwright 和其固定 Chromium 运行时后再执行前端测试;不跳过真实浏览器验收,不增加 `--no-sandbox`。
|
- 修复:通过 Playwright 官方 `chrome` 安装通道供应系统级 stable Chrome 及其依赖,再执行真实浏览器合同;避免选择无系统 sandbox 包装的 headless shell,不跳过验收,也不增加 `--no-sandbox`。
|
||||||
- 验证:workflow 合同回归断言 Playwright Chromium 必须被安装;聚焦部署合同测试、完整前端测试、目标 ESLint、生产构建与 `git diff --check` 通过;staging 质量门和部署结果另行记录。
|
- 验证:workflow 合同回归断言 Playwright stable Chrome 必须被安装;聚焦部署合同测试、完整前端测试、目标 ESLint、生产构建与 `git diff --check` 通过;staging 质量门和部署结果另行记录。
|
||||||
- 防复发:任何 CI 中的真实浏览器合同都必须由 workflow 显式供应浏览器版本与系统依赖,不能依赖 hosted runner 的偶然预装状态。
|
- 防复发:保留浏览器 sandbox 的 CI 必须使用具备系统 sandbox 包装的浏览器安装通道,不能直接启动无相应宿主配置的原始 headless shell,也不能依赖 hosted runner 的偶然预装状态。
|
||||||
- 相关记录:BUG-082
|
- 相关记录:BUG-082
|
||||||
- 修复版本:本次修复提交
|
- 修复版本:本次修复提交
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ test("quality gate validates relevant changes once and publishes a digest manife
|
|||||||
assert.match(workflow, /workflow_dispatch:/);
|
assert.match(workflow, /workflow_dispatch:/);
|
||||||
assert.equal((workflow.match(/npm test --prefix frontend/g) ?? []).length, 1);
|
assert.equal((workflow.match(/npm test --prefix frontend/g) ?? []).length, 1);
|
||||||
assert.match(workflow, /python -m pip install playwright/);
|
assert.match(workflow, /python -m pip install playwright/);
|
||||||
assert.match(workflow, /python -m playwright install --with-deps chromium/);
|
assert.match(workflow, /python -m playwright install --with-deps chrome/);
|
||||||
assert.doesNotMatch(workflow, /npm run test:db --prefix frontend/);
|
assert.doesNotMatch(workflow, /npm run test:db --prefix frontend/);
|
||||||
assert.match(workflow, /id: api_build[\s\S]*steps\.api_build\.outputs\.digest/);
|
assert.match(workflow, /id: api_build[\s\S]*steps\.api_build\.outputs\.digest/);
|
||||||
assert.match(workflow, /id: web_build[\s\S]*steps\.web_build\.outputs\.digest/);
|
assert.match(workflow, /id: web_build[\s\S]*steps\.web_build\.outputs\.digest/);
|
||||||
|
|||||||
Reference in New Issue
Block a user