Compare commits

...

11 Commits

Author SHA1 Message Date
Jacob Parish (JP250552)
c6279436cc
Merge 0c618ceb2e into 1c7b2db920 2024-09-06 22:14:05 +01:00
Priya Gupta
1c7b2db920
Fix: windows arm64 setup (#1126)
* Add condition to ensure ZIP extraction targets only Windows ARM64 official archives

* Bumps micromatch from 4.0.5 to 4.0.8
2024-09-06 14:30:34 -05:00
Jacob Parish
0c618ceb2e test: added e2e test, improved unit test 2024-02-06 09:46:03 -06:00
Jacob Parish
c73bf9098a fix: pr review adjustments 2024-02-06 09:27:54 -06:00
Jacob Parish
c871b9da45 Merge remote-tracking branch 'upstream/main' into feature/corepack 2024-01-02 08:34:01 -06:00
Jacob Parish
802542be35 Merge remote-tracking branch 'upstream/main' into feature/corepack 2023-12-14 10:26:52 -06:00
Jacob Parish
d8a8b93089 docs: remove reference to experimental 2023-11-21 13:49:41 -06:00
Jacob Parish
28c91a3bbc docs: actions versions 2023-11-21 13:47:29 -06:00
Jacob Parish
f9532b258e docs: node version 2023-11-21 13:46:39 -06:00
Jacob Parish
7c0fdd03f5 test: updated tests 2023-11-21 13:31:24 -06:00
Jacob Parish (JP250552)
2936fe8cda
Added option to enable corepack (#1)
Co-authored-by: Steven <steven@ceriously.com>
Co-authored-by: Sayak Mukhopadhyay <mukhopadhyaysayak@gmail.com>
Co-authored-by: Jacob Parish <jacob.parish.1@gmail.com>
2023-11-21 13:02:28 -06:00
12 changed files with 189 additions and 29 deletions

View File

@ -135,6 +135,44 @@ jobs:
run: __tests__/verify-node.sh "${{ matrix.node-version }}" run: __tests__/verify-node.sh "${{ matrix.node-version }}"
shell: bash shell: bash
node-yarn4-corepack-dependencies-caching:
name: Test yarn 4 (Node ${{ matrix.node-version}}, ${{ matrix.os }})
runs-on: ${{ matrix.os }}
env:
YARN_ENABLE_IMMUTABLE_INSTALLS: false
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- name: Update yarn
run: yarn set version 4.1.0
- name: Yarn version
run: yarn --version
- name: Generate simple .yarnrc.yml
run: |
echo "nodeLinker: node-modules" >> .yarnrc.yml
- name: Generate yarn file
run: yarn install
- name: Remove dependencies
shell: pwsh
run: Remove-Item node_modules -Force -Recurse
- name: Clean global cache
run: yarn cache clean --all
- name: Setup Node
uses: ./
with:
node-version: ${{ matrix.node-version }}
cache: 'yarn'
corepack: true
- name: Install dependencies
run: yarn install
- name: Verify node and yarn
run: __tests__/verify-node.sh "${{ matrix.node-version }}"
shell: bash
yarn-subprojects: yarn-subprojects:
name: Test yarn subprojects name: Test yarn subprojects
strategy: strategy:

View File

@ -203,6 +203,7 @@ If the runner is not able to access github.com, any Nodejs versions requested du
- [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm) - [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm)
- [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn) - [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn)
- [Using private packages](docs/advanced-usage.md#use-private-packages) - [Using private packages](docs/advanced-usage.md#use-private-packages)
- [Enabling Corepack](docs/advanced-usage.md#enabling-corepack)
## License ## License

View File

@ -12,6 +12,7 @@ import each from 'jest-each';
import * as main from '../src/main'; import * as main from '../src/main';
import * as util from '../src/util'; import * as util from '../src/util';
import * as cacheUtil from '../src/cache-utils';
import OfficialBuilds from '../src/distributions/official_builds/official_builds'; import OfficialBuilds from '../src/distributions/official_builds/official_builds';
describe('main tests', () => { describe('main tests', () => {
@ -30,6 +31,7 @@ describe('main tests', () => {
let existsSpy: jest.SpyInstance; let existsSpy: jest.SpyInstance;
let getExecOutputSpy: jest.SpyInstance; let getExecOutputSpy: jest.SpyInstance;
let getCommandOutputSpy: jest.SpyInstance;
let getNodeVersionFromFileSpy: jest.SpyInstance; let getNodeVersionFromFileSpy: jest.SpyInstance;
let cnSpy: jest.SpyInstance; let cnSpy: jest.SpyInstance;
@ -63,6 +65,7 @@ describe('main tests', () => {
whichSpy = jest.spyOn(io, 'which'); whichSpy = jest.spyOn(io, 'which');
getExecOutputSpy = jest.spyOn(exec, 'getExecOutput'); getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
getCommandOutputSpy = jest.spyOn(cacheUtil, 'getCommandOutput');
findSpy = jest.spyOn(tc, 'find'); findSpy = jest.spyOn(tc, 'find');
@ -280,4 +283,38 @@ describe('main tests', () => {
); );
}); });
}); });
describe('corepack flag', () => {
it('should not enable corepack when no input', async () => {
inputs['corepack'] = '';
await main.run();
expect(getCommandOutputSpy).not.toHaveBeenCalledWith(expect.stringContaining('corepack'));
});
it('should not enable corepack when input is "false"', async () => {
inputs['corepack'] = 'false';
await main.run();
expect(getCommandOutputSpy).not.toHaveBeenCalledWith(expect.stringContaining('corepack'));
});
it('should enable corepack when input is "true"', async () => {
inputs['corepack'] = 'true';
await main.run();
expect(getCommandOutputSpy).toHaveBeenCalledWith('corepack enable');
});
it('should enable corepack with a single package manager', async () => {
inputs['corepack'] = 'npm';
await main.run();
expect(getCommandOutputSpy).toHaveBeenCalledWith('corepack enable npm');
});
it('should enable corepack with multiple package managers', async () => {
inputs['corepack'] = 'npm yarn';
await main.run();
expect(getCommandOutputSpy).toHaveBeenCalledWith(
'corepack enable npm yarn'
);
});
});
}); });

