From 042e65a698fb378bea89669022622989f7b7dee1 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 19 Jan 2025 21:47:20 +0330 Subject: [PATCH 01/16] init --- discord-webhook.ts | 3 ++- ecosystem-ci.ts | 15 ++++++++++++++- utils.ts | 12 ++++++++---- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index fee90010..3dc85f24 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -58,7 +58,8 @@ async function run() { const refType = env.REF_TYPE // vite repo is not cloned when release - const permRef = refType === 'release' ? undefined : await getPermanentRef() + const permRef = + refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) const targetText = createTargetText(refType, env.REF, permRef, env.REPO) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 98ae3cb1..42c79b94 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -23,9 +23,22 @@ cli .option('--commit ', 'vite commit sha to use') .option('--release ', 'vite release to use from npm registry') .action(async (suites, options: CommandOptions) => { + if ( + options.branch === 'main' && + options.repo === 'vitejs/vite' && + !options.commit + ) { + const res = await fetch( + `https://api.github.com/repos/vitejs/vite/branches/main`, + ) + const { + commit: { sha }, + } = (await res.json()) as { commit: { sha: string } } + options.commit = sha + } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - //eslint-disable-next-line n/no-unsupported-features/node-builtins + const { status } = await fetch(url) if (status === 200) { options.release = url diff --git a/utils.ts b/utils.ts index 75eef8de..2097700b 100644 --- a/utils.ts +++ b/utils.ts @@ -371,11 +371,15 @@ export async function setupViteRepo(options: Partial) { } } -export async function getPermanentRef() { - cd(vitePath) +export async function getPermanentRef(repo: string, ref: string) { try { - const ref = await $`git log -1 --pretty=format:%H` - return ref + const res = await fetch( + `https://api.github.com/repos/${repo}/branches/${ref}`, + ) + const { + commit: { sha }, + } = (await res.json()) as { commit: { sha: string } } + return sha } catch (e) { console.warn(`Failed to obtain perm ref. ${e}`) return undefined From 06852c398d90f9ab8bf437b56ad22755301d57f1 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 19 Jan 2025 21:55:30 +0330 Subject: [PATCH 02/16] dry --- ecosystem-ci.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 42c79b94..5c817303 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -10,6 +10,7 @@ import { bisectVite, parseViteMajor, parseMajorVersion, + getPermanentRef, } from './utils.ts' import type { CommandOptions, RunOptions } from './types.d.ts' @@ -28,17 +29,14 @@ cli options.repo === 'vitejs/vite' && !options.commit ) { - const res = await fetch( - `https://api.github.com/repos/vitejs/vite/branches/main`, - ) - const { - commit: { sha }, - } = (await res.json()) as { commit: { sha: string } } - options.commit = sha + const sha = await getPermanentRef(options.repo, options.branch) + if (sha) { + options.commit = sha + } } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - + const { status } = await fetch(url) if (status === 200) { options.release = url From 00a6c5e98db7dfd91d3b43fa888ac2d106eeb896 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 19 Jan 2025 21:56:13 +0330 Subject: [PATCH 03/16] get the comment back --- ecosystem-ci.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 5c817303..693be782 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -36,7 +36,7 @@ cli } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - + const { status } = await fetch(url) if (status === 200) { options.release = url From 505fe418edcf9b791564156d0913cef3c593d539 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 19 Jan 2025 21:59:41 +0330 Subject: [PATCH 04/16] update --- discord-webhook.ts | 7 +++---- ecosystem-ci.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index 3dc85f24..ecabe7a7 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -58,8 +58,7 @@ async function run() { const refType = env.REF_TYPE // vite repo is not cloned when release - const permRef = - refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) + const permRef = refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) const targetText = createTargetText(refType, env.REF, permRef, env.REPO) @@ -133,8 +132,8 @@ async function fetchJobs() { Accept: 'application/vnd.github.v3+json', ...(process.env.GITHUB_TOKEN ? { - Authorization: `token ${process.env.GITHUB_TOKEN}`, - } + Authorization: `token ${process.env.GITHUB_TOKEN}`, + } : undefined), }, }) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 693be782..919b8185 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -36,7 +36,7 @@ cli } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - + //eslint-disable-next-line n/no-unsupported-features/node-builtins const { status } = await fetch(url) if (status === 200) { options.release = url From 8e0cb063c99faf902607fd300855492c7964d8ff Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 19 Jan 2025 21:59:58 +0330 Subject: [PATCH 05/16] update --- ecosystem-ci.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 919b8185..436d4192 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -36,7 +36,6 @@ cli } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - //eslint-disable-next-line n/no-unsupported-features/node-builtins const { status } = await fetch(url) if (status === 200) { options.release = url From 627a5a94a67ae45f1843efe43b29cd3395675a4d Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sun, 26 Jan 2025 17:08:24 +0330 Subject: [PATCH 06/16] fix ci --- discord-webhook.ts | 7 ++++--- tests/_selftest.ts | 9 +++++++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index ecabe7a7..3dc85f24 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -58,7 +58,8 @@ async function run() { const refType = env.REF_TYPE // vite repo is not cloned when release - const permRef = refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) + const permRef = + refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) const targetText = createTargetText(refType, env.REF, permRef, env.REPO) @@ -132,8 +133,8 @@ async function fetchJobs() { Accept: 'application/vnd.github.v3+json', ...(process.env.GITHUB_TOKEN ? { - Authorization: `token ${process.env.GITHUB_TOKEN}`, - } + Authorization: `token ${process.env.GITHUB_TOKEN}`, + } : undefined), }, }) diff --git a/tests/_selftest.ts b/tests/_selftest.ts index 5accdda7..1ec56c11 100644 --- a/tests/_selftest.ts +++ b/tests/_selftest.ts @@ -16,8 +16,13 @@ export async function test(options: RunOptions) { `invalid checkout, expected package.json with "name":"vite-ecosystem-ci" in ${dir}`, ) } - pkg.scripts.selftestscript = - "[ -d ../../vite/packages/vite/dist ] || (echo 'vite build failed' && exit 1)" + if (options.release?.startsWith('https://pkg.pr.new/vite@')) { + pkg.scripts.selftestscript = + "[ -d ./node_modules/vite ] || (echo 'vite build failed' && exit 1)" + } else { + pkg.scripts.selftestscript = + "[ -d ../../vite/packages/vite/dist ] || (echo 'vite build failed' && exit 1)" + } await fs.promises.writeFile( pkgFile, JSON.stringify(pkg, null, 2), From a56f13c4eb33bcbe17bce20014bcf064baff9e61 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Wed, 29 Jan 2025 18:50:59 +0330 Subject: [PATCH 07/16] Update tests/_selftest.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 翠 / green --- tests/_selftest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/_selftest.ts b/tests/_selftest.ts index 1ec56c11..ce276e72 100644 --- a/tests/_selftest.ts +++ b/tests/_selftest.ts @@ -18,7 +18,7 @@ export async function test(options: RunOptions) { } if (options.release?.startsWith('https://pkg.pr.new/vite@')) { pkg.scripts.selftestscript = - "[ -d ./node_modules/vite ] || (echo 'vite build failed' && exit 1)" + "[ -d ./node_modules/vite/dist ] || (echo 'vite build failed' && exit 1)" } else { pkg.scripts.selftestscript = "[ -d ../../vite/packages/vite/dist ] || (echo 'vite build failed' && exit 1)" From f76ef8562cea9a3361ba52e6de1e3edda23b19e9 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Mon, 3 Feb 2025 10:52:14 +0330 Subject: [PATCH 08/16] Update tests/_selftest.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 翠 / green --- tests/_selftest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/_selftest.ts b/tests/_selftest.ts index ce276e72..cf80cab4 100644 --- a/tests/_selftest.ts +++ b/tests/_selftest.ts @@ -16,7 +16,7 @@ export async function test(options: RunOptions) { `invalid checkout, expected package.json with "name":"vite-ecosystem-ci" in ${dir}`, ) } - if (options.release?.startsWith('https://pkg.pr.new/vite@')) { + if (options.release) { pkg.scripts.selftestscript = "[ -d ./node_modules/vite/dist ] || (echo 'vite build failed' && exit 1)" } else { From 896ce8997942185687cd429c19e8f80fc848fefa Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Mon, 3 Feb 2025 11:34:36 +0330 Subject: [PATCH 09/16] no getPermanentRef for discord --- .github/workflows/ecosystem-ci-selected.yml | 1 + .github/workflows/ecosystem-ci.yml | 1 + discord-webhook.ts | 7 ++++--- ecosystem-ci.ts | 2 ++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ecosystem-ci-selected.yml b/.github/workflows/ecosystem-ci-selected.yml index 522a2798..e2aa6d60 100644 --- a/.github/workflows/ecosystem-ci-selected.yml +++ b/.github/workflows/ecosystem-ci-selected.yml @@ -101,6 +101,7 @@ jobs: REF_TYPE: ${{ inputs.refType }} REF: ${{ inputs.ref }} REPO: ${{ inputs.repo }} + COMMIT: ${{ steps.ecosystem-ci-run.outputs.commit }} SUITE: ${{ inputs.suite }} STATUS: ${{ job.status }} DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/.github/workflows/ecosystem-ci.yml b/.github/workflows/ecosystem-ci.yml index f8026ff6..ced40fb4 100644 --- a/.github/workflows/ecosystem-ci.yml +++ b/.github/workflows/ecosystem-ci.yml @@ -104,6 +104,7 @@ jobs: REF_TYPE: ${{ inputs.refType || github.event.client_payload.refType || 'branch' }} REF: ${{ inputs.ref || github.event.client_payload.ref || 'main' }} REPO: ${{ inputs.repo || github.event.client_payload.repo || 'vitejs/vite' }} + COMMIT: ${{ steps.ecosystem-ci-run.outputs.commit }} SUITE: ${{ matrix.suite }} STATUS: ${{ job.status }} DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} diff --git a/discord-webhook.ts b/discord-webhook.ts index 3dc85f24..224fb865 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -1,5 +1,5 @@ import fetch from 'node-fetch' -import { getPermanentRef, setupEnvironment } from './utils.ts' +import { setupEnvironment } from './utils.ts' type RefType = 'branch' | 'tag' | 'commit' | 'release' type Status = 'success' | 'failure' | 'cancelled' @@ -8,6 +8,7 @@ type Env = { REF_TYPE?: RefType REF?: string REPO?: string + COMMIT?: string SUITE?: string STATUS?: Status DISCORD_WEBHOOK_URL?: string @@ -50,6 +51,7 @@ async function run() { assertEnv('REF_TYPE', env.REF_TYPE) assertEnv('REF', env.REF) assertEnv('REPO', env.REPO) + assertEnv('COMMIT', env.COMMIT) assertEnv('SUITE', env.SUITE) assertEnv('STATUS', env.STATUS) assertEnv('DISCORD_WEBHOOK_URL', env.DISCORD_WEBHOOK_URL) @@ -58,8 +60,7 @@ async function run() { const refType = env.REF_TYPE // vite repo is not cloned when release - const permRef = - refType === 'release' ? undefined : await getPermanentRef(env.REPO, env.REF) + const permRef = refType === 'release' ? undefined : env.COMMIT const targetText = createTargetText(refType, env.REF, permRef, env.REPO) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 436d4192..f20c06be 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import process from 'process' import { cac } from 'cac' +import actionsCore from '@actions/core' import { setupEnvironment, @@ -32,6 +33,7 @@ cli const sha = await getPermanentRef(options.repo, options.branch) if (sha) { options.commit = sha + actionsCore.setOutput('commit', sha) } } if (options.commit) { From 04ec12136f3387e356b6fa245e633b94259716ac Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 22 Feb 2025 13:18:56 +0330 Subject: [PATCH 10/16] some updates --- utils.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/utils.ts b/utils.ts index 2097700b..75eef8de 100644 --- a/utils.ts +++ b/utils.ts @@ -371,15 +371,11 @@ export async function setupViteRepo(options: Partial) { } } -export async function getPermanentRef(repo: string, ref: string) { +export async function getPermanentRef() { + cd(vitePath) try { - const res = await fetch( - `https://api.github.com/repos/${repo}/branches/${ref}`, - ) - const { - commit: { sha }, - } = (await res.json()) as { commit: { sha: string } } - return sha + const ref = await $`git log -1 --pretty=format:%H` + return ref } catch (e) { console.warn(`Failed to obtain perm ref. ${e}`) return undefined From ade59453995b512a8a4542255c49d292ad232d48 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 22 Feb 2025 13:36:12 +0330 Subject: [PATCH 11/16] pass COMMIT to discord-webhook.ts --- discord-webhook.ts | 12 +++++++++--- ecosystem-ci.ts | 8 ++++++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index 224fb865..3bc7e90e 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -1,5 +1,5 @@ import fetch from 'node-fetch' -import { setupEnvironment } from './utils.ts' +import { setupEnvironment, getPermanentRef } from './utils.ts' type RefType = 'branch' | 'tag' | 'commit' | 'release' type Status = 'success' | 'failure' | 'cancelled' @@ -51,7 +51,6 @@ async function run() { assertEnv('REF_TYPE', env.REF_TYPE) assertEnv('REF', env.REF) assertEnv('REPO', env.REPO) - assertEnv('COMMIT', env.COMMIT) assertEnv('SUITE', env.SUITE) assertEnv('STATUS', env.STATUS) assertEnv('DISCORD_WEBHOOK_URL', env.DISCORD_WEBHOOK_URL) @@ -60,7 +59,14 @@ async function run() { const refType = env.REF_TYPE // vite repo is not cloned when release - const permRef = refType === 'release' ? undefined : env.COMMIT + + let permRef: string | undefined + + if (env.COMMIT) { + permRef = env.COMMIT + } else if (refType !== 'release') { + permRef = await getPermanentRef() + } const targetText = createTargetText(refType, env.REF, permRef, env.REPO) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index f20c06be..0a4e252c 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -11,7 +11,6 @@ import { bisectVite, parseViteMajor, parseMajorVersion, - getPermanentRef, } from './utils.ts' import type { CommandOptions, RunOptions } from './types.d.ts' @@ -30,7 +29,12 @@ cli options.repo === 'vitejs/vite' && !options.commit ) { - const sha = await getPermanentRef(options.repo, options.branch) + const res = await fetch( + `https://api.github.com/repos/${options.repo}/branches/${options.branch}`, + ) + const { + commit: { sha }, + } = (await res.json()) as { commit: { sha: string } } if (sha) { options.commit = sha actionsCore.setOutput('commit', sha) From faab52e6ac60fd45e589f7a27765d85be0f08de0 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 22 Feb 2025 13:38:28 +0330 Subject: [PATCH 12/16] update --- discord-webhook.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index 3bc7e90e..2463cefd 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -58,13 +58,12 @@ async function run() { await setupEnvironment() const refType = env.REF_TYPE - // vite repo is not cloned when release - let permRef: string | undefined if (env.COMMIT) { permRef = env.COMMIT } else if (refType !== 'release') { + // vite repo is not cloned when release permRef = await getPermanentRef() } From 257b0ee73eeeffddd568badbb90ccea5160b3a52 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 22 Feb 2025 13:39:21 +0330 Subject: [PATCH 13/16] update --- discord-webhook.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index 2463cefd..653f1aa6 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -62,8 +62,7 @@ async function run() { if (env.COMMIT) { permRef = env.COMMIT - } else if (refType !== 'release') { - // vite repo is not cloned when release + } else if (refType !== 'release') { // vite repo is not cloned when release permRef = await getPermanentRef() } From 185650771e279bbc0fe19488468b521a220dc057 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Sat, 22 Feb 2025 14:45:34 +0330 Subject: [PATCH 14/16] format --- discord-webhook.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/discord-webhook.ts b/discord-webhook.ts index 653f1aa6..2463cefd 100644 --- a/discord-webhook.ts +++ b/discord-webhook.ts @@ -62,7 +62,8 @@ async function run() { if (env.COMMIT) { permRef = env.COMMIT - } else if (refType !== 'release') { // vite repo is not cloned when release + } else if (refType !== 'release') { + // vite repo is not cloned when release permRef = await getPermanentRef() } From 603cee8d00f13e3a4d6b82d01599c37dbf49cb89 Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Mon, 3 Mar 2025 18:36:54 +0330 Subject: [PATCH 15/16] polling on main --- ecosystem-ci.ts | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index 0a4e252c..d5f0f120 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -24,6 +24,7 @@ cli .option('--commit ', 'vite commit sha to use') .option('--release ', 'vite release to use from npm registry') .action(async (suites, options: CommandOptions) => { + let poll = false if ( options.branch === 'main' && options.repo === 'vitejs/vite' && @@ -38,17 +39,30 @@ cli if (sha) { options.commit = sha actionsCore.setOutput('commit', sha) + poll = true } } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - const { status } = await fetch(url) - if (status === 200) { - options.release = url - delete options.commit - - console.log(`continuous release available on ${url}`) - } + const maxAttempts = 60 // 5 minutes + let attempts = 0 + do { + const { status } = await fetch(url) + if (status !== 200) { + options.release = url + delete options.commit + console.log(`continuous release available on ${url}`) + poll = false + } + if (poll) { + // wait 5 seconds before polling again + await sleep(5 * 1000) + } + attempts++ + console.log( + `Polling attempt ${attempts}/${maxAttempts} for continuous release at ${url}`, + ) + } while (poll && attempts < maxAttempts) } const { root, vitePath, workspace } = await setupEnvironment() const suitesToRun = getSuitesToRun(suites, root) @@ -194,3 +208,7 @@ function getSuitesToRun(suites: string[], root: string) { } return suitesToRun } + +async function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)) +} From 2d0e8ed990314114ffaef23c408322d15d5c289c Mon Sep 17 00:00:00 2001 From: Mohammad Bagher Abiyat Date: Tue, 4 Mar 2025 09:51:32 +0330 Subject: [PATCH 16/16] throw after 1 minute of polling --- ecosystem-ci.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ecosystem-ci.ts b/ecosystem-ci.ts index d5f0f120..75465604 100644 --- a/ecosystem-ci.ts +++ b/ecosystem-ci.ts @@ -44,11 +44,11 @@ cli } if (options.commit) { const url = `https://pkg.pr.new/vite@${options.commit}` - const maxAttempts = 60 // 5 minutes + const maxAttempts = 12 // 1 minute let attempts = 0 do { const { status } = await fetch(url) - if (status !== 200) { + if (status === 200) { options.release = url delete options.commit console.log(`continuous release available on ${url}`) @@ -63,6 +63,11 @@ cli `Polling attempt ${attempts}/${maxAttempts} for continuous release at ${url}`, ) } while (poll && attempts < maxAttempts) + + if (poll && !options.release) { + console.error(`no continuous release found for ${options.commit}`) + process.exit(1) + } } const { root, vitePath, workspace } = await setupEnvironment() const suitesToRun = getSuitesToRun(suites, root)