mirror of
https://github.com/actions/setup-node.git
synced 2026-05-31 08:41:49 +00:00
Merge dff445bec7 into 670825a89d
This commit is contained in:
commit
28afbd7bb6
5 changed files with 109 additions and 3 deletions
|
|
@ -9,6 +9,7 @@ import {State} from './constants';
|
|||
import {
|
||||
getCacheDirectories,
|
||||
getPackageManagerInfo,
|
||||
isPackageManagerInstalled,
|
||||
repoHasYarnBerryManagedDependencies,
|
||||
PackageManagerInfo
|
||||
} from './cache-utils';
|
||||
|
|
@ -21,6 +22,20 @@ export const restoreCache = async (
|
|||
if (!packageManagerInfo) {
|
||||
throw new Error(`Caching for '${packageManager}' is not supported`);
|
||||
}
|
||||
|
||||
// Check if the package manager is installed before attempting to cache
|
||||
// This prevents cache failures for package managers that need to be installed first
|
||||
// See: https://github.com/actions/setup-node/issues/1357
|
||||
const isInstalled = await isPackageManagerInstalled(packageManager);
|
||||
if (!isInstalled) {
|
||||
core.warning(
|
||||
`Package manager '${packageManager}' was not found in the PATH. ` +
|
||||
`Skipping cache restore. Please ensure the package manager is installed ` +
|
||||
`before running this action or set 'package-manager-cache: false' to disable caching.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const platform = process.env.RUNNER_OS;
|
||||
const arch = os.arch();
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import * as core from '@actions/core';
|
|||
import * as cache from '@actions/cache';
|
||||
|
||||
import {State} from './constants';
|
||||
import {getPackageManagerInfo} from './cache-utils';
|
||||
import {getPackageManagerInfo, isPackageManagerInstalled} from './cache-utils';
|
||||
|
||||
// Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in
|
||||
// @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to
|
||||
|
|
@ -45,6 +45,17 @@ const cachePackages = async (packageManager: string) => {
|
|||
return;
|
||||
}
|
||||
|
||||
// Check if the package manager is installed before attempting to save cache
|
||||
// This prevents cache save failures for package managers that may not be installed
|
||||
const isInstalled = await isPackageManagerInstalled(packageManager);
|
||||
if (!isInstalled) {
|
||||
core.warning(
|
||||
`Package manager '${packageManager}' was not found in the PATH. ` +
|
||||
`Skipping cache save.`
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cachePaths.length) {
|
||||
// TODO: core.getInput has a bug - it can return undefined despite its definition (tests only?)
|
||||
// export declare function getInput(name: string, options?: InputOptions): string;
|
||||
|
|
|
|||
|
|
@ -110,6 +110,30 @@ export const getPackageManagerInfo = async (packageManager: string) => {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if a package manager is installed and available on the PATH
|
||||
* This helps prevent cache failures when a package manager is specified
|
||||
* but not yet installed (e.g., pnpm via corepack)
|
||||
* See: https://github.com/actions/setup-node/issues/1357
|
||||
*/
|
||||
export const isPackageManagerInstalled = async (
|
||||
packageManager: string
|
||||
): Promise<boolean> => {
|
||||
try {
|
||||
const {exitCode} = await exec.getExecOutput(
|
||||
`${packageManager} --version`,
|
||||
undefined,
|
||||
{
|
||||
ignoreReturnCode: true,
|
||||
silent: true
|
||||
}
|
||||
);
|
||||
return exitCode === 0;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* getProjectDirectoriesFromCacheDependencyPath is called twice during `restoreCache`
|
||||
* - first through `getCacheDirectories`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue