From 8de7c90caa246206af22957adb1715cc22aac9cd Mon Sep 17 00:00:00 2001 From: Miki Date: Thu, 8 Dec 2022 10:09:16 -0800 Subject: [PATCH] Automates chromedriver version selection for tests (#2990) Signed-off-by: Miki (cherry picked from commit a26fb43cc3e4072a45e32c40ba59e37ae65cb83b) --- .github/workflows/build_and_test_workflow.yml | 6 +- .gitignore | 1 + CHANGELOG.md | 1 + scripts/upgrade_chromedriver.js | 122 ++++++++++++++++++ 4 files changed, 126 insertions(+), 4 deletions(-) create mode 100644 scripts/upgrade_chromedriver.js diff --git a/.github/workflows/build_and_test_workflow.yml b/.github/workflows/build_and_test_workflow.yml index 04611cb00a99..87319c16918d 100644 --- a/.github/workflows/build_and_test_workflow.yml +++ b/.github/workflows/build_and_test_workflow.yml @@ -152,9 +152,8 @@ jobs: npm uninstall -g yarn npm i -g yarn@1.22.10 - # image has the latest chrome v99 - name: Setup chromedriver - run: yarn add --dev chromedriver@99.0.0 + run: node scripts/upgrade_chromedriver.js - name: Run bootstrap run: yarn osd bootstrap @@ -204,9 +203,8 @@ jobs: npm uninstall -g yarn npm i -g yarn@1.22.10 - # image has the latest chrome v99 - name: Setup chromedriver - run: yarn add --dev chromedriver@106.0.1 + run: node scripts/upgrade_chromedriver.js - name: Run bootstrap run: yarn osd bootstrap diff --git a/.gitignore b/.gitignore index 01c2aaeaf9ef..3f1759e6665a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .ackrc /.opensearch /.chromium +/package.json.bak .DS_Store .node_binaries .native_modules diff --git a/CHANGELOG.md b/CHANGELOG.md index e37ddc712aed..3b4b602696d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Add CHANGELOG.md and related workflows ([#2414](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2414)) - Update backport custom branch name to utilize head template ([#2766](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2766)) +- Add automatic selection of the appropriate version of chrome driver to run functional tests ([#2990](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/2990)) ### 📝 Documentation diff --git a/scripts/upgrade_chromedriver.js b/scripts/upgrade_chromedriver.js new file mode 100644 index 000000000000..bb5200c30eec --- /dev/null +++ b/scripts/upgrade_chromedriver.js @@ -0,0 +1,122 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Upgrades the chromedriver dev-dependency to the one supported by the version of Google Chrome + * installed on the machine. + * + * Usage: node scripts/upgrade_chromedriver.js [--install] + */ + +/* eslint no-restricted-syntax: 0 */ +const { execSync, spawnSync } = require('child_process'); +const { createReadStream, createWriteStream, unlinkSync, renameSync, existsSync } = require('fs'); +const { createInterface } = require('readline'); + +if (!process.argv.includes(__filename)) { + console.error('Usage: node scripts/upgrade_chromedriver.js [--install]'); + process.exit(1); +} + +const versionCheckCommands = []; + +switch (process.platform) { + case 'win32': + versionCheckCommands.push( + 'powershell "(Get-Item \\"$Env:Programfiles/Google/Chrome/Application/chrome.exe\\").VersionInfo.FileVersion"' + ); + break; + + case 'darwin': + versionCheckCommands.push( + '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome --version' + ); + break; + + default: + versionCheckCommands.push( + ...[ + '/usr/bin', + '/usr/local/bin', + '/usr/sbin', + '/usr/local/sbin', + '/opt/bin', + '/usr/bin/X11', + '/usr/X11R6/bin', + ].flatMap((loc) => + [ + 'google-chrome --version', + 'google-chrome-stable --version', + 'chromium --version', + 'chromium-browser --version', + ].map((cmd) => `${loc}/${cmd}`) + ) + ); +} + +let versionCheckOutput; +versionCheckCommands.some((cmd) => { + try { + console.log(cmd); + versionCheckOutput = execSync(cmd, { encoding: 'utf8' })?.trim?.(); + return true; + } catch (e) { + console.log('Failed to get version using', cmd); + } +}); + +// Versions 90+ +const majorVersion = versionCheckOutput?.match?.(/(?:^|\s)(9\d|\d{3})\./)?.[1]; + +if (majorVersion) { + if (process.argv.includes('--install')) { + console.log(`Installing chromedriver@^${majorVersion}`); + + spawnSync(`yarn add --dev chromedriver@^${majorVersion}`, { + stdio: 'inherit', + cwd: process.cwd(), + shell: true, + }); + } else { + console.log(`Upgrading to chromedriver@^${majorVersion}`); + + let upgraded = false; + const writeStream = createWriteStream('package.json.upgrading-chromedriver', { flags: 'w' }); + const rl = createInterface({ + input: createReadStream('package.json'), + crlfDelay: Infinity, + }); + rl.on('line', (line) => { + if (line.includes('"chromedriver": "')) { + line = line.replace( + /"chromedriver":\s*"[~^]?\d[\d.]*\d"/, + `"chromedriver": "^${majorVersion}"` + ); + upgraded = true; + } + writeStream.write(line + '\n', 'utf8'); + }); + rl.on('close', () => { + writeStream.end(); + if (upgraded) { + // Remove any previous backups + if (existsSync('package.json.bak')) unlinkSync('package.json.bak'); + + renameSync('package.json', 'package.json.bak'); + renameSync('package.json.upgrading-chromedriver', 'package.json'); + + console.log(`Backed up package.json and updated chromedriver to ${majorVersion}`); + } else { + unlinkSync('package.json.upgrading-chromedriver'); + console.error( + `Failed to update chromedriver to ${majorVersion}. Try adding the \`--install\` switch.` + ); + } + }); + } +} else { + console.debug(versionCheckOutput); + console.error(`Failed to extract the version of the installed Google Chrome.`); +}