From 2a34c33bd7648b12fa2caabb0bfc8919e37aacc6 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 14 Mar 2022 12:21:30 -0400 Subject: [PATCH] Export `GOROOT` for versions < 1.9 --- __tests__/setup-go.test.ts | 61 +++++++++++++++++++++++++------------- dist/index.js | 7 +++++ src/main.ts | 8 +++++ 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 7bb3828..4c7efdc 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -20,6 +20,7 @@ describe('setup-go', () => { let inSpy: jest.SpyInstance; let getBooleanInputSpy: jest.SpyInstance; + let exportVarSpy: jest.SpyInstance; let findSpy: jest.SpyInstance; let cnSpy: jest.SpyInstance; let logSpy: jest.SpyInstance; @@ -27,7 +28,7 @@ describe('setup-go', () => { let platSpy: jest.SpyInstance; let archSpy: jest.SpyInstance; let dlSpy: jest.SpyInstance; - let exSpy: jest.SpyInstance; + let extractTarSpy: jest.SpyInstance; let cacheSpy: jest.SpyInstance; let dbgSpy: jest.SpyInstance; let whichSpy: jest.SpyInstance; @@ -49,7 +50,8 @@ describe('setup-go', () => { inSpy.mockImplementation(name => inputs[name]); getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput'); getBooleanInputSpy.mockImplementation(name => inputs[name]); - exSpy = jest.spyOn(core, 'exportVariable'); + exportVarSpy = jest.spyOn(core, 'exportVariable'); + extractTarSpy = jest.spyOn(core, 'exportVariable'); // node os = {}; @@ -62,7 +64,7 @@ describe('setup-go', () => { // @actions/tool-cache findSpy = jest.spyOn(tc, 'find'); dlSpy = jest.spyOn(tc, 'downloadTool'); - exSpy = jest.spyOn(tc, 'extractTar'); + extractTarSpy = jest.spyOn(tc, 'extractTar'); cacheSpy = jest.spyOn(tc, 'cacheDir'); getSpy = jest.spyOn(im, 'getVersionsDist'); getManifestSpy = jest.spyOn(tc, 'getManifestFromRepo'); @@ -231,15 +233,15 @@ describe('setup-go', () => { expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); }); - it('does not export any varibles', async () => { + it('does not export any variables for Go versions >=1.9', async () => { inputs['go-version'] = '1.13.0'; inSpy.mockImplementation(name => inputs[name]); let toolPath = path.normalize('/cache/go/1.13.0/x64'); findSpy.mockImplementation(() => toolPath); - let vars = {} as any; - exSpy.mockImplementation(async (name, val) => { + let vars: { [key: string]: string; } = {}; + exportVarSpy.mockImplementation((name: string, val: string) => { vars[name] = val; }); @@ -247,6 +249,25 @@ describe('setup-go', () => { expect(vars).toStrictEqual({}); }); + it('exports GOROOT for Go versions <1.9', async () => { + inputs['go-version'] = '1.8'; + inSpy.mockImplementation(name => inputs[name]); + + let toolPath = path.normalize('/cache/go/1.8.0/x64'); + findSpy.mockImplementation(() => toolPath); + + let vars: { [key: string]: string; } = {}; + exportVarSpy.mockImplementation((name: string, val: string) => { + vars[name] = val; + }); + + await main.run(); + expect(vars).toStrictEqual({ + "GOROOT": toolPath + }); + }); + + it('finds a version of go already in the cache', async () => { inputs['go-version'] = '1.13.0'; @@ -288,14 +309,14 @@ describe('setup-go', () => { findSpy.mockImplementation(() => ''); dlSpy.mockImplementation(() => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.13.0/x64'); - exSpy.mockImplementation(() => '/some/other/temp/path'); + extractTarSpy.mockImplementation(() => '/some/other/temp/path'); cacheSpy.mockImplementation(() => toolPath); await main.run(); let expPath = path.join(toolPath, 'bin'); expect(dlSpy).toHaveBeenCalled(); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`); }); @@ -330,7 +351,7 @@ describe('setup-go', () => { dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.12.16/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -338,7 +359,7 @@ describe('setup-go', () => { let expPath = path.join(toolPath, 'bin'); expect(dlSpy).toHaveBeenCalled(); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(logSpy).not.toHaveBeenCalledWith( 'Not found in manifest. Falling back to download directly from Go' ); @@ -367,7 +388,7 @@ describe('setup-go', () => { dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.12.17/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -375,7 +396,7 @@ describe('setup-go', () => { let expPath = path.join(toolPath, 'bin'); expect(dlSpy).toHaveBeenCalled(); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(logSpy).not.toHaveBeenCalledWith( 'Not found in manifest. Falling back to download directly from Go' ); @@ -404,7 +425,7 @@ describe('setup-go', () => { dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.12.14/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -415,7 +436,7 @@ describe('setup-go', () => { expect(logSpy).toHaveBeenCalledWith('Attempting to download 1.12.14...'); expect(dlSpy).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith('matching 1.12.14...'); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith( 'Not found in manifest. Falling back to download directly from Go' ); @@ -617,7 +638,7 @@ describe('setup-go', () => { const toolPath = path.normalize('/cache/go/1.16.1/x64'); findSpy.mockReturnValue(toolPath); dlSpy.mockImplementation(async () => '/some/temp/path'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -639,7 +660,7 @@ describe('setup-go', () => { findSpy.mockImplementation(() => ''); dlSpy.mockImplementation(async () => '/some/temp/path'); const toolPath = path.normalize('/cache/go/1.17.5/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); const expectedUrl = 'https://github.com/actions/go-versions/releases/download/1.17.6-1668090892/go-1.17.6-darwin-x64.tar.gz'; @@ -680,7 +701,7 @@ describe('setup-go', () => { dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.13.7/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -688,7 +709,7 @@ describe('setup-go', () => { let expPath = path.join(toolPath, 'bin'); expect(dlSpy).toHaveBeenCalled(); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith( 'Attempting to resolve the latest version from the manifest...' ); @@ -722,7 +743,7 @@ describe('setup-go', () => { dlSpy.mockImplementation(async () => '/some/temp/path'); let toolPath = path.normalize('/cache/go/1.13.7/x64'); - exSpy.mockImplementation(async () => '/some/other/temp/path'); + extractTarSpy.mockImplementation(async () => '/some/other/temp/path'); cacheSpy.mockImplementation(async () => toolPath); await main.run(); @@ -733,7 +754,7 @@ describe('setup-go', () => { `Failed to resolve version ${versionSpec} from manifest` ); expect(dlSpy).toHaveBeenCalled(); - expect(exSpy).toHaveBeenCalled(); + expect(extractTarSpy).toHaveBeenCalled(); expect(logSpy).toHaveBeenCalledWith( 'Attempting to resolve the latest version from the manifest...' ); diff --git a/dist/index.js b/dist/index.js index 87ff0a4..99a304b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2062,6 +2062,7 @@ exports.addBinToPath = exports.run = void 0; const core = __importStar(__webpack_require__(470)); const io = __importStar(__webpack_require__(1)); const installer = __importStar(__webpack_require__(749)); +const semver = __importStar(__webpack_require__(280)); const path_1 = __importDefault(__webpack_require__(622)); const child_process_1 = __importDefault(__webpack_require__(129)); const fs_1 = __importDefault(__webpack_require__(747)); @@ -2082,6 +2083,12 @@ function run() { const installDir = yield installer.getGo(versionSpec, checkLatest, auth); core.addPath(path_1.default.join(installDir, 'bin')); core.info('Added go to the path'); + const version = installer.makeSemver(versionSpec); + // Go versions less than 1.9 require GOROOT to be set + if (semver.lt(version, '1.9.0')) { + core.info("Setting GOROOT for Go version < 1.9"); + core.exportVariable('GOROOT', installDir); + } let added = yield addBinToPath(); core.debug(`add bin ${added}`); core.info(`Successfully setup go version ${versionSpec}`); diff --git a/src/main.ts b/src/main.ts index 7a9c1f5..afb59fc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ import * as core from '@actions/core'; import * as io from '@actions/io'; import * as installer from './installer'; +import * as semver from 'semver'; import path from 'path'; import cp from 'child_process'; import fs from 'fs'; @@ -26,6 +27,13 @@ export async function run() { core.addPath(path.join(installDir, 'bin')); core.info('Added go to the path'); + const version = installer.makeSemver(versionSpec); + // Go versions less than 1.9 require GOROOT to be set + if (semver.lt(version, '1.9.0')) { + core.info("Setting GOROOT for Go version < 1.9"); + core.exportVariable('GOROOT', installDir); + } + let added = await addBinToPath(); core.debug(`add bin ${added}`); core.info(`Successfully setup go version ${versionSpec}`);