mirror of
https://github.com/elastic/kibana.git
synced 2025-06-27 18:51:07 -04:00
[Reporting/Build Chromium] Add a developer script to find the Chromium commit (#94033)
* script that finds the chromium commit * use run from dev-utils * update docs and inch towards build pipeline * more docs updates * move the scripts the root * review feedback
This commit is contained in:
parent
08f3fe7ef5
commit
f9c4c01759
5 changed files with 164 additions and 11 deletions
10
scripts/chromium_version.js
Normal file
10
scripts/chromium_version.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require('../src/setup_node_env');
|
||||||
|
require('../src/dev/chromium_version');
|
138
src/dev/chromium_version.ts
Normal file
138
src/dev/chromium_version.ts
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { run, REPO_ROOT, ToolingLog } from '@kbn/dev-utils';
|
||||||
|
import chalk from 'chalk';
|
||||||
|
import cheerio from 'cheerio';
|
||||||
|
import fs from 'fs';
|
||||||
|
import fetch from 'node-fetch';
|
||||||
|
import path from 'path';
|
||||||
|
import { PackageJson } from 'type-fest';
|
||||||
|
|
||||||
|
type PuppeteerRelease = string;
|
||||||
|
type ChromiumRevision = string;
|
||||||
|
type ChromiumCommit = string;
|
||||||
|
|
||||||
|
// We forked the Puppeteer node module for Kibana,
|
||||||
|
// So we need to translate OUR version to the official Puppeteer Release
|
||||||
|
const forkCompatibilityMap: Record<string, PuppeteerRelease> = {
|
||||||
|
'5.4.1-patch.1': '5.4.1',
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getPuppeteerRelease(log: ToolingLog): Promise<PuppeteerRelease> {
|
||||||
|
// open node_modules/puppeteer/package.json
|
||||||
|
const puppeteerPackageJson: PackageJson = JSON.parse(
|
||||||
|
fs.readFileSync(path.resolve(REPO_ROOT, 'node_modules', 'puppeteer', 'package.json'), 'utf8')
|
||||||
|
);
|
||||||
|
const { version } = puppeteerPackageJson;
|
||||||
|
if (version == null) {
|
||||||
|
throw new Error(
|
||||||
|
'Could not get the Puppeteer version! Check node_modules/puppteer/package.json'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
log.info(`Kibana is using Puppeteer ${version} (${forkCompatibilityMap[version]})`);
|
||||||
|
return forkCompatibilityMap[version];
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getChromiumRevision(
|
||||||
|
kibanaPuppeteerVersion: PuppeteerRelease,
|
||||||
|
log: ToolingLog
|
||||||
|
): Promise<ChromiumRevision> {
|
||||||
|
const url = `https://raw.githubusercontent.com/puppeteer/puppeteer/v${kibanaPuppeteerVersion}/src/revisions.ts`;
|
||||||
|
let body: string;
|
||||||
|
try {
|
||||||
|
log.info(`Fetching code from Puppeteer source: ${url}`);
|
||||||
|
const rawSource = await fetch(url);
|
||||||
|
body = await rawSource.text();
|
||||||
|
} catch (err) {
|
||||||
|
log.error(err);
|
||||||
|
throw new Error(`Could not fetch ${url}. Check the URL in a browser and try again.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let revision: ChromiumRevision | undefined;
|
||||||
|
const lines = body.split('\n');
|
||||||
|
let cursor = lines.length;
|
||||||
|
while (--cursor >= 0) {
|
||||||
|
// look for the line of code matching ` chromium: '0123456',`
|
||||||
|
const test = lines[cursor].match(/^\s+chromium: '(\S+)',$/);
|
||||||
|
if (test != null) {
|
||||||
|
log.debug(`Parsed revision from source text: \`${lines[cursor]}\``);
|
||||||
|
[, revision] = test;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (revision == null) {
|
||||||
|
throw new Error(
|
||||||
|
`Could not find a Chromium revision listed in Puppeteer source! Check ${url} in a browser`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info(`Found Chromium revision ${revision} from Puppeteer ${kibanaPuppeteerVersion}`);
|
||||||
|
return revision;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getChromiumCommit(
|
||||||
|
revision: ChromiumRevision,
|
||||||
|
log: ToolingLog
|
||||||
|
): Promise<ChromiumCommit> {
|
||||||
|
const url = `https://crrev.com/${revision}`;
|
||||||
|
log.info(`Fetching ${url}`);
|
||||||
|
const pageText = await fetch(url);
|
||||||
|
const $ = cheerio.load(await pageText.text());
|
||||||
|
|
||||||
|
// get the commit from the page title
|
||||||
|
let commit: ChromiumCommit | null = null;
|
||||||
|
const matches = $('title')
|
||||||
|
.text()
|
||||||
|
.match(/\S{40}/);
|
||||||
|
if (matches != null) {
|
||||||
|
log.debug(`Parsed commit hash from page title: \`${$('title').text()}\``);
|
||||||
|
[commit] = matches;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commit == null) {
|
||||||
|
throw new Error(`Could not find a Chromium commit! Check ${url} in a browser.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info(`Found Chromium commit ${commit} from revision ${revision}.`);
|
||||||
|
return commit;
|
||||||
|
}
|
||||||
|
|
||||||
|
run(
|
||||||
|
async ({
|
||||||
|
log,
|
||||||
|
flags: {
|
||||||
|
_: [puppeteerVersionArg],
|
||||||
|
},
|
||||||
|
}) => {
|
||||||
|
try {
|
||||||
|
let puppeteerVersion: PuppeteerRelease;
|
||||||
|
if (puppeteerVersionArg) {
|
||||||
|
puppeteerVersion = puppeteerVersionArg;
|
||||||
|
} else {
|
||||||
|
puppeteerVersion = await getPuppeteerRelease(log);
|
||||||
|
}
|
||||||
|
|
||||||
|
const chromiumRevision = await getChromiumRevision(puppeteerVersion, log);
|
||||||
|
await getChromiumCommit(chromiumRevision, log);
|
||||||
|
} catch (err) {
|
||||||
|
log.error(err);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: chalk`
|
||||||
|
Display the Chromium git commit that correlates to a given Puppeteer release.
|
||||||
|
|
||||||
|
- node x-pack/dev-tools/chromium_version 5.5.0 {dim # gets the Chromium commit for Puppeteer v5.5.0}
|
||||||
|
- node x-pack/dev-tools/chromium_version {dim # gets the Chromium commit for the Kibana dependency version of Puppeteer}
|
||||||
|
|
||||||
|
You can use https://omahaproxy.appspot.com/ to look up the Chromium release that first shipped with that commit.
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
);
|
1
x-pack/build_chromium/.chromium-commit
Normal file
1
x-pack/build_chromium/.chromium-commit
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ef768c94bcb42dca4c27048615d07efadbb1c1c2
|
|
@ -44,7 +44,7 @@ gsutil cp -r gs://my-bucket/build_chromium .
|
||||||
# Install the OS packages, configure the environment, download the chromium source (25GB)
|
# Install the OS packages, configure the environment, download the chromium source (25GB)
|
||||||
python ./build_chromium/init.sh [arch_name]
|
python ./build_chromium/init.sh [arch_name]
|
||||||
|
|
||||||
# Run the build script with the path to the chromium src directory, the git commit id
|
# Run the build script with the path to the chromium src directory, the git commit hash
|
||||||
python ./build_chromium/build.py <commit_id> x86
|
python ./build_chromium/build.py <commit_id> x86
|
||||||
|
|
||||||
# OR You can build for ARM
|
# OR You can build for ARM
|
||||||
|
@ -55,16 +55,14 @@ python ./build_chromium/build.py <commit_id> arm64
|
||||||
the Chromium repo to be cloned successfully. If checking out the Chromium fails
|
the Chromium repo to be cloned successfully. If checking out the Chromium fails
|
||||||
with "early EOF" errors, the instance could be low on memory or disk space.
|
with "early EOF" errors, the instance could be low on memory or disk space.
|
||||||
|
|
||||||
## Getting the Commit ID
|
## Getting the Commit Hash
|
||||||
The `build.py` script requires a commit ID of the Chromium repo. Getting `<commit_id>` can be tricky. The best technique seems to be:
|
If you need to bump the version of Puppeteer, you need to get a new git commit hash for Chromium that corresponds to the Puppeteer version.
|
||||||
1. Create a temporary working directory and intialize yarn
|
```
|
||||||
2. `yarn add puppeteer # install latest puppeter`
|
node x-pack/dev-tools/chromium_version.js [PuppeteerVersion]
|
||||||
3. Look through Puppeteer documentation and Changelogs to find information
|
```
|
||||||
about where the "chromium revision" is located in the Puppeteer code. The code
|
|
||||||
containing it might not be distributed in the node module.
|
When bumping the Puppeteer version, make sure you also update the `.chromium-commit` file with the commit hash
|
||||||
- Example: https://github.com/puppeteer/puppeteer/blob/b549256/src/revisions.ts
|
for the current Chromium build, so we'll be able to construct a build pipeline for each OS (coming soon!).
|
||||||
4. Use `https://crrev.com` and look up the revision and find the git commit info.
|
|
||||||
- Example: http://crrev.com/818858 leads to the git commit e62cb7e3fc7c40548cef66cdf19d270535d9350b
|
|
||||||
|
|
||||||
## Build args
|
## Build args
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,12 @@ export class HeadlessChromiumDriverFactory {
|
||||||
} as puppeteer.LaunchOptions);
|
} as puppeteer.LaunchOptions);
|
||||||
|
|
||||||
page = await browser.newPage();
|
page = await browser.newPage();
|
||||||
|
|
||||||
|
// Log version info for debugging / maintenance
|
||||||
|
const client = await page.target().createCDPSession();
|
||||||
|
const versionInfo = await client.send('Browser.getVersion');
|
||||||
|
logger.debug(`Browser version: ${JSON.stringify(versionInfo)}`);
|
||||||
|
|
||||||
await page.emulateTimezone(browserTimezone ?? null);
|
await page.emulateTimezone(browserTimezone ?? null);
|
||||||
|
|
||||||
// Set the default timeout for all navigation methods to the openUrl timeout (30 seconds)
|
// Set the default timeout for all navigation methods to the openUrl timeout (30 seconds)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue