跳轉到

D-20260822-02|CI 測試目錄與 Profile 執行架構

背景與驅動力

測試資格原本分散在 workflow、package scripts、Playwright skip 與環境旗標。這使 Private 日常 節省額度的規則被誤套成任何 CI 都不能執行人工視覺,也讓一般 E2E、canonical、nightly 與 release 重複安裝瀏覽器、建立應用程式並維護各自的測試清單。Public 後若直接把完整矩陣套到 每次 PR,也會重複執行與平台無關的 gate。

考慮過的選項

  • 繼續由各 workflow 維護命令與旗標:容易漂移且無法從單一來源回答實際覆蓋,否決。
  • 只以 package scripts 收斂:仍缺少生命週期、平台、長短、必要性與證據類型,否決。
  • 以版本化測試目錄描述 suite,workflow 只決定 policy 與 runner placement(採納)。

決定

  • 主 repo 的 .ci/test-catalog.json 是 suite 資格、順序、命令、artifact、必要性、duration、 evidence、scope 與平台支援的唯一機器權威;resolver 對未知輸入、空 plan、重複或不完整平台 fail closed。workflow 不再自行維護 grep、spec 檔或 OPEN4WD_* suite 選擇旗標。
  • Private 日常只有 GitHub-hosted Linux,平行執行 core 與 E2E;只選 required + short + machine。E2E 不等待 core,且 canonical smoke 與一般 Chromium 共用一次 build。既有 run 32499946409 推估兩 job 比串行單 job 省 675 秒牆鐘,重複 setup 約 45 秒; 後續只以正常 run 被動校正,不另推 A/B 版本。
  • Public 日常執行所有 required + machine,不以 duration 排除;common 只在 Linux 一次, platform 才分 Ubuntu/Windows/macOS。Private/Public 日常都不執行 human-visual。
  • Full / manual 的 Linux hosted、Windows self-hosted、macOS self-hosted,以及三平台 hosted Release readiness,全部呼叫同一 full contract。full 包含 optional、long、canonical、 authoring sources 與 human-visual;三平台 suite ID 與順序必須相同,差異只有 runner/OS。
  • self-hosted 只接受手動 dispatch,不接 push、PR、schedule 或 public event;離線不影響 CI / required。日常聚合器只要求當前 visibility 選中的工作成功,selected skipped、cancelled 或 missing 一律失敗。
  • 人工視覺案例集中在 e2e/manual-visual/,一般 Playwright collection 永遠排除;full runner 明確設定 catalog 擁有的 OPEN4WD_VISUAL_ARTIFACTS=1 產生 artifact。自動成功只代表檔案完整 產生,不代表人工核准。像素、黑畫面、透明度、幾何與 overflow 等機器斷言仍留在日常 gate。
  • 移除 nightly schedule;extended fuzz、performance、canonical completion/performance 等唯一 內容納入 full catalog。每個 full 平台 job 只建立一次 E2E browser artifact,後續群組重用。
  • 一般 Playwright config 排除 catalog 專屬的 canonical、authoring、performance 與 determinism 檔案;專屬 config 只由精確 suite 命令使用,避免日常誤收長測試與 full 重複執行。
  • catalog suite 可明示同 stage/scope 的 supersedes 關係:Public daily 與 full 選到 coverage 時, coverage 取代 unit-core 的重複 assertion run;property、determinism、fuzz、performance 與 integration 維持各自唯一 partition。requiresE2eBuild 不受 suite stage 限制,core-stage 的 determinism 也必須先取得同一份 E2E build。test:unit:performance 僅保留為 test:perf 相容別名, 不另占 full suite。
  • runner 先完成所有非 E2E-build suite,再準備唯一 E2E build 並執行需要它的 suites;避免 full 中的 production build 覆寫測試產物後,後續 browser matrix 誤用不含 harness 的 dist。

後果與影響

repository 從 Private 轉 Public 時依事件 visibility 自動改用 Public 日常 policy,不需再推 CI 設定。Private 日常額度集中在兩個可平行 Linux job,公開後避免三平台重複 common gate;完整 發布證據仍由同一三平台 full contract 提供。代價是 full 為保持跨平台合約一致,會在三平台 重複部分 common suite,且人工視覺 artifact 仍需維護者另行觀看與記錄裁決。

本決策取代 D-20260821-01 的 public-auto=完整 full matrix、舊 self-hosted workflow 與 hosted-full 入口,也取代 D-20260822-01 的「CI 存在即禁止人工視覺」規則;保留 D-20260821-02 的 Private 日常 Chromium、retries=0 與 Docker 按需 parity 原則,改由 catalog profile 執行。