chore: make sure that we print warning for unsupported OS (#27610)

Also, fix some missing paths in download lists.
This commit is contained in:
Dmitry Gozman 2023-10-16 10:49:57 -07:00 committed by GitHub
parent b2dc0d2fbd
commit d83d9ce268
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 40 deletions

View File

@ -20,7 +20,7 @@ import * as os from 'os';
import childProcess from 'child_process'; import childProcess from 'child_process';
import * as utils from '../../utils'; import * as utils from '../../utils';
import { spawnAsync } from '../../utils/spawnAsync'; import { spawnAsync } from '../../utils/spawnAsync';
import { hostPlatform } from '../../utils/hostPlatform'; import { hostPlatform, isOfficiallySupportedPlatform } from '../../utils/hostPlatform';
import { buildPlaywrightCLICommand } from '.'; import { buildPlaywrightCLICommand } from '.';
import { deps } from './nativeDeps'; import { deps } from './nativeDeps';
import { getPlaywrightVersion } from '../../utils/userAgent'; import { getPlaywrightVersion } from '../../utils/userAgent';
@ -85,15 +85,13 @@ export async function installDependenciesWindows(targets: Set<DependencyGroup>,
export async function installDependenciesLinux(targets: Set<DependencyGroup>, dryRun: boolean) { export async function installDependenciesLinux(targets: Set<DependencyGroup>, dryRun: boolean) {
const libraries: string[] = []; const libraries: string[] = [];
let platform = hostPlatform; const platform = hostPlatform;
if (platform === 'generic-linux' || platform === 'generic-linux-arm64') { if (!isOfficiallySupportedPlatform)
console.warn('BEWARE: your OS is not officially supported by Playwright; installing dependencies for Ubuntu as a fallback.'); // eslint-disable-line no-console console.warn(`BEWARE: your OS is not officially supported by Playwright; installing dependencies for ${platform} as a fallback.`); // eslint-disable-line no-console
platform = hostPlatform === 'generic-linux' ? 'ubuntu20.04' : 'ubuntu20.04-arm64';
}
for (const target of targets) { for (const target of targets) {
const info = deps[platform]; const info = deps[platform];
if (!info) { if (!info) {
console.warn('Cannot install dependencies for this linux distribution!'); // eslint-disable-line no-console console.warn(`Cannot install dependencies for ${platform}!`); // eslint-disable-line no-console
return; return;
} }
libraries.push(...info[target]); libraries.push(...info[target]);

View File

@ -25,7 +25,7 @@ import { fetchData } from '../../utils/network';
import { getEmbedderName } from '../../utils/userAgent'; import { getEmbedderName } from '../../utils/userAgent';
import { getFromENV, getAsBooleanFromENV, calculateSha1, wrapInASCIIBox, getPackageManagerExecCommand } from '../../utils'; import { getFromENV, getAsBooleanFromENV, calculateSha1, wrapInASCIIBox, getPackageManagerExecCommand } from '../../utils';
import { removeFolders, existsAsync, canAccessFile } from '../../utils/fileUtils'; import { removeFolders, existsAsync, canAccessFile } from '../../utils/fileUtils';
import { hostPlatform } from '../../utils/hostPlatform'; import { type HostPlatform, hostPlatform, isOfficiallySupportedPlatform } from '../../utils/hostPlatform';
import { spawnAsync } from '../../utils/spawnAsync'; import { spawnAsync } from '../../utils/spawnAsync';
import type { DependencyGroup } from './dependencies'; import type { DependencyGroup } from './dependencies';
import { transformCommandsForRoot, dockerVersion, readDockerVersionSync } from './dependencies'; import { transformCommandsForRoot, dockerVersion, readDockerVersionSync } from './dependencies';
@ -73,11 +73,10 @@ const EXECUTABLE_PATHS = {
}, },
}; };
const DOWNLOAD_PATHS = { type DownloadPaths = Record<HostPlatform, string | undefined>;
const DOWNLOAD_PATHS: Record<BrowserName | InternalTool, DownloadPaths> = {
'chromium': { 'chromium': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/chromium/%s/chromium-linux.zip',
'generic-linux-arm64': 'builds/chromium/%s/chromium-linux-arm64.zip',
'ubuntu18.04': 'builds/chromium/%s/chromium-linux.zip', 'ubuntu18.04': 'builds/chromium/%s/chromium-linux.zip',
'ubuntu20.04': 'builds/chromium/%s/chromium-linux.zip', 'ubuntu20.04': 'builds/chromium/%s/chromium-linux.zip',
'ubuntu22.04': 'builds/chromium/%s/chromium-linux.zip', 'ubuntu22.04': 'builds/chromium/%s/chromium-linux.zip',
@ -101,8 +100,6 @@ const DOWNLOAD_PATHS = {
}, },
'chromium-tip-of-tree': { 'chromium-tip-of-tree': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip',
'generic-linux-arm64': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux-arm64.zip',
'ubuntu18.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip', 'ubuntu18.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip',
'ubuntu20.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip', 'ubuntu20.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip',
'ubuntu22.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip', 'ubuntu22.04': 'builds/chromium-tip-of-tree/%s/chromium-tip-of-tree-linux.zip',
@ -126,8 +123,6 @@ const DOWNLOAD_PATHS = {
}, },
'chromium-with-symbols': { 'chromium-with-symbols': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/chromium/%s/chromium-with-symbols-linux.zip',
'generic-linux-arm64': 'builds/chromium/%s/chromium-with-symbols-linux-arm64.zip',
'ubuntu18.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip', 'ubuntu18.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip',
'ubuntu20.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip', 'ubuntu20.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip',
'ubuntu22.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip', 'ubuntu22.04': 'builds/chromium/%s/chromium-with-symbols-linux.zip',
@ -151,8 +146,6 @@ const DOWNLOAD_PATHS = {
}, },
'firefox': { 'firefox': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/firefox/%s/firefox-ubuntu-20.04.zip',
'generic-linux-arm64': 'builds/firefox/%s/firefox-ubuntu-20.04-arm64.zip',
'ubuntu18.04': 'builds/firefox/%s/firefox-ubuntu-18.04.zip', 'ubuntu18.04': 'builds/firefox/%s/firefox-ubuntu-18.04.zip',
'ubuntu20.04': 'builds/firefox/%s/firefox-ubuntu-20.04.zip', 'ubuntu20.04': 'builds/firefox/%s/firefox-ubuntu-20.04.zip',
'ubuntu22.04': 'builds/firefox/%s/firefox-ubuntu-22.04.zip', 'ubuntu22.04': 'builds/firefox/%s/firefox-ubuntu-22.04.zip',
@ -176,8 +169,6 @@ const DOWNLOAD_PATHS = {
}, },
'firefox-beta': { 'firefox-beta': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip',
'generic-linux-arm64': undefined,
'ubuntu18.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-18.04.zip', 'ubuntu18.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-18.04.zip',
'ubuntu20.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip', 'ubuntu20.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-20.04.zip',
'ubuntu22.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip', 'ubuntu22.04': 'builds/firefox-beta/%s/firefox-beta-ubuntu-22.04.zip',
@ -201,8 +192,6 @@ const DOWNLOAD_PATHS = {
}, },
'firefox-asan': { 'firefox-asan': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/firefox/%s/firefox-asan-ubuntu-20.04.zip',
'generic-linux-arm64': undefined,
'ubuntu18.04': undefined, 'ubuntu18.04': undefined,
'ubuntu20.04': undefined, 'ubuntu20.04': undefined,
'ubuntu22.04': 'builds/firefox/%s/firefox-asan-ubuntu-22.04.zip', 'ubuntu22.04': 'builds/firefox/%s/firefox-asan-ubuntu-22.04.zip',
@ -211,6 +200,8 @@ const DOWNLOAD_PATHS = {
'ubuntu22.04-arm64': undefined, 'ubuntu22.04-arm64': undefined,
'debian11': undefined, 'debian11': undefined,
'debian11-arm64': undefined, 'debian11-arm64': undefined,
'debian12': undefined,
'debian12-arm64': undefined,
'mac10.13': 'builds/firefox/%s/firefox-asan-mac-13.zip', 'mac10.13': 'builds/firefox/%s/firefox-asan-mac-13.zip',
'mac10.14': 'builds/firefox/%s/firefox-asan-mac-13.zip', 'mac10.14': 'builds/firefox/%s/firefox-asan-mac-13.zip',
'mac10.15': 'builds/firefox/%s/firefox-asan-mac-13.zip', 'mac10.15': 'builds/firefox/%s/firefox-asan-mac-13.zip',
@ -224,8 +215,6 @@ const DOWNLOAD_PATHS = {
}, },
'webkit': { 'webkit': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/webkit/%s/webkit-ubuntu-20.04.zip',
'generic-linux-arm64': 'builds/webkit/%s/webkit-ubuntu-20.04-arm64.zip',
'ubuntu18.04': 'builds/deprecated-webkit-ubuntu-18.04/%s/deprecated-webkit-ubuntu-18.04.zip', 'ubuntu18.04': 'builds/deprecated-webkit-ubuntu-18.04/%s/deprecated-webkit-ubuntu-18.04.zip',
'ubuntu20.04': 'builds/webkit/%s/webkit-ubuntu-20.04.zip', 'ubuntu20.04': 'builds/webkit/%s/webkit-ubuntu-20.04.zip',
'ubuntu22.04': 'builds/webkit/%s/webkit-ubuntu-22.04.zip', 'ubuntu22.04': 'builds/webkit/%s/webkit-ubuntu-22.04.zip',
@ -249,8 +238,6 @@ const DOWNLOAD_PATHS = {
}, },
'ffmpeg': { 'ffmpeg': {
'<unknown>': undefined, '<unknown>': undefined,
'generic-linux': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'generic-linux-arm64': 'builds/ffmpeg/%s/ffmpeg-linux-arm64.zip',
'ubuntu18.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip', 'ubuntu18.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'ubuntu20.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip', 'ubuntu20.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
'ubuntu22.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip', 'ubuntu22.04': 'builds/ffmpeg/%s/ffmpeg-linux.zip',
@ -274,6 +261,26 @@ const DOWNLOAD_PATHS = {
}, },
'android': { 'android': {
'<unknown>': 'builds/android/%s/android.zip', '<unknown>': 'builds/android/%s/android.zip',
'ubuntu18.04': 'builds/android/%s/android.zip',
'ubuntu20.04': 'builds/android/%s/android.zip',
'ubuntu22.04': 'builds/android/%s/android.zip',
'ubuntu18.04-arm64': 'builds/android/%s/android.zip',
'ubuntu20.04-arm64': 'builds/android/%s/android.zip',
'ubuntu22.04-arm64': 'builds/android/%s/android.zip',
'debian11': 'builds/android/%s/android.zip',
'debian11-arm64': 'builds/android/%s/android.zip',
'debian12': 'builds/android/%s/android.zip',
'debian12-arm64': 'builds/android/%s/android.zip',
'mac10.13': 'builds/android/%s/android.zip',
'mac10.14': 'builds/android/%s/android.zip',
'mac10.15': 'builds/android/%s/android.zip',
'mac11': 'builds/android/%s/android.zip',
'mac11-arm64': 'builds/android/%s/android.zip',
'mac12': 'builds/android/%s/android.zip',
'mac12-arm64': 'builds/android/%s/android.zip',
'mac13': 'builds/android/%s/android.zip',
'mac13-arm64': 'builds/android/%s/android.zip',
'win64': 'builds/android/%s/android.zip',
}, },
}; };
@ -878,8 +885,8 @@ export class Registry {
const downloadURLs = this._downloadURLs(descriptor); const downloadURLs = this._downloadURLs(descriptor);
if (!downloadURLs.length) if (!downloadURLs.length)
throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}`); throw new Error(`ERROR: Playwright does not support ${descriptor.name} on ${hostPlatform}`);
if (hostPlatform === 'generic-linux' || hostPlatform === 'generic-linux-arm64') if (!isOfficiallySupportedPlatform)
logPolitely('BEWARE: your OS is not officially supported by Playwright; downloading fallback build.'); logPolitely(`BEWARE: your OS is not officially supported by Playwright; downloading fallback build for ${hostPlatform}.`);
const displayName = descriptor.name.split('-').map(word => { const displayName = descriptor.name.split('-').map(word => {
return word === 'ffmpeg' ? 'FFMPEG' : word.charAt(0).toUpperCase() + word.slice(1); return word === 'ffmpeg' ? 'FFMPEG' : word.charAt(0).toUpperCase() + word.slice(1);

View File

@ -23,15 +23,15 @@ export type HostPlatform = 'win64' |
'mac10.15' | 'mac10.15' |
'mac11' | 'mac11-arm64' | 'mac11' | 'mac11-arm64' |
'mac12' | 'mac12-arm64' | 'mac12' | 'mac12-arm64' |
'mac13' | 'mac13-arm64' |
'ubuntu18.04' | 'ubuntu18.04-arm64' | 'ubuntu18.04' | 'ubuntu18.04-arm64' |
'ubuntu20.04' | 'ubuntu20.04-arm64' | 'ubuntu20.04' | 'ubuntu20.04-arm64' |
'ubuntu22.04' | 'ubuntu22.04-arm64' | 'ubuntu22.04' | 'ubuntu22.04-arm64' |
'debian11' | 'debian11-arm64' | 'debian11' | 'debian11-arm64' |
'debian12' | 'debian12-arm64' | 'debian12' | 'debian12-arm64' |
'generic-linux' | 'generic-linux-arm64' |
'<unknown>'; '<unknown>';
export const hostPlatform = ((): HostPlatform => { function calculatePlatform(): { hostPlatform: HostPlatform, isOfficiallySupportedPlatform: boolean } {
const platform = os.platform(); const platform = os.platform();
if (platform === 'darwin') { if (platform === 'darwin') {
const ver = os.release().split('.').map((a: string) => parseInt(a, 10)); const ver = os.release().split('.').map((a: string) => parseInt(a, 10));
@ -52,7 +52,7 @@ export const hostPlatform = ((): HostPlatform => {
if (os.cpus().some(cpu => cpu.model.includes('Apple'))) if (os.cpus().some(cpu => cpu.model.includes('Apple')))
macVersion += '-arm64'; macVersion += '-arm64';
} }
return macVersion as HostPlatform; return { hostPlatform: macVersion as HostPlatform, isOfficiallySupportedPlatform: true };
} }
if (platform === 'linux') { if (platform === 'linux') {
const archSuffix = os.arch() === 'arm64' ? '-arm64' : ''; const archSuffix = os.arch() === 'arm64' ? '-arm64' : '';
@ -62,23 +62,26 @@ export const hostPlatform = ((): HostPlatform => {
// KDE Neon is ubuntu-based and has the same versions. // KDE Neon is ubuntu-based and has the same versions.
// TUXEDO OS is ubuntu-based and has the same versions. // TUXEDO OS is ubuntu-based and has the same versions.
if (distroInfo?.id === 'ubuntu' || distroInfo?.id === 'pop' || distroInfo?.id === 'neon' || distroInfo?.id === 'tuxedo') { if (distroInfo?.id === 'ubuntu' || distroInfo?.id === 'pop' || distroInfo?.id === 'neon' || distroInfo?.id === 'tuxedo') {
const isOfficiallySupportedPlatform = distroInfo?.id === 'ubuntu';
if (parseInt(distroInfo.version, 10) <= 19) if (parseInt(distroInfo.version, 10) <= 19)
return ('ubuntu18.04' + archSuffix) as HostPlatform; return { hostPlatform: ('ubuntu18.04' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform };
if (parseInt(distroInfo.version, 10) <= 21) if (parseInt(distroInfo.version, 10) <= 21)
return ('ubuntu20.04' + archSuffix) as HostPlatform; return { hostPlatform: ('ubuntu20.04' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform };
return ('ubuntu22.04' + archSuffix) as HostPlatform; return { hostPlatform: ('ubuntu22.04' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform };
} }
if (distroInfo?.id === 'debian' && distroInfo?.version === '11') if (distroInfo?.id === 'debian' && distroInfo?.version === '11')
return ('debian11' + archSuffix) as HostPlatform; return { hostPlatform: ('debian11' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform: true };
if (distroInfo?.id === 'debian' && distroInfo?.version === '12') if (distroInfo?.id === 'debian' && distroInfo?.version === '12')
return ('debian12' + archSuffix) as HostPlatform; return { hostPlatform: ('debian12' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform: true };
// use most recent supported release for 'debian testing' and 'unstable'. // use most recent supported release for 'debian testing' and 'unstable'.
// they never include a numeric version entry in /etc/os-release. // they never include a numeric version entry in /etc/os-release.
if (distroInfo?.id === 'debian' && distroInfo?.version === '') if (distroInfo?.id === 'debian' && distroInfo?.version === '')
return ('debian12' + archSuffix) as HostPlatform; return { hostPlatform: ('debian12' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform: true };
return ('generic-linux' + archSuffix) as HostPlatform; return { hostPlatform: ('ubuntu20.04' + archSuffix) as HostPlatform, isOfficiallySupportedPlatform: false };
} }
if (platform === 'win32') if (platform === 'win32')
return 'win64'; return { hostPlatform: 'win64', isOfficiallySupportedPlatform: true };
return '<unknown>'; return { hostPlatform: '<unknown>', isOfficiallySupportedPlatform: false };
})(); }
export const { hostPlatform, isOfficiallySupportedPlatform } = calculatePlatform();