mirror of
				https://kkgithub.com/actions/setup-node.git
				synced 2025-11-04 04:31:55 +08:00 
			
		
		
		
	Add support for arm64 Windows (#927)
* add support for arm64 Windows * revert 7z to exe * add comment --------- Co-authored-by: aparnajyothi-y <147696841+aparnajyothi-y@users.noreply.github.com>
This commit is contained in:
		@ -2,6 +2,7 @@ import * as core from '@actions/core';
 | 
				
			|||||||
import * as exec from '@actions/exec';
 | 
					import * as exec from '@actions/exec';
 | 
				
			||||||
import * as tc from '@actions/tool-cache';
 | 
					import * as tc from '@actions/tool-cache';
 | 
				
			||||||
import * as cache from '@actions/cache';
 | 
					import * as cache from '@actions/cache';
 | 
				
			||||||
 | 
					import * as io from '@actions/io';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import fs from 'fs';
 | 
					import fs from 'fs';
 | 
				
			||||||
import path from 'path';
 | 
					import path from 'path';
 | 
				
			||||||
@ -24,6 +25,10 @@ describe('main tests', () => {
 | 
				
			|||||||
  let startGroupSpy: jest.SpyInstance;
 | 
					  let startGroupSpy: jest.SpyInstance;
 | 
				
			||||||
  let endGroupSpy: jest.SpyInstance;
 | 
					  let endGroupSpy: jest.SpyInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let whichSpy: jest.SpyInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let existsSpy: jest.SpyInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let getExecOutputSpy: jest.SpyInstance;
 | 
					  let getExecOutputSpy: jest.SpyInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let getNodeVersionFromFileSpy: jest.SpyInstance;
 | 
					  let getNodeVersionFromFileSpy: jest.SpyInstance;
 | 
				
			||||||
@ -55,6 +60,8 @@ describe('main tests', () => {
 | 
				
			|||||||
    inSpy = jest.spyOn(core, 'getInput');
 | 
					    inSpy = jest.spyOn(core, 'getInput');
 | 
				
			||||||
    inSpy.mockImplementation(name => inputs[name]);
 | 
					    inSpy.mockImplementation(name => inputs[name]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    whichSpy = jest.spyOn(io, 'which');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
 | 
					    getExecOutputSpy = jest.spyOn(exec, 'getExecOutput');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    findSpy = jest.spyOn(tc, 'find');
 | 
					    findSpy = jest.spyOn(tc, 'find');
 | 
				
			||||||
@ -140,6 +147,10 @@ describe('main tests', () => {
 | 
				
			|||||||
        return {stdout: obj[command], stderr: '', exitCode: 0};
 | 
					        return {stdout: obj[command], stderr: '', exitCode: 0};
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      whichSpy.mockImplementation(cmd => {
 | 
				
			||||||
 | 
					        return `some/${cmd}/path`;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      await util.printEnvDetailsAndSetOutput();
 | 
					      await util.printEnvDetailsAndSetOutput();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      expect(setOutputSpy).toHaveBeenCalledWith('node-version', obj['node']);
 | 
					      expect(setOutputSpy).toHaveBeenCalledWith('node-version', obj['node']);
 | 
				
			||||||
 | 
				
			|||||||
@ -248,6 +248,9 @@ describe('setup-node', () => {
 | 
				
			|||||||
    const toolPath = path.normalize('/cache/node/12.16.2/x64');
 | 
					    const toolPath = path.normalize('/cache/node/12.16.2/x64');
 | 
				
			||||||
    exSpy.mockImplementation(async () => '/some/other/temp/path');
 | 
					    exSpy.mockImplementation(async () => '/some/other/temp/path');
 | 
				
			||||||
    cacheSpy.mockImplementation(async () => toolPath);
 | 
					    cacheSpy.mockImplementation(async () => toolPath);
 | 
				
			||||||
 | 
					    whichSpy.mockImplementation(cmd => {
 | 
				
			||||||
 | 
					      return `some/${cmd}/path`;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await main.run();
 | 
					    await main.run();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/cache-save/index.js
									
									
									
									
										vendored
									
									
								
							@ -83336,6 +83336,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
				
			|||||||
exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
 | 
					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 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));
 | 
				
			||||||
function getNodeVersionFromFile(versionFilePath) {
 | 
					function getNodeVersionFromFile(versionFilePath) {
 | 
				
			||||||
@ -83387,7 +83388,8 @@ function printEnvDetailsAndSetOutput() {
 | 
				
			|||||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
					    return __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
        core.startGroup('Environment details');
 | 
					        core.startGroup('Environment details');
 | 
				
			||||||
        const promises = ['node', 'npm', 'yarn'].map((tool) => __awaiter(this, void 0, void 0, function* () {
 | 
					        const promises = ['node', 'npm', 'yarn'].map((tool) => __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
            const output = yield getToolVersion(tool, ['--version']);
 | 
					            const pathTool = yield io.which(tool, false);
 | 
				
			||||||
 | 
					            const output = pathTool ? yield getToolVersion(tool, ['--version']) : '';
 | 
				
			||||||
            return { tool, output };
 | 
					            return { tool, output };
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
        const tools = yield Promise.all(promises);
 | 
					        const tools = yield Promise.all(promises);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										36
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								dist/setup/index.js
									
									
									
									
										vendored
									
									
								
							@ -93110,7 +93110,11 @@ class BaseDistribution {
 | 
				
			|||||||
        const fileName = this.osPlat == 'win32'
 | 
					        const fileName = this.osPlat == 'win32'
 | 
				
			||||||
            ? `node-v${version}-win-${osArch}`
 | 
					            ? `node-v${version}-win-${osArch}`
 | 
				
			||||||
            : `node-v${version}-${this.osPlat}-${osArch}`;
 | 
					            : `node-v${version}-${this.osPlat}-${osArch}`;
 | 
				
			||||||
        const urlFileName = this.osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`;
 | 
					        const urlFileName = this.osPlat == 'win32'
 | 
				
			||||||
 | 
					            ? this.nodeInfo.arch === 'arm64'
 | 
				
			||||||
 | 
					                ? `${fileName}.zip`
 | 
				
			||||||
 | 
					                : `${fileName}.7z`
 | 
				
			||||||
 | 
					            : `${fileName}.tar.gz`;
 | 
				
			||||||
        const initialUrl = this.getDistributionUrl();
 | 
					        const initialUrl = this.getDistributionUrl();
 | 
				
			||||||
        const url = `${initialUrl}/v${version}/${urlFileName}`;
 | 
					        const url = `${initialUrl}/v${version}/${urlFileName}`;
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
@ -93194,10 +93198,23 @@ class BaseDistribution {
 | 
				
			|||||||
            let extPath;
 | 
					            let extPath;
 | 
				
			||||||
            info = info || {}; // satisfy compiler, never null when reaches here
 | 
					            info = info || {}; // satisfy compiler, never null when reaches here
 | 
				
			||||||
            if (this.osPlat == 'win32') {
 | 
					            if (this.osPlat == 'win32') {
 | 
				
			||||||
                const _7zPath = path.join(__dirname, '../..', 'externals', '7zr.exe');
 | 
					                const extension = this.nodeInfo.arch === 'arm64' ? '.zip' : '.7z';
 | 
				
			||||||
                extPath = yield tc.extract7z(downloadPath, undefined, _7zPath);
 | 
					                // Rename archive to add extension because after downloading
 | 
				
			||||||
 | 
					                // archive does not contain extension type and it leads to some issues
 | 
				
			||||||
 | 
					                // on Windows runners without PowerShell Core.
 | 
				
			||||||
 | 
					                //
 | 
				
			||||||
 | 
					                // For default PowerShell Windows it should contain extension type to unpack it.
 | 
				
			||||||
 | 
					                if (extension === '.zip') {
 | 
				
			||||||
 | 
					                    const renamedArchive = `${downloadPath}.zip`;
 | 
				
			||||||
 | 
					                    fs_1.default.renameSync(downloadPath, renamedArchive);
 | 
				
			||||||
 | 
					                    extPath = yield tc.extractZip(renamedArchive);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    const _7zPath = path.join(__dirname, '../..', 'externals', '7zr.exe');
 | 
				
			||||||
 | 
					                    extPath = yield tc.extract7z(downloadPath, undefined, _7zPath);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                // 7z extracts to folder matching file name
 | 
					                // 7z extracts to folder matching file name
 | 
				
			||||||
                const nestedPath = path.join(extPath, path.basename(info.fileName, '.7z'));
 | 
					                const nestedPath = path.join(extPath, path.basename(info.fileName, extension));
 | 
				
			||||||
                if (fs_1.default.existsSync(nestedPath)) {
 | 
					                if (fs_1.default.existsSync(nestedPath)) {
 | 
				
			||||||
                    extPath = nestedPath;
 | 
					                    extPath = nestedPath;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -93229,7 +93246,12 @@ class BaseDistribution {
 | 
				
			|||||||
                dataFileName = `osx-${osArch}-tar`;
 | 
					                dataFileName = `osx-${osArch}-tar`;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            case 'win32':
 | 
					            case 'win32':
 | 
				
			||||||
                dataFileName = `win-${osArch}-exe`;
 | 
					                if (this.nodeInfo.arch === 'arm64') {
 | 
				
			||||||
 | 
					                    dataFileName = `win-${osArch}-zip`;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else {
 | 
				
			||||||
 | 
					                    dataFileName = `win-${osArch}-exe`;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                throw new Error(`Unexpected OS '${this.osPlat}'`);
 | 
					                throw new Error(`Unexpected OS '${this.osPlat}'`);
 | 
				
			||||||
@ -93783,6 +93805,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
 | 
				
			|||||||
exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
 | 
					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 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));
 | 
				
			||||||
function getNodeVersionFromFile(versionFilePath) {
 | 
					function getNodeVersionFromFile(versionFilePath) {
 | 
				
			||||||
@ -93834,7 +93857,8 @@ function printEnvDetailsAndSetOutput() {
 | 
				
			|||||||
    return __awaiter(this, void 0, void 0, function* () {
 | 
					    return __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
        core.startGroup('Environment details');
 | 
					        core.startGroup('Environment details');
 | 
				
			||||||
        const promises = ['node', 'npm', 'yarn'].map((tool) => __awaiter(this, void 0, void 0, function* () {
 | 
					        const promises = ['node', 'npm', 'yarn'].map((tool) => __awaiter(this, void 0, void 0, function* () {
 | 
				
			||||||
            const output = yield getToolVersion(tool, ['--version']);
 | 
					            const pathTool = yield io.which(tool, false);
 | 
				
			||||||
 | 
					            const output = pathTool ? yield getToolVersion(tool, ['--version']) : '';
 | 
				
			||||||
            return { tool, output };
 | 
					            return { tool, output };
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
        const tools = yield Promise.all(promises);
 | 
					        const tools = yield Promise.all(promises);
 | 
				
			||||||
 | 
				
			|||||||
@ -112,7 +112,11 @@ export default abstract class BaseDistribution {
 | 
				
			|||||||
        ? `node-v${version}-win-${osArch}`
 | 
					        ? `node-v${version}-win-${osArch}`
 | 
				
			||||||
        : `node-v${version}-${this.osPlat}-${osArch}`;
 | 
					        : `node-v${version}-${this.osPlat}-${osArch}`;
 | 
				
			||||||
    const urlFileName: string =
 | 
					    const urlFileName: string =
 | 
				
			||||||
      this.osPlat == 'win32' ? `${fileName}.7z` : `${fileName}.tar.gz`;
 | 
					      this.osPlat == 'win32'
 | 
				
			||||||
 | 
					        ? this.nodeInfo.arch === 'arm64'
 | 
				
			||||||
 | 
					          ? `${fileName}.zip`
 | 
				
			||||||
 | 
					          : `${fileName}.7z`
 | 
				
			||||||
 | 
					        : `${fileName}.tar.gz`;
 | 
				
			||||||
    const initialUrl = this.getDistributionUrl();
 | 
					    const initialUrl = this.getDistributionUrl();
 | 
				
			||||||
    const url = `${initialUrl}/v${version}/${urlFileName}`;
 | 
					    const url = `${initialUrl}/v${version}/${urlFileName}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -215,12 +219,24 @@ export default abstract class BaseDistribution {
 | 
				
			|||||||
    let extPath: string;
 | 
					    let extPath: string;
 | 
				
			||||||
    info = info || ({} as INodeVersionInfo); // satisfy compiler, never null when reaches here
 | 
					    info = info || ({} as INodeVersionInfo); // satisfy compiler, never null when reaches here
 | 
				
			||||||
    if (this.osPlat == 'win32') {
 | 
					    if (this.osPlat == 'win32') {
 | 
				
			||||||
      const _7zPath = path.join(__dirname, '../..', 'externals', '7zr.exe');
 | 
					      const extension = this.nodeInfo.arch === 'arm64' ? '.zip' : '.7z';
 | 
				
			||||||
      extPath = await tc.extract7z(downloadPath, undefined, _7zPath);
 | 
					      // Rename archive to add extension because after downloading
 | 
				
			||||||
 | 
					      // archive does not contain extension type and it leads to some issues
 | 
				
			||||||
 | 
					      // on Windows runners without PowerShell Core.
 | 
				
			||||||
 | 
					      //
 | 
				
			||||||
 | 
					      // For default PowerShell Windows it should contain extension type to unpack it.
 | 
				
			||||||
 | 
					      if (extension === '.zip') {
 | 
				
			||||||
 | 
					        const renamedArchive = `${downloadPath}.zip`;
 | 
				
			||||||
 | 
					        fs.renameSync(downloadPath, renamedArchive);
 | 
				
			||||||
 | 
					        extPath = await tc.extractZip(renamedArchive);
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        const _7zPath = path.join(__dirname, '../..', 'externals', '7zr.exe');
 | 
				
			||||||
 | 
					        extPath = await tc.extract7z(downloadPath, undefined, _7zPath);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      // 7z extracts to folder matching file name
 | 
					      // 7z extracts to folder matching file name
 | 
				
			||||||
      const nestedPath = path.join(
 | 
					      const nestedPath = path.join(
 | 
				
			||||||
        extPath,
 | 
					        extPath,
 | 
				
			||||||
        path.basename(info.fileName, '.7z')
 | 
					        path.basename(info.fileName, extension)
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      if (fs.existsSync(nestedPath)) {
 | 
					      if (fs.existsSync(nestedPath)) {
 | 
				
			||||||
        extPath = nestedPath;
 | 
					        extPath = nestedPath;
 | 
				
			||||||
@ -260,7 +276,11 @@ export default abstract class BaseDistribution {
 | 
				
			|||||||
        dataFileName = `osx-${osArch}-tar`;
 | 
					        dataFileName = `osx-${osArch}-tar`;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case 'win32':
 | 
					      case 'win32':
 | 
				
			||||||
        dataFileName = `win-${osArch}-exe`;
 | 
					        if (this.nodeInfo.arch === 'arm64') {
 | 
				
			||||||
 | 
					          dataFileName = `win-${osArch}-zip`;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          dataFileName = `win-${osArch}-exe`;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
        throw new Error(`Unexpected OS '${this.osPlat}'`);
 | 
					        throw new Error(`Unexpected OS '${this.osPlat}'`);
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,6 @@
 | 
				
			|||||||
import * as core from '@actions/core';
 | 
					import * as core from '@actions/core';
 | 
				
			||||||
import * as exec from '@actions/exec';
 | 
					import * as exec from '@actions/exec';
 | 
				
			||||||
 | 
					import * as io from '@actions/io';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import fs from 'fs';
 | 
					import fs from 'fs';
 | 
				
			||||||
import path from 'path';
 | 
					import path from 'path';
 | 
				
			||||||
@ -61,9 +62,9 @@ export function getNodeVersionFromFile(versionFilePath: string): string | null {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export async function printEnvDetailsAndSetOutput() {
 | 
					export async function printEnvDetailsAndSetOutput() {
 | 
				
			||||||
  core.startGroup('Environment details');
 | 
					  core.startGroup('Environment details');
 | 
				
			||||||
 | 
					 | 
				
			||||||
  const promises = ['node', 'npm', 'yarn'].map(async tool => {
 | 
					  const promises = ['node', 'npm', 'yarn'].map(async tool => {
 | 
				
			||||||
    const output = await getToolVersion(tool, ['--version']);
 | 
					    const pathTool = await io.which(tool, false);
 | 
				
			||||||
 | 
					    const output = pathTool ? await getToolVersion(tool, ['--version']) : '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {tool, output};
 | 
					    return {tool, output};
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user