From e48a490c3c1801bb1fbbb2d2f1b5d3a38136dfa2 Mon Sep 17 00:00:00 2001 From: Rimon Shenouda Date: Tue, 24 Mar 2026 16:11:20 +0100 Subject: [PATCH 1/4] Fix chromedriver download with fallback to nearest known-good build Fix chromedriver download fallback when exact version is unavailable --- index.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 9b8caf3..1b3ada7 100644 --- a/index.js +++ b/index.js @@ -32,13 +32,57 @@ async function run() { if (!chromeVersionMatch) { throw new Error('Could not extract Chrome version from: ' + chromeVersionOutput) } + const chromeVersion = chromeVersionMatch[0] + const versionPrefix = chromeVersion.split('.').slice(0, 3).join('.') // ✅ FIXED console.log('Chrome version:', chromeVersion) + console.log('Version prefix:', versionPrefix) - const chromedriverUrl = `https://storage.googleapis.com/chrome-for-testing-public/${chromeVersion}/linux64/chromedriver-linux64.zip` + let chromedriverUrl = `https://storage.googleapis.com/chrome-for-testing-public/${chromeVersion}/linux64/chromedriver-linux64.zip` console.log('Downloading chromedriver from:', chromedriverUrl) - cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) + try { + // Try exact version first + cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) + } catch (_exactVersionError) { + console.log(`Exact version ${chromeVersion} not found, falling back to matching build ${versionPrefix}...`) + + cp.execSync( + 'wget -q -O /tmp/chromedriver-versions.json "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"' + ) + + const versionsData = JSON.parse(fs.readFileSync('/tmp/chromedriver-versions.json', 'utf8')) + + + const matchingVersions = versionsData.versions.filter(v => + v.version.startsWith(versionPrefix) && + v.downloads.chromedriver && + v.downloads.chromedriver.some(d => d.platform === 'linux64') + ) + + if (matchingVersions.length === 0) { + throw new Error(`No chromedriver found for Chrome build ${versionPrefix}`) + } + + + matchingVersions.sort((a, b) => + a.version.localeCompare(b.version, undefined, { numeric: true }) + ) + + const fallbackVersion = matchingVersions.pop() + const fallbackDownload = fallbackVersion.downloads.chromedriver.find( + d => d.platform === 'linux64' + ) + + chromedriverUrl = fallbackDownload.url + + console.log( + `Falling back to chromedriver version ${fallbackVersion.version}, downloading from: ${chromedriverUrl}` + ) + + cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) + } + cp.execSync('unzip -q chromedriver.zip') cp.execSync('sudo mv chromedriver-linux64/chromedriver /usr/local/bin/') cp.execSync('sudo chmod +x /usr/local/bin/chromedriver') From ef5f4e7ac6e8d0d5e1ddfce59822dd599d4e42f0 Mon Sep 17 00:00:00 2001 From: Rimon Shenouda Date: Tue, 24 Mar 2026 16:18:09 +0100 Subject: [PATCH 2/4] Keep it minimal --- index.js | 49 ++++++++----------------------------------------- 1 file changed, 8 insertions(+), 41 deletions(-) diff --git a/index.js b/index.js index 1b3ada7..9f594a5 100644 --- a/index.js +++ b/index.js @@ -34,53 +34,20 @@ async function run() { } const chromeVersion = chromeVersionMatch[0] - const versionPrefix = chromeVersion.split('.').slice(0, 3).join('.') // ✅ FIXED console.log('Chrome version:', chromeVersion) - console.log('Version prefix:', versionPrefix) - let chromedriverUrl = `https://storage.googleapis.com/chrome-for-testing-public/${chromeVersion}/linux64/chromedriver-linux64.zip` + const chromedriverUrl = `https://storage.googleapis.com/chrome-for-testing-public/${chromeVersion}/linux64/chromedriver-linux64.zip` console.log('Downloading chromedriver from:', chromedriverUrl) try { - // Try exact version first - cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) - } catch (_exactVersionError) { - console.log(`Exact version ${chromeVersion} not found, falling back to matching build ${versionPrefix}...`) - - cp.execSync( - 'wget -q -O /tmp/chromedriver-versions.json "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"' - ) - - const versionsData = JSON.parse(fs.readFileSync('/tmp/chromedriver-versions.json', 'utf8')) - - - const matchingVersions = versionsData.versions.filter(v => - v.version.startsWith(versionPrefix) && - v.downloads.chromedriver && - v.downloads.chromedriver.some(d => d.platform === 'linux64') - ) - - if (matchingVersions.length === 0) { - throw new Error(`No chromedriver found for Chrome build ${versionPrefix}`) - } - - - matchingVersions.sort((a, b) => - a.version.localeCompare(b.version, undefined, { numeric: true }) - ) - - const fallbackVersion = matchingVersions.pop() - const fallbackDownload = fallbackVersion.downloads.chromedriver.find( - d => d.platform === 'linux64' - ) - - chromedriverUrl = fallbackDownload.url - - console.log( - `Falling back to chromedriver version ${fallbackVersion.version}, downloading from: ${chromedriverUrl}` - ) - cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) + } catch (_e) { + const versionPrefix = chromeVersion.split('.').slice(0, 3).join('.') + cp.execSync('wget -q -O /tmp/chromedriver-versions.json "https://googlechromelabs.github.io/chrome-for-testing/latest-patch-versions-per-build-with-downloads.json"') + const builds = JSON.parse(fs.readFileSync('/tmp/chromedriver-versions.json', 'utf8')).builds + const fallbackUrl = builds[versionPrefix].downloads.chromedriver.find(d => d.platform === 'linux64').url + console.log('Falling back to chromedriver:', fallbackUrl) + cp.execSync(`wget -q -O chromedriver.zip "${fallbackUrl}"`) } cp.execSync('unzip -q chromedriver.zip') From da355cb0adff48ab79a76508916fb1ea69384dda Mon Sep 17 00:00:00 2001 From: Rimon Shenouda Date: Tue, 24 Mar 2026 16:22:15 +0100 Subject: [PATCH 3/4] update-ruby-version --- .github/workflows/test_and_build.yml | 2 +- integration_test/test/env_var_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_and_build.yml b/.github/workflows/test_and_build.yml index e2446fc..03417f7 100644 --- a/.github/workflows/test_and_build.yml +++ b/.github/workflows/test_and_build.yml @@ -30,7 +30,7 @@ jobs: set_env_var: true - uses: ruby/setup-ruby@v1 with: - ruby-version: 2.7 + ruby-version: 3.2 - run: git clone git@github.com:QuickPay/klarna-payments-backend.git - run: gem install bundler -v 2.4.22 - name: Tests diff --git a/integration_test/test/env_var_spec.rb b/integration_test/test/env_var_spec.rb index 251391e..fe5c2ce 100644 --- a/integration_test/test/env_var_spec.rb +++ b/integration_test/test/env_var_spec.rb @@ -7,6 +7,6 @@ end it "has correct values" do - _(YAML.load(ENV["SETTINGS"])["default"][:service_discovery][:reader]).must_equal "tcp://33.33.33.80:22122" + _(YAML.load(ENV["SETTINGS"], aliases: true)["default"][:service_discovery][:reader]).must_equal "tcp://33.33.33.80:22122" end end \ No newline at end of file From 4a277c01bc569c4a389bdcbb503c6d3ce6f89923 Mon Sep 17 00:00:00 2001 From: Rimon Shenouda Date: Wed, 25 Mar 2026 09:38:14 +0100 Subject: [PATCH 4/4] no need to fallback --- index.js | 53 +++++++++++++++-------------------------------------- 1 file changed, 15 insertions(+), 38 deletions(-) diff --git a/index.js b/index.js index 9f594a5..f21e34d 100644 --- a/index.js +++ b/index.js @@ -20,47 +20,24 @@ async function run() { const envVar = getBool("set_env_var") if (chrome) { - // Install Chrome - cp.execSync('wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb') - cp.execSync('sudo apt-get install -y ./google-chrome-stable_current_amd64.deb') + cp.execSync('wget -q -O /tmp/chrome-versions.json "https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json"') + const stableChannel = JSON.parse(fs.readFileSync('/tmp/chrome-versions.json', 'utf8')).channels.Stable + const downloads = stableChannel.downloads - try { - const chromeVersionOutput = cp.execSync('google-chrome --version').toString() - console.log('Chrome version output:', chromeVersionOutput) + const chromeUrl = downloads.chrome.find(d => d.platform === 'linux64').url + const chromedriverUrl = downloads.chromedriver.find(d => d.platform === 'linux64').url - const chromeVersionMatch = chromeVersionOutput.match(/\d+\.\d+\.\d+\.\d+/) - if (!chromeVersionMatch) { - throw new Error('Could not extract Chrome version from: ' + chromeVersionOutput) - } - - const chromeVersion = chromeVersionMatch[0] - console.log('Chrome version:', chromeVersion) - - const chromedriverUrl = `https://storage.googleapis.com/chrome-for-testing-public/${chromeVersion}/linux64/chromedriver-linux64.zip` - console.log('Downloading chromedriver from:', chromedriverUrl) - - try { - cp.execSync(`wget -q -O chromedriver.zip "${chromedriverUrl}"`) - } catch (_e) { - const versionPrefix = chromeVersion.split('.').slice(0, 3).join('.') - cp.execSync('wget -q -O /tmp/chromedriver-versions.json "https://googlechromelabs.github.io/chrome-for-testing/latest-patch-versions-per-build-with-downloads.json"') - const builds = JSON.parse(fs.readFileSync('/tmp/chromedriver-versions.json', 'utf8')).builds - const fallbackUrl = builds[versionPrefix].downloads.chromedriver.find(d => d.platform === 'linux64').url - console.log('Falling back to chromedriver:', fallbackUrl) - cp.execSync(`wget -q -O chromedriver.zip "${fallbackUrl}"`) - } + console.log(`Downloading Chrome version: ${stableChannel.version}`) + cp.execSync(`wget -q -O /tmp/chrome-linux64.zip "${chromeUrl}"`) + cp.execSync('unzip -q /tmp/chrome-linux64.zip -d /tmp/chrome-linux64') + cp.execSync('sudo mv /tmp/chrome-linux64/chrome-linux64/chrome /usr/local/bin/google-chrome') + cp.execSync('sudo chmod +x /usr/local/bin/google-chrome') - cp.execSync('unzip -q chromedriver.zip') - cp.execSync('sudo mv chromedriver-linux64/chromedriver /usr/local/bin/') - cp.execSync('sudo chmod +x /usr/local/bin/chromedriver') - - cp.execSync('rm -rf chromedriver.zip chromedriver-linux64 google-chrome-stable_current_amd64.deb') - - console.log('Chromedriver installed successfully') - } catch (error) { - core.setFailed('Failed to install Chromedriver: ' + error.message) - return - } + console.log(`Downloading Chromedriver version: ${stableChannel.version}`) + cp.execSync(`wget -q -O /tmp/chromedriver-linux64.zip "${chromedriverUrl}"`) + cp.execSync('unzip -q /tmp/chromedriver-linux64.zip -d /tmp/chromedriver-linux64') + cp.execSync('sudo mv /tmp/chromedriver-linux64/chromedriver-linux64/chromedriver /usr/local/bin/chromedriver') + cp.execSync('sudo chmod +x /usr/local/bin/chromedriver') } if (chrome || prodAptDeps || postgres) { cp.execSync("DEBIAN_FRONTEND=noninteractive sudo apt-get update")