Add Node version validation and manifest fetch retry (#1580)
Some checks failed
Basic validation / Basic validation (push) Failing after 0s
Check dist / Check dist/ (push) Failing after 0s
CodeQL analysis / CodeQL analysis (push) Failing after 0s
e2e-cache / Test npm (Node 20, ubuntu-latest) (push) Successful in 10m19s
e2e-cache / Test npm (Node 22, ubuntu-latest) (push) Successful in 10m14s
e2e-cache / Test npm (Node 24, ubuntu-latest) (push) Successful in 10m20s
e2e-cache / Test pnpm (Node 20, ubuntu-latest) (push) Failing after 2m1s
e2e-cache / Test pnpm (Node 22, ubuntu-latest) (push) Failing after 2m1s
e2e-cache / Test pnpm (Node 24, ubuntu-latest) (push) Failing after 1m59s
e2e-cache / Test yarn 1 (Node 20, ubuntu-latest) (push) Failing after 13s
e2e-cache / Test yarn 1 (Node 22, ubuntu-latest) (push) Failing after 14s
e2e-cache / Test yarn 1 (Node 24, ubuntu-latest) (push) Failing after 9s
e2e-cache / Test yarn 3 (Node 20, ubuntu-latest) (push) Failing after 8s
e2e-cache / Test yarn 3 (Node 22, ubuntu-latest) (push) Failing after 9s
e2e-cache / Test yarn 3 (Node 24, ubuntu-latest) (push) Failing after 9s
e2e-cache / Test yarn subprojects (20) (push) Failing after 9s
e2e-cache / Test yarn subprojects (22) (push) Failing after 9s
e2e-cache / Test yarn subprojects (24) (push) Failing after 9s
e2e-cache / Test yarn subprojects all locally managed (20) (push) Failing after 9s
e2e-cache / Test yarn subprojects all locally managed (22) (push) Failing after 9s
e2e-cache / Test yarn subprojects all locally managed (24) (push) Failing after 8s
e2e-cache / Test yarn subprojects some locally managed (20) (push) Failing after 9s
e2e-cache / Test yarn subprojects some locally managed (22) (push) Failing after 8s
e2e-cache / Test yarn subprojects some locally managed (24) (push) Failing after 11s
e2e-cache / Test yarn subprojects managed by git (20) (push) Failing after 9s
e2e-cache / Test yarn subprojects managed by git (22) (push) Failing after 9s
e2e-cache / Test yarn subprojects managed by git (24) (push) Failing after 9s
e2e-cache / Test auto cache with top-level packageManager (20, ubuntu-latest) (push) Successful in 9m40s
e2e-cache / Test auto cache with top-level packageManager (22, ubuntu-latest) (push) Failing after 1m38s
e2e-cache / Test auto cache with top-level packageManager (24, ubuntu-latest) (push) Successful in 9m45s
e2e-cache / Test auto cache with devEngines.packageManager (20, ubuntu-latest) (push) Failing after 1m37s
e2e-cache / Test auto cache with devEngines.packageManager (22, ubuntu-latest) (push) Failing after 17m3s
e2e-cache / Test auto cache with devEngines.packageManager (24, ubuntu-latest) (push) Successful in 9m43s
Licensed / Licensed (push) Failing after 0s
proxy / test-proxy (push) Failing after 2s
proxy / test-bypass-proxy (push) Failing after 1m14s
versions / local-cache (20, ubuntu-latest) (push) Successful in 26s
versions / local-cache (22, ubuntu-latest) (push) Successful in 26s
versions / local-cache (24, ubuntu-latest) (push) Successful in 19s
versions / lts-syntax (lts/*, ubuntu-latest) (push) Failing after 18s
versions / lts-syntax (lts/-1, ubuntu-latest) (push) Failing after 18s
versions / lts-syntax (lts/dubnium, ubuntu-latest) (push) Failing after 18s
versions / lts-syntax (lts/erbium, ubuntu-latest) (push) Failing after 16m34s
versions / lts-syntax (lts/fermium, ubuntu-latest) (push) Failing after 26m44s
versions / v8-canary-syntax (20-v8-canary, ubuntu-latest) (push) Failing after 17m4s
versions / v8-canary-syntax (20.0.0-v8-canary, ubuntu-latest) (push) Successful in 1m49s
versions / v8-canary-syntax (20.0.0-v8-canary20221101e50e45c9f8, ubuntu-latest) (push) Successful in 50s
versions / nightly-syntax (20-nightly, ubuntu-latest) (push) Successful in 48s
versions / nightly-syntax (24.0.0-nightly, ubuntu-latest) (push) Failing after 34s
versions / nightly-syntax (25-nightly, ubuntu-latest) (push) Failing after 32s
versions / rc-syntax (20.0.0-rc.1, ubuntu-latest) (push) Failing after 32s
versions / rc-syntax (22.14.0-rc.1, ubuntu-latest) (push) Failing after 33s
versions / rc-syntax (24.0.0-rc.4, ubuntu-latest) (push) Failing after 34s
versions / manifest (20.10.0, ubuntu-latest) (push) Failing after 33s
versions / manifest (22.0.0, ubuntu-latest) (push) Failing after 32s
versions / manifest (24.9.0, ubuntu-latest) (push) Failing after 34s
versions / check-latest (20, ubuntu-latest) (push) Failing after 33s
versions / check-latest (22, ubuntu-latest) (push) Failing after 1m44s
versions / check-latest (24, ubuntu-latest) (push) Successful in 38s
versions / version-file (.nvmrc, ubuntu-latest) (push) Failing after 33s
versions / version-file (.tool-versions, ubuntu-latest) (push) Failing after 32s
versions / version-file (.tool-versions-node, ubuntu-latest) (push) Failing after 32s
versions / version-file (package.json, ubuntu-latest) (push) Failing after 32s
versions / version-file-dev-engines (ubuntu-latest) (push) Failing after 33s
versions / version-file-volta (ubuntu-latest) (push) Failing after 34s
versions / version-file-volta-extends (ubuntu-latest) (push) Failing after 32s
versions / node-dist (21, ubuntu-latest) (push) Failing after 32s
versions / node-dist (23, ubuntu-latest) (push) Successful in 30s
versions / old-versions (ubuntu-latest) (push) Successful in 13s
versions / node-latest-aliases (current, ubuntu-latest) (push) Successful in 23s
versions / node-latest-aliases (latest, ubuntu-latest) (push) Successful in 22s
versions / node-latest-aliases (node, ubuntu-latest) (push) Successful in 22s
e2e-cache / Test npm (Node 20, macos-latest) (push) Has been cancelled
e2e-cache / Test npm (Node 20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test npm (Node 20, windows-latest) (push) Has been cancelled
e2e-cache / Test npm (Node 22, macos-latest) (push) Has been cancelled
e2e-cache / Test npm (Node 22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test npm (Node 22, windows-latest) (push) Has been cancelled
e2e-cache / Test npm (Node 24, macos-latest) (push) Has been cancelled
e2e-cache / Test npm (Node 24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test npm (Node 24, windows-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 20, macos-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test pnpm (Node 20, windows-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 22, macos-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test pnpm (Node 22, windows-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 24, macos-latest) (push) Has been cancelled
e2e-cache / Test pnpm (Node 24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test pnpm (Node 24, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 20, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 20, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 22, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 22, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 24, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 1 (Node 24, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 20, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 20, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 22, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 22, windows-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 24, macos-latest) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test yarn 3 (Node 24, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (20, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (20, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (22, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (22, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (24, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with top-level packageManager (24, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (20, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (20, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (20, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (22, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (22, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (22, windows-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (24, macos-latest) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (24, macos-latest-large) (push) Has been cancelled
e2e-cache / Test auto cache with devEngines.packageManager (24, windows-latest) (push) Has been cancelled
versions / local-cache (20, macos-latest) (push) Has been cancelled
versions / local-cache (20, macos-latest-large) (push) Has been cancelled
versions / local-cache (20, windows-latest) (push) Has been cancelled
versions / local-cache (22, macos-latest) (push) Has been cancelled
versions / local-cache (22, macos-latest-large) (push) Has been cancelled
versions / local-cache (22, windows-latest) (push) Has been cancelled
versions / local-cache (24, macos-latest) (push) Has been cancelled
versions / local-cache (24, macos-latest-large) (push) Has been cancelled
versions / local-cache (24, windows-latest) (push) Has been cancelled
versions / lts-syntax (lts/*, macos-latest-large) (push) Has been cancelled
versions / lts-syntax (lts/*, windows-latest) (push) Has been cancelled
versions / lts-syntax (lts/-1, macos-latest-large) (push) Has been cancelled
versions / lts-syntax (lts/-1, windows-latest) (push) Has been cancelled
versions / lts-syntax (lts/dubnium, macos-latest-large) (push) Has been cancelled
versions / lts-syntax (lts/dubnium, windows-latest) (push) Has been cancelled
versions / lts-syntax (lts/erbium, macos-latest-large) (push) Has been cancelled
versions / lts-syntax (lts/erbium, windows-latest) (push) Has been cancelled
versions / lts-syntax (lts/fermium, macos-latest-large) (push) Has been cancelled
versions / lts-syntax (lts/fermium, windows-latest) (push) Has been cancelled
versions / v8-canary-syntax (20-v8-canary, macos-latest) (push) Has been cancelled
versions / v8-canary-syntax (20-v8-canary, macos-latest-large) (push) Has been cancelled
versions / v8-canary-syntax (20-v8-canary, windows-latest) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary, macos-latest) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary, macos-latest-large) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary, windows-latest) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary20221101e50e45c9f8, macos-latest) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary20221101e50e45c9f8, macos-latest-large) (push) Has been cancelled
versions / v8-canary-syntax (20.0.0-v8-canary20221101e50e45c9f8, windows-latest) (push) Has been cancelled
versions / nightly-syntax (20-nightly, macos-latest) (push) Has been cancelled
versions / nightly-syntax (20-nightly, macos-latest-large) (push) Has been cancelled
versions / nightly-syntax (20-nightly, windows-latest) (push) Has been cancelled
versions / nightly-syntax (24.0.0-nightly, macos-latest) (push) Has been cancelled
versions / nightly-syntax (24.0.0-nightly, macos-latest-large) (push) Has been cancelled
versions / nightly-syntax (24.0.0-nightly, windows-latest) (push) Has been cancelled
versions / nightly-syntax (25-nightly, macos-latest) (push) Has been cancelled
versions / nightly-syntax (25-nightly, macos-latest-large) (push) Has been cancelled
versions / nightly-syntax (25-nightly, windows-latest) (push) Has been cancelled
versions / rc-syntax (20.0.0-rc.1, macos-latest) (push) Has been cancelled
versions / rc-syntax (20.0.0-rc.1, macos-latest-large) (push) Has been cancelled
versions / rc-syntax (20.0.0-rc.1, windows-latest) (push) Has been cancelled
versions / rc-syntax (22.14.0-rc.1, macos-latest) (push) Has been cancelled
versions / rc-syntax (22.14.0-rc.1, macos-latest-large) (push) Has been cancelled
versions / rc-syntax (22.14.0-rc.1, windows-latest) (push) Has been cancelled
versions / rc-syntax (24.0.0-rc.4, macos-latest) (push) Has been cancelled
versions / rc-syntax (24.0.0-rc.4, macos-latest-large) (push) Has been cancelled
versions / rc-syntax (24.0.0-rc.4, windows-latest) (push) Has been cancelled
versions / manifest (20.10.0, macos-latest) (push) Has been cancelled
versions / manifest (20.10.0, macos-latest-large) (push) Has been cancelled
versions / manifest (20.10.0, windows-latest) (push) Has been cancelled
versions / manifest (22.0.0, macos-latest) (push) Has been cancelled
versions / manifest (22.0.0, macos-latest-large) (push) Has been cancelled
versions / manifest (22.0.0, windows-latest) (push) Has been cancelled
versions / manifest (24.9.0, macos-latest) (push) Has been cancelled
versions / manifest (24.9.0, macos-latest-large) (push) Has been cancelled
versions / manifest (24.9.0, windows-latest) (push) Has been cancelled
versions / check-latest (20, macos-latest) (push) Has been cancelled
versions / check-latest (20, macos-latest-large) (push) Has been cancelled
versions / check-latest (20, windows-latest) (push) Has been cancelled
versions / check-latest (22, macos-latest) (push) Has been cancelled
versions / check-latest (22, macos-latest-large) (push) Has been cancelled
versions / check-latest (22, windows-latest) (push) Has been cancelled
versions / check-latest (24, macos-latest) (push) Has been cancelled
versions / check-latest (24, macos-latest-large) (push) Has been cancelled
versions / check-latest (24, windows-latest) (push) Has been cancelled
versions / version-file (.nvmrc, macos-latest) (push) Has been cancelled
versions / version-file (.nvmrc, macos-latest-large) (push) Has been cancelled
versions / version-file (.nvmrc, windows-latest) (push) Has been cancelled
versions / version-file (.tool-versions, macos-latest) (push) Has been cancelled
versions / version-file (.tool-versions, macos-latest-large) (push) Has been cancelled
versions / version-file (.tool-versions, windows-latest) (push) Has been cancelled
versions / version-file (.tool-versions-node, macos-latest) (push) Has been cancelled
versions / version-file (.tool-versions-node, macos-latest-large) (push) Has been cancelled
versions / version-file (.tool-versions-node, windows-latest) (push) Has been cancelled
versions / version-file (package.json, macos-latest) (push) Has been cancelled
versions / version-file (package.json, macos-latest-large) (push) Has been cancelled
versions / version-file (package.json, windows-latest) (push) Has been cancelled
versions / version-file-dev-engines (macos-latest) (push) Has been cancelled
versions / version-file-dev-engines (windows-latest) (push) Has been cancelled
versions / version-file-volta (macos-latest) (push) Has been cancelled
versions / version-file-volta (macos-latest-large) (push) Has been cancelled
versions / version-file-volta (windows-latest) (push) Has been cancelled
versions / version-file-volta-extends (macos-latest) (push) Has been cancelled
versions / version-file-volta-extends (macos-latest-large) (push) Has been cancelled
versions / version-file-volta-extends (windows-latest) (push) Has been cancelled
versions / node-dist (21, macos-latest) (push) Has been cancelled
versions / node-dist (21, macos-latest-large) (push) Has been cancelled
versions / node-dist (21, windows-latest) (push) Has been cancelled
versions / node-dist (23, macos-latest) (push) Has been cancelled
versions / node-dist (23, macos-latest-large) (push) Has been cancelled
versions / node-dist (23, windows-latest) (push) Has been cancelled
versions / old-versions (macos-latest-large) (push) Has been cancelled
versions / old-versions (windows-latest) (push) Has been cancelled
versions / arch (push) Has been cancelled
versions / node-latest-aliases (current, macos-latest) (push) Has been cancelled
versions / node-latest-aliases (current, macos-latest-large) (push) Has been cancelled
versions / node-latest-aliases (current, windows-latest) (push) Has been cancelled
versions / node-latest-aliases (latest, macos-latest) (push) Has been cancelled
versions / node-latest-aliases (latest, macos-latest-large) (push) Has been cancelled
versions / node-latest-aliases (latest, windows-latest) (push) Has been cancelled
versions / node-latest-aliases (node, macos-latest) (push) Has been cancelled
versions / node-latest-aliases (node, macos-latest-large) (push) Has been cancelled
versions / node-latest-aliases (node, windows-latest) (push) Has been cancelled

* Add Node version validation and manifest fetch retry

* Add debug logs for expected and actual Node versions

* chore: rebuild dist

* refactor: enhance debug logging for Node installation failure

* update test cases

* Improve formatting of test cases

* revert package-lock.json
This commit is contained in:
v-jitenderpalsingh
2026-07-15 04:25:44 +05:30
committed by GitHub
parent 8207627860
commit 363be39a57
3 changed files with 225 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
import * as core from '@actions/core';
import * as tc from '@actions/tool-cache';
import path from 'path';
import * as exec from '@actions/exec';
import BaseDistribution from '../base-distribution.js';
import {NodeInputs, INodeVersion, INodeVersionInfo} from '../base-models.js';
@@ -62,7 +63,9 @@ export default class OfficialBuilds extends BaseDistribution {
if (toolPath) {
core.info(`Found in cache @ ${toolPath}`);
const installedDir = toolPath;
this.addToolPath(toolPath);
await this.verifyNodeVersion(installedDir);
return;
}
@@ -123,11 +126,13 @@ export default class OfficialBuilds extends BaseDistribution {
toolPath = await this.downloadDirectlyFromNode();
}
const installedDir = toolPath;
if (this.osPlat != 'win32') {
toolPath = path.join(toolPath, 'bin');
}
core.addPath(toolPath);
await this.verifyNodeVersion(installedDir);
}
protected addToolPath(toolPath: string) {
@@ -185,15 +190,41 @@ export default class OfficialBuilds extends BaseDistribution {
return `${url}/dist`;
}
private getManifest(): Promise<tc.IToolRelease[]> {
core.debug('Getting manifest from actions/node-versions@main');
return tc.getManifestFromRepo(
'actions',
'node-versions',
this.nodeInfo.mirror && this.nodeInfo.mirrorToken
? this.nodeInfo.mirrorToken
: this.nodeInfo.auth,
'main'
private async getManifest(): Promise<tc.IToolRelease[]> {
let lastError: Error | undefined;
const maxAttempts = 3;
core.debug(`Getting manifest from actions/node-versions@main`);
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
const manifest = await tc.getManifestFromRepo(
'actions',
'node-versions',
this.nodeInfo.mirror && this.nodeInfo.mirrorToken
? this.nodeInfo.mirrorToken
: this.nodeInfo.auth,
'main'
);
if (Array.isArray(manifest) && manifest.length > 0) {
return manifest;
}
lastError = new Error(
`The manifest fetched is empty, truncated, or does not contain any valid tool release entries.`
);
} catch (err) {
lastError = err instanceof Error ? err : new Error(String(err));
}
core.debug(
`Attempt ${attempt}/${maxAttempts} to fetch the manifest failed: ${lastError.message}`
);
if (attempt < maxAttempts) {
core.info(`Retrying to fetch the manifest...`);
await new Promise(resolve =>
setTimeout(resolve, 1000 * 2 ** (attempt - 1))
); // Retry after a delay
}
}
throw new Error(
`Failed to fetch a valid manifest after ${maxAttempts} attempts. Last error: ${lastError?.message}`
);
}
@@ -298,4 +329,30 @@ export default class OfficialBuilds extends BaseDistribution {
private isLatestSyntax(versionSpec): boolean {
return ['current', 'latest', 'node'].includes(versionSpec);
}
private async verifyNodeVersion(installedDir: string) {
// tool-cache layout: <root>/node/<version>/<arch>
const expectedVersion = 'v' + path.basename(path.dirname(installedDir));
let actualVersion = '';
try {
const {stdout} = await exec.getExecOutput('node', ['--version'], {
silent: true
});
actualVersion = stdout.trim();
} catch (err) {
throw new Error(
`Node installation failed. Node may not be installed or not on PATH: ${(err as Error).message}`,
{cause: err}
);
}
if (actualVersion !== expectedVersion) {
core.debug(
`Node installation failed: expected ${expectedVersion} but "node --version" reported ${actualVersion || '(empty)'} (installedDir: ${installedDir}).`
);
throw new Error(
`Node ${expectedVersion} installation failed, likely due to an incomplete or corrupted download.`
);
}
}
}