From ec07be593a0ada7481d541782666767f2180ccfc Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Tue, 14 Dec 2021 13:12:54 -0500 Subject: [PATCH 1/6] Add test for export of GOROOT to env var Signed-off-by: Manuel Mendez --- __tests__/setup-go.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index ba54900f9..6be0c03c8 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -49,6 +49,7 @@ describe('setup-go', () => { inSpy.mockImplementation(name => inputs[name]); getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput'); getBooleanInputSpy.mockImplementation(name => inputs[name]); + exSpy = jest.spyOn(core, 'exportVariable'); // node os = {}; @@ -230,6 +231,22 @@ describe('setup-go', () => { expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); }); + it('exports GOROOT', 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) => { + vars[name] = val; + }); + + await main.run(); + expect(vars).toBe({GOROOT: 'foo'}); + }); + it('finds a version of go already in the cache', async () => { inputs['go-version'] = '1.13.0'; From 83124a14b6a7860a85fe88a6cd82b86f05fb2cf9 Mon Sep 17 00:00:00 2001 From: Manuel Mendez Date: Tue, 14 Dec 2021 13:24:18 -0500 Subject: [PATCH 2/6] Do not export GOROOT This has not been necessary since [Go 1.9](https://go.dev/doc/go1.9#goroot) at least (although clunky to do so then) but definitely not since [Go 1.10](https://go.dev/doc/go1.10#goroot). This is cargo culting code that is more than 2 years out of date and runs into issues when multiple go versions are used in an action run. Signed-off-by: Manuel Mendez --- __tests__/setup-go.test.ts | 4 ++-- dist/index.js | 1 - src/main.ts | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 6be0c03c8..7bb3828f4 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -231,7 +231,7 @@ describe('setup-go', () => { expect(logSpy).toHaveBeenCalledWith(`Setup go version spec 1.13.0`); }); - it('exports GOROOT', async () => { + it('does not export any varibles', async () => { inputs['go-version'] = '1.13.0'; inSpy.mockImplementation(name => inputs[name]); @@ -244,7 +244,7 @@ describe('setup-go', () => { }); await main.run(); - expect(vars).toBe({GOROOT: 'foo'}); + expect(vars).toStrictEqual({}); }); it('finds a version of go already in the cache', async () => { diff --git a/dist/index.js b/dist/index.js index ac3d0e5c1..87ff0a4c8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2080,7 +2080,6 @@ function run() { let auth = !token || isGhes() ? undefined : `token ${token}`; const checkLatest = core.getBooleanInput('check-latest'); const installDir = yield installer.getGo(versionSpec, checkLatest, auth); - core.exportVariable('GOROOT', installDir); core.addPath(path_1.default.join(installDir, 'bin')); core.info('Added go to the path'); let added = yield addBinToPath(); diff --git a/src/main.ts b/src/main.ts index f785b85da..7a9c1f51d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -23,7 +23,6 @@ export async function run() { const checkLatest = core.getBooleanInput('check-latest'); const installDir = await installer.getGo(versionSpec, checkLatest, auth); - core.exportVariable('GOROOT', installDir); core.addPath(path.join(installDir, 'bin')); core.info('Added go to the path'); From 2a34c33bd7648b12fa2caabb0bfc8919e37aacc6 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 14 Mar 2022 12:21:30 -0400 Subject: [PATCH 3/6] 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 7bb3828f4..4c7efdc1a 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 87ff0a4c8..99a304b8c 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 7a9c1f51d..afb59fc16 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}`); From 802876f7c7e9ca0bae4bf73e507f4400ad8e567f Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 14 Mar 2022 12:23:03 -0400 Subject: [PATCH 4/6] Fix formatting --- __tests__/setup-go.test.ts | 7 +++---- src/main.ts | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 4c7efdc1a..3383e9984 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -240,7 +240,7 @@ describe('setup-go', () => { let toolPath = path.normalize('/cache/go/1.13.0/x64'); findSpy.mockImplementation(() => toolPath); - let vars: { [key: string]: string; } = {}; + let vars: {[key: string]: string} = {}; exportVarSpy.mockImplementation((name: string, val: string) => { vars[name] = val; }); @@ -256,18 +256,17 @@ describe('setup-go', () => { let toolPath = path.normalize('/cache/go/1.8.0/x64'); findSpy.mockImplementation(() => toolPath); - let vars: { [key: string]: string; } = {}; + let vars: {[key: string]: string} = {}; exportVarSpy.mockImplementation((name: string, val: string) => { vars[name] = val; }); await main.run(); expect(vars).toStrictEqual({ - "GOROOT": toolPath + GOROOT: toolPath }); }); - it('finds a version of go already in the cache', async () => { inputs['go-version'] = '1.13.0'; diff --git a/src/main.ts b/src/main.ts index afb59fc16..429585827 100644 --- a/src/main.ts +++ b/src/main.ts @@ -30,7 +30,7 @@ export async function run() { 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.info('Setting GOROOT for Go version < 1.9'); core.exportVariable('GOROOT', installDir); } From 229eefa42bc953e2e5c73d5532f977c10cc2b271 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 14 Mar 2022 12:24:32 -0400 Subject: [PATCH 5/6] Update `dist` --- dist/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index 99a304b8c..7a7a59cfe 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2086,7 +2086,7 @@ function run() { 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.info('Setting GOROOT for Go version < 1.9'); core.exportVariable('GOROOT', installDir); } let added = yield addBinToPath(); From 0c03929337ba6c12b883b8b7361696700b6d82c8 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Mon, 14 Mar 2022 12:32:36 -0400 Subject: [PATCH 6/6] Remove duplicated `spyOn` --- __tests__/setup-go.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 3383e9984..bb85dee18 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -51,7 +51,6 @@ describe('setup-go', () => { getBooleanInputSpy = jest.spyOn(core, 'getBooleanInput'); getBooleanInputSpy.mockImplementation(name => inputs[name]); exportVarSpy = jest.spyOn(core, 'exportVariable'); - extractTarSpy = jest.spyOn(core, 'exportVariable'); // node os = {};