From 52329c595aa7aeba996ad9657015543ca6993608 Mon Sep 17 00:00:00 2001 From: Luca Comellini Date: Wed, 15 Feb 2023 16:16:09 -0800 Subject: [PATCH] Add JSON output of `go env` and some env as strings Additional outputs are: - GOPATH as `go-path` string - GOMOD as `go-mod` string - GOCACHE as `go-cache` string - GOMODCACHE as `go-mod-cache` string - `go env` as `go-env` JSON --- .github/workflows/outputs.yml | 24 ++++++++++++++++++++++++ __tests__/setup-go.test.ts | 23 +++++++++++++++++++++++ action.yml | 12 ++++++++++++ dist/setup/index.js | 31 +++++++++++++++++++++++++------ src/main.ts | 34 ++++++++++++++++++++++++++++------ 5 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/outputs.yml diff --git a/.github/workflows/outputs.yml b/.github/workflows/outputs.yml new file mode 100644 index 000000000..b06faa4fe --- /dev/null +++ b/.github/workflows/outputs.yml @@ -0,0 +1,24 @@ +name: Test outputs + +on: + push: + branches: + - main + pull_request: + +jobs: + setup-go-env: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - id: setup-go + uses: ./ + - run: | + echo GOPATH=${{ steps.setup-go.outputs.go-path }} + echo GOMOD=${{ steps.setup-go.outputs.go-mod }} + echo GOMODCACHE=${{ steps.setup-go.outputs.go-mod-cache }} + echo GOVERSION=${{ steps.setup-go.outputs.go-version }} + echo GOCACHE=${{ steps.setup-go.outputs.go-cache }} + + echo Go environment variables json: + jq . <<< '${{ steps.setup-go.outputs.go-env }}' diff --git a/__tests__/setup-go.test.ts b/__tests__/setup-go.test.ts index 70f2166eb..7123b3811 100644 --- a/__tests__/setup-go.test.ts +++ b/__tests__/setup-go.test.ts @@ -138,6 +138,29 @@ describe('setup-go', () => { expect(main.parseGoVersion(goVersionOutput)).toBe('1.16.6'); }); + it('can read go env variables', async () => { + const goRoot = '/opt/hostedtoolcache/go/1.18.10/x64'; + const goPath = '/home/runner/go'; + const goModCache = '/home/runner/go/pkg/mod'; + const goCache = '/home/runner/.cache/go-build'; + const goVersion = 'go1.18.10'; + + const env = ` +GOROOT="${goRoot}" +GOPATH="${goPath}" +GOMODCACHE="${goModCache}" +GOCACHE="${goCache}" +GOVERSION="${goVersion}" + `; + const json = JSON.parse(main.convertEnvStringToJson(env)); + expect(json).toBeDefined(); + expect(json['GOROOT']).toBe(goRoot); + expect(json['GOPATH']).toBe(goPath); + expect(json['GOMODCACHE']).toBe(goModCache); + expect(json['GOCACHE']).toBe(goCache); + expect(json['GOVERSION']).toBe(goVersion); + }); + it('can find 1.9.7 from manifest on osx', async () => { os.platform = 'darwin'; os.arch = 'x64'; diff --git a/action.yml b/action.yml index 9946e476e..2735dacf7 100644 --- a/action.yml +++ b/action.yml @@ -22,6 +22,18 @@ inputs: outputs: go-version: description: 'The installed Go version. Useful when given a version range as input.' + go-cache: + description: 'The GOCACHE environment variable' + go-path: + description: 'The GOPATH environment variable' + go-root: + description: 'The GOROOT environment variable' + go-mod: + description: 'The GOMOD environment variable' + go-mod-cache: + description: 'The GOMODCACHE environment variable' + go-env: + description: 'The Go environment variables in JSON format' cache-hit: description: 'A boolean value to indicate if a cache was hit' runs: diff --git a/dist/setup/index.js b/dist/setup/index.js index 25798ccb6..d5f05e8d3 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -61770,7 +61770,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.parseGoVersion = exports.addBinToPath = exports.run = void 0; +exports.convertEnvStringToJson = exports.parseGoVersion = exports.addBinToPath = exports.run = void 0; const core = __importStar(__nccwpck_require__(2186)); const io = __importStar(__nccwpck_require__(7436)); const installer = __importStar(__nccwpck_require__(2574)); @@ -61818,11 +61818,19 @@ function run() { core.debug(`add bin ${added}`); const goPath = yield io.which('go'); const goVersion = (child_process_1.default.execSync(`${goPath} version`) || '').toString(); + const goEnv = (child_process_1.default.execSync(`${goPath} env`) || '').toString(); + const goEnvJson = JSON.parse(convertEnvStringToJson(goEnv)); + const parsedGoVersion = parseGoVersion(goVersion); + // Go versions less that 1.16 do not have the GOVERSION environment variable + if (semver.lt(parsedGoVersion, '1.16.0')) { + goEnvJson['GOVERSION'] = 'go' + parsedGoVersion; + } + core.info(goVersion); if (cache && cache_utils_1.isCacheFeatureAvailable()) { const packageManager = 'default'; const cacheDependencyPath = core.getInput('cache-dependency-path'); try { - yield cache_restore_1.restoreCache(parseGoVersion(goVersion), packageManager, cacheDependencyPath); + yield cache_restore_1.restoreCache(parsedGoVersion, packageManager, cacheDependencyPath); } catch (error) { core.warning(`Restore cache failed: ${error.message}`); @@ -61831,11 +61839,12 @@ function run() { // add problem matchers const matchersPath = path_1.default.join(__dirname, '../..', 'matchers.json'); core.info(`##[add-matcher]${matchersPath}`); - // output the version actually being used - core.info(goVersion); - core.setOutput('go-version', parseGoVersion(goVersion)); + core.setOutput('go-version', parsedGoVersion); + core.setOutput('go-path', goEnvJson['GOPATH']); + core.setOutput('go-cache', goEnvJson['GOCACHE']); + core.setOutput('go-mod-cache', goEnvJson['GOMODCACHE']); + core.setOutput('go-env', goEnvJson); core.startGroup('go env'); - const goEnv = (child_process_1.default.execSync(`${goPath} env`) || '').toString(); core.info(goEnv); core.endGroup(); } @@ -61883,6 +61892,16 @@ function parseGoVersion(versionString) { return versionString.split(' ')[2].slice('go'.length); } exports.parseGoVersion = parseGoVersion; +function convertEnvStringToJson(envString) { + const envArray = envString.split('\n'); + const envObject = {}; + envArray.forEach(envVar => { + const [key, value] = envVar.split(/=(?=")/); + envObject[key] = value === null || value === void 0 ? void 0 : value.replace(/"/g, ''); + }); + return JSON.stringify(envObject); +} +exports.convertEnvStringToJson = convertEnvStringToJson; function resolveVersionInput() { let version = core.getInput('go-version'); const versionFilePath = core.getInput('go-version-file'); diff --git a/src/main.ts b/src/main.ts index d3fb857df..bf2128692 100644 --- a/src/main.ts +++ b/src/main.ts @@ -63,13 +63,23 @@ export async function run() { const goPath = await io.which('go'); const goVersion = (cp.execSync(`${goPath} version`) || '').toString(); + const goEnv = (cp.execSync(`${goPath} env`) || '').toString(); + const goEnvJson = JSON.parse(convertEnvStringToJson(goEnv)); + const parsedGoVersion = parseGoVersion(goVersion); + + // Go versions less that 1.16 do not have the GOVERSION environment variable + if (semver.lt(parsedGoVersion, '1.16.0')) { + goEnvJson['GOVERSION'] = 'go' + parsedGoVersion; + } + + core.info(goVersion); if (cache && isCacheFeatureAvailable()) { const packageManager = 'default'; const cacheDependencyPath = core.getInput('cache-dependency-path'); try { await restoreCache( - parseGoVersion(goVersion), + parsedGoVersion, packageManager, cacheDependencyPath ); @@ -82,13 +92,13 @@ export async function run() { const matchersPath = path.join(__dirname, '../..', 'matchers.json'); core.info(`##[add-matcher]${matchersPath}`); - // output the version actually being used - core.info(goVersion); - - core.setOutput('go-version', parseGoVersion(goVersion)); + core.setOutput('go-version', parsedGoVersion); + core.setOutput('go-path', goEnvJson['GOPATH']); + core.setOutput('go-cache', goEnvJson['GOCACHE']); + core.setOutput('go-mod-cache', goEnvJson['GOMODCACHE']); + core.setOutput('go-env', goEnvJson); core.startGroup('go env'); - const goEnv = (cp.execSync(`${goPath} env`) || '').toString(); core.info(goEnv); core.endGroup(); } catch (error) { @@ -135,6 +145,18 @@ export function parseGoVersion(versionString: string): string { return versionString.split(' ')[2].slice('go'.length); } +export function convertEnvStringToJson(envString: string): string { + const envArray = envString.split('\n'); + const envObject: {[key: string]: string} = {}; + + envArray.forEach(envVar => { + const [key, value] = envVar.split(/=(?=")/); + envObject[key] = value?.replace(/"/g, ''); + }); + + return JSON.stringify(envObject); +} + function resolveVersionInput(): string { let version = core.getInput('go-version'); const versionFilePath = core.getInput('go-version-file');