Skip to content

Commit 13b8f4e

Browse files
elrrrrrrrclaude
andauthored
fix(playwright): sync from cdn.playwright.dev instead of deprecated azureedge (#1099)
## 问题 playwright >= 1.58 的 chromium 从镜像下载会 404:`binaries/playwright/builds/cft/{browserVersion}/...` 目录为空,从未被同步落盘。 ## 根因 `PlaywrightBinary` 的上游 `DOWNLOAD_HOST` 用的是已废弃的 `playwright.azureedge.net`。实测(跟随 307 重定向): | 上游路径 | azureedge | cdn.playwright.dev | |---|---|---| | `builds/chromium/1200/...`(老,≤1.57) | 200 | 200 | | `builds/cft/145.0.7632.6/mac-arm64/...`(新,1.58.1+) | **400** ❌ | **200** ✅ | azureedge 只认老的 `builds/*`,**不认 playwright 1.58.1 起启用的 `builds/cft/*` 新命名空间**。所以同步 worker 抓 CFT 产物时拿到 400,chromium 二进制永远进不了镜像。 补充确认:playwright 从 1.58 起不再发布老结构 `builds/chromium/{rev}`(`cdn.playwright.dev/builds/chromium/1208` 也 404),1.58+ 的 chromium **只存在于 CFT 路径**,没有旧目录可回退——所以必须把 CFT 同步跑通。 ## 改动 `DOWNLOAD_HOST` 从 `https://playwright.azureedge.net/` 换成 `https://cdn.playwright.dev/`,并同步更新测试断言。 已验证 cdn.playwright.dev 对 driver / firefox / webkit / ffmpeg / 老 chromium / 新 cft chromium **全部 200**,是 azureedge 的安全超集,不影响已有同步。 合并后需触发一次 playwright binary 重新同步,`builds/cft/` 产物才会落盘。 > 配套修复:cnpm/binary-mirror-config#71(把 `PLAYWRIGHT_CHROMIUM_DOWNLOAD_HOST` 从错误的 `chrome-for-testing` 指向移除,修复 ≤1.57 的回归)。 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent ddef97e commit 13b8f4e

2 files changed

Lines changed: 12 additions & 15 deletions

File tree

app/common/adapter/binary/PlaywrightBinary.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import { BinaryType } from '../../enum/Binary.ts';
77
import { AbstractBinary, BinaryAdapter, type BinaryItem, type FetchResult } from './AbstractBinary.ts';
88

99
const PACKAGE_URL = 'https://registry.npmjs.com/playwright-core';
10-
const DOWNLOAD_HOST = 'https://playwright.azureedge.net/';
10+
// playwright.azureedge.net is deprecated and returns 400 for the new
11+
// `builds/cft/*` namespace; cdn.playwright.dev serves both the legacy
12+
// `builds/*` and the CFT paths. See https://github.com/cnpm/cnpmcore/issues/1033
13+
const DOWNLOAD_HOST = 'https://cdn.playwright.dev/';
1114
// https://github.com/playwright-community/playwright-go/blob/56e30d60f8b42785982469eaca6ad969bc2e1946/run.go#L341-L374
1215
const PLAYWRIGHT_DRIVER_ARCHS = ['win32_x64', 'mac-arm64', 'mac', 'linux-arm64', 'linux'];
1316

@@ -480,11 +483,11 @@ export class PlaywrightBinary extends AbstractBinary {
480483
let browserDirname = browser.name;
481484
if (browser.name === 'chromium-headless-shell') {
482485
// chromium-headless-shell should be under chromium
483-
// https://playwright.azureedge.net/builds/chromium/1155/chromium-headless-shell-mac-arm64.zip
486+
// https://cdn.playwright.dev/builds/chromium/1155/chromium-headless-shell-mac-arm64.zip
484487
browserDirname = 'chromium';
485488
} else if (browser.name === 'chromium-tip-of-tree-headless-shell') {
486489
// chromium-tip-of-tree-headless-shell should be under chromium-tip-of-tree
487-
// https://playwright.azureedge.net/builds/chromium-tip-of-tree/1293/chromium-tip-of-tree-headless-shell-mac-arm64.zip
490+
// https://cdn.playwright.dev/builds/chromium-tip-of-tree/1293/chromium-tip-of-tree-headless-shell-mac-arm64.zip
488491
browserDirname = 'chromium-tip-of-tree';
489492
}
490493
for (const [platform, remotePath] of Object.entries(downloadPaths)) {

test/common/adapter/binary/PlaywrightBinary.test.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ describe('test/common/adapter/binary/PlaywrightBinary.test.ts', () => {
100100
assert.equal(item.isDir, false);
101101
assert.match(
102102
item.url,
103-
/https:\/\/playwright\.azureedge\.net\/builds\/cft\/133\.0\.6943\.16\/mac-arm64\/(chrome|chrome-headless-shell)-mac-arm64\.zip/,
103+
/https:\/\/cdn\.playwright\.dev\/builds\/cft\/133\.0\.6943\.16\/mac-arm64\/(chrome|chrome-headless-shell)-mac-arm64\.zip/,
104104
);
105105
}
106106

@@ -110,7 +110,7 @@ describe('test/common/adapter/binary/PlaywrightBinary.test.ts', () => {
110110
assert.ok(chromiumRevResult);
111111
const linuxArm64 = chromiumRevResult.items.find((item) => item.name === 'chromium-linux-arm64.zip');
112112
assert.ok(linuxArm64, 'chromium-linux-arm64.zip should still live at /builds/chromium/1155/');
113-
assert.equal(linuxArm64.url, 'https://playwright.azureedge.net/builds/chromium/1155/chromium-linux-arm64.zip');
113+
assert.equal(linuxArm64.url, 'https://cdn.playwright.dev/builds/chromium/1155/chromium-linux-arm64.zip');
114114
});
115115

116116
it('should fetch subdir: /builds/, /builds/chromium/ work', async () => {
@@ -156,10 +156,7 @@ describe('test/common/adapter/binary/PlaywrightBinary.test.ts', () => {
156156
assert.ok(item.size === '-');
157157
assert.ok(item.url);
158158
assert.ok(item.date);
159-
assert.match(
160-
item.url,
161-
/https:\/\/playwright\.azureedge\.net\/builds\/driver\/(?:next\/)?playwright-\S+-\S+.zip/,
162-
);
159+
assert.match(item.url, /https:\/\/cdn\.playwright\.dev\/builds\/driver\/(?:next\/)?playwright-\S+-\S+.zip/);
163160
}
164161
}
165162
}
@@ -193,7 +190,7 @@ describe('test/common/adapter/binary/PlaywrightBinary.test.ts', () => {
193190
// {
194191
// name: 'chromium-linux.zip',
195192
// isDir: false,
196-
// url: 'https://playwright.azureedge.net/builds/chromium/1000/chromium-linux.zip',
193+
// url: 'https://cdn.playwright.dev/builds/chromium/1000/chromium-linux.zip',
197194
// size: '-',
198195
// date: '2022-04-18T20:51:53.788Z'
199196
// },
@@ -204,16 +201,13 @@ describe('test/common/adapter/binary/PlaywrightBinary.test.ts', () => {
204201
assert.ok(item.date);
205202
if (dirname === 'chromium' && item.name.startsWith('chromium-headless-shell')) {
206203
// chromium should include chromium-headless-shell
207-
assert.match(
208-
item.url,
209-
/https:\/\/playwright\.azureedge\.net\/builds\/chromium\/\d+\/chromium-headless-shell/,
210-
);
204+
assert.match(item.url, /https:\/\/cdn\.playwright\.dev\/builds\/chromium\/\d+\/chromium-headless-shell/);
211205
shouldIncludeChromiumHeadlessShell = true;
212206
}
213207
if (dirname === 'chromium-tip-of-tree' && item.name.startsWith('chromium-tip-of-tree-headless-shell')) {
214208
assert.match(
215209
item.url,
216-
/https:\/\/playwright\.azureedge\.net\/builds\/chromium-tip-of-tree\/\d+\/chromium-tip-of-tree-headless-shell/,
210+
/https:\/\/cdn\.playwright\.dev\/builds\/chromium-tip-of-tree\/\d+\/chromium-tip-of-tree-headless-shell/,
217211
);
218212
shouldIncludeChromiumTipOfTreeHeadlessShell = true;
219213
}

0 commit comments

Comments
 (0)