View File

@ -25,6 +25,9 @@ inputs:
description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm.' description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm.'
cache-dependency-path: cache-dependency-path:
description: 'Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. Supports wildcards or a list of file names for caching multiple dependencies.' description: 'Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. Supports wildcards or a list of file names for caching multiple dependencies.'
corepack:
description: 'Used to specify whether to enable Corepack. Set to true to enable all package managers or set it to one or more package manager names separated by a space. Supported package manager names: npm, yarn, pnpm.'
default: 'false'
# TODO: add input to control forcing to pull from cloud or dist. # TODO: add input to control forcing to pull from cloud or dist.
# escape valve for someone having issues or needing the absolute latest which isn't cached yet # escape valve for someone having issues or needing the absolute latest which isn't cached yet
outputs: outputs:

View File

@ -84064,12 +84064,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0; exports.enableCorepack = exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const exec = __importStar(__nccwpck_require__(1514)); const exec = __importStar(__nccwpck_require__(1514));
const io = __importStar(__nccwpck_require__(7436)); const io = __importStar(__nccwpck_require__(7436));
const fs_1 = __importDefault(__nccwpck_require__(7147)); const fs_1 = __importDefault(__nccwpck_require__(7147));
const path_1 = __importDefault(__nccwpck_require__(1017)); const path_1 = __importDefault(__nccwpck_require__(1017));
const cache_utils_1 = __nccwpck_require__(1678);
function getNodeVersionFromFile(versionFilePath) { function getNodeVersionFromFile(versionFilePath) {
var _a, _b, _c, _d, _e; var _a, _b, _c, _d, _e;
if (!fs_1.default.existsSync(versionFilePath)) { if (!fs_1.default.existsSync(versionFilePath)) {
@ -84162,6 +84163,19 @@ const unique = () => {
}; };
}; };
exports.unique = unique; exports.unique = unique;
function enableCorepack(input) {
return __awaiter(this, void 0, void 0, function* () {
if (input.length && input !== 'false') {
const corepackArgs = ['enable'];
if (input !== 'true') {
const packageManagers = input.split(' ');
corepackArgs.push(...packageManagers);
}
yield (0, cache_utils_1.getCommandOutput)(`corepack ${corepackArgs.join(' ')}`);
}
});
}
exports.enableCorepack = enableCorepack;
/***/ }), /***/ }),

26
dist/setup/index.js vendored
View File

@ -93883,7 +93883,7 @@ class BaseDistribution {
} }
throw err; throw err;
} }
const toolPath = yield this.extractArchive(downloadPath, info); const toolPath = yield this.extractArchive(downloadPath, info, true);
core.info('Done'); core.info('Done');
return toolPath; return toolPath;
}); });
@ -93933,7 +93933,7 @@ class BaseDistribution {
return toolPath; return toolPath;
}); });
} }
extractArchive(downloadPath, info) { extractArchive(downloadPath, info, isOfficialArchive) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
// //
// Extract // Extract
@ -93948,7 +93948,7 @@ class BaseDistribution {
// on Windows runners without PowerShell Core. // on Windows runners without PowerShell Core.
// //
// For default PowerShell Windows it should contain extension type to unpack it. // For default PowerShell Windows it should contain extension type to unpack it.
if (extension === '.zip') { if (extension === '.zip' && isOfficialArchive) {
const renamedArchive = `${downloadPath}.zip`; const renamedArchive = `${downloadPath}.zip`;
fs_1.default.renameSync(downloadPath, renamedArchive); fs_1.default.renameSync(downloadPath, renamedArchive);
extPath = yield tc.extractZip(renamedArchive); extPath = yield tc.extractZip(renamedArchive);
@ -94186,7 +94186,7 @@ class OfficialBuilds extends base_distribution_1.default {
core.info(`Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`); core.info(`Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`);
downloadPath = yield tc.downloadTool(versionInfo.downloadUrl, undefined, this.nodeInfo.auth); downloadPath = yield tc.downloadTool(versionInfo.downloadUrl, undefined, this.nodeInfo.auth);
if (downloadPath) { if (downloadPath) {
toolPath = yield this.extractArchive(downloadPath, versionInfo); toolPath = yield this.extractArchive(downloadPath, versionInfo, false);
} }
} }
else { else {
@ -94463,6 +94463,8 @@ function run() {
if (registryUrl) { if (registryUrl) {
auth.configAuthentication(registryUrl, alwaysAuth); auth.configAuthentication(registryUrl, alwaysAuth);
} }
const corepack = core.getInput('corepack') || 'false';
yield (0, util_1.enableCorepack)(corepack);
if (cache && (0, cache_utils_1.isCacheFeatureAvailable)()) { if (cache && (0, cache_utils_1.isCacheFeatureAvailable)()) {
core.saveState(constants_1.State.CachePackageManager, cache); core.saveState(constants_1.State.CachePackageManager, cache);
const cacheDependencyPath = core.getInput('cache-dependency-path'); const cacheDependencyPath = core.getInput('cache-dependency-path');
@ -94546,12 +94548,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0; exports.enableCorepack = exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
const core = __importStar(__nccwpck_require__(2186)); const core = __importStar(__nccwpck_require__(2186));
const exec = __importStar(__nccwpck_require__(1514)); const exec = __importStar(__nccwpck_require__(1514));
const io = __importStar(__nccwpck_require__(7436)); const io = __importStar(__nccwpck_require__(7436));
const fs_1 = __importDefault(__nccwpck_require__(7147)); const fs_1 = __importDefault(__nccwpck_require__(7147));
const path_1 = __importDefault(__nccwpck_require__(1017)); const path_1 = __importDefault(__nccwpck_require__(1017));
const cache_utils_1 = __nccwpck_require__(1678);
function getNodeVersionFromFile(versionFilePath) { function getNodeVersionFromFile(versionFilePath) {
var _a, _b, _c, _d, _e; var _a, _b, _c, _d, _e;
if (!fs_1.default.existsSync(versionFilePath)) { if (!fs_1.default.existsSync(versionFilePath)) {
@ -94644,6 +94647,19 @@ const unique = () => {
}; };
}; };
exports.unique = unique; exports.unique = unique;
function enableCorepack(input) {
return __awaiter(this, void 0, void 0, function* () {
if (input.length && input !== 'false') {
const corepackArgs = ['enable'];
if (input !== 'true') {
const packageManagers = input.split(' ');
corepackArgs.push(...packageManagers);
}
yield (0, cache_utils_1.getCommandOutput)(`corepack ${corepackArgs.join(' ')}`);
}
});
}
exports.enableCorepack = enableCorepack;
/***/ }), /***/ }),

View File

@ -418,3 +418,30 @@ Please refer to the [Ensuring workflow access to your package - Configuring a pa
### always-auth input ### always-auth input
The always-auth input sets `always-auth=true` in .npmrc file. With this option set [npm](https://docs.npmjs.com/cli/v6/using-npm/config#always-auth)/yarn sends the authentication credentials when making a request to the registries. The always-auth input sets `always-auth=true` in .npmrc file. With this option set [npm](https://docs.npmjs.com/cli/v6/using-npm/config#always-auth)/yarn sends the authentication credentials when making a request to the registries.
## Enabling Corepack
You can enable [Corepack](https://github.com/nodejs/corepack) by using the `corepack` input. You can then use `pnpm` and `yarn` commands in your project.
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18.x'
corepack: true
- name: Install dependencies
run: yarn install --immutable
```
You can also pass package manager names separated by a space to enable corepack for specific package managers only.
```yaml
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18.x'
corepack: yarn pnpm
- name: Install dependencies
run: yarn install --immutable
```

8
package-lock.json generated
View File

@ -4429,12 +4429,12 @@
} }
}, },
"node_modules/micromatch": { "node_modules/micromatch": {
"version": "4.0.5", "version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"braces": "^3.0.2", "braces": "^3.0.3",
"picomatch": "^2.3.1" "picomatch": "^2.3.1"
}, },
"engines": { "engines": {

View File

@ -150,7 +150,7 @@ export default abstract class BaseDistribution {
throw err; throw err;
} }
const toolPath = await this.extractArchive(downloadPath, info); const toolPath = await this.extractArchive(downloadPath, info, true);
core.info('Done'); core.info('Done');
return toolPath; return toolPath;
@ -210,7 +210,8 @@ export default abstract class BaseDistribution {
protected async extractArchive( protected async extractArchive(
downloadPath: string, downloadPath: string,
info: INodeVersionInfo | null info: INodeVersionInfo | null,
isOfficialArchive?: boolean
) { ) {
// //
// Extract // Extract
@ -225,7 +226,7 @@ export default abstract class BaseDistribution {
// on Windows runners without PowerShell Core. // on Windows runners without PowerShell Core.
// //
// For default PowerShell Windows it should contain extension type to unpack it. // For default PowerShell Windows it should contain extension type to unpack it.
if (extension === '.zip') { if (extension === '.zip' && isOfficialArchive) {
const renamedArchive = `${downloadPath}.zip`; const renamedArchive = `${downloadPath}.zip`;
fs.renameSync(downloadPath, renamedArchive); fs.renameSync(downloadPath, renamedArchive);
extPath = await tc.extractZip(renamedArchive); extPath = await tc.extractZip(renamedArchive);

View File

@ -88,7 +88,11 @@ export default class OfficialBuilds extends BaseDistribution {
); );
if (downloadPath) { if (downloadPath) {
toolPath = await this.extractArchive(downloadPath, versionInfo); toolPath = await this.extractArchive(
downloadPath,
versionInfo,
false
);
} }
} else { } else {
core.info( core.info(

View File

@ -7,7 +7,11 @@ import * as path from 'path';
import {restoreCache} from './cache-restore'; import {restoreCache} from './cache-restore';
import {isCacheFeatureAvailable} from './cache-utils'; import {isCacheFeatureAvailable} from './cache-utils';
import {getNodejsDistribution} from './distributions/installer-factory'; import {getNodejsDistribution} from './distributions/installer-factory';
import {getNodeVersionFromFile, printEnvDetailsAndSetOutput} from './util'; import {
getNodeVersionFromFile,
printEnvDetailsAndSetOutput,
enableCorepack
} from './util';
import {State} from './constants'; import {State} from './constants';
export async function run() { export async function run() {
@ -59,6 +63,9 @@ export async function run() {
auth.configAuthentication(registryUrl, alwaysAuth); auth.configAuthentication(registryUrl, alwaysAuth);
} }
const corepack = core.getInput('corepack') || 'false';
await enableCorepack(corepack);
if (cache && isCacheFeatureAvailable()) { if (cache && isCacheFeatureAvailable()) {
core.saveState(State.CachePackageManager, cache); core.saveState(State.CachePackageManager, cache);
const cacheDependencyPath = core.getInput('cache-dependency-path'); const cacheDependencyPath = core.getInput('cache-dependency-path');

View File

@ -4,6 +4,7 @@ import * as io from '@actions/io';
import fs from 'fs'; import fs from 'fs';
import path from 'path'; import path from 'path';
import {getCommandOutput} from './cache-utils';
export function getNodeVersionFromFile(versionFilePath: string): string | null { export function getNodeVersionFromFile(versionFilePath: string): string | null {
if (!fs.existsSync(versionFilePath)) { if (!fs.existsSync(versionFilePath)) {
@ -106,3 +107,14 @@ export const unique = () => {
return true; return true;
}; };
}; };
export async function enableCorepack(input: string): Promise<void> {
if (input.length && input !== 'false') {
const corepackArgs = ['enable'];
if (input !== 'true') {
const packageManagers = input.split(' ');
corepackArgs.push(...packageManagers);
}
await getCommandOutput(`corepack ${corepackArgs.join(' ')}`);
}
}