Skip to content

Commit 2c81452

Browse files
committed
Add JSON output of go env and some env as strings
Additional outputs are: - GOPATH as `go-path` string - GOROOT as `go-root` string - GOMOD as `go-mod` string - GOCACHE as `go-cache` string - GOMODCACHE as `go-mod-cache` string - `go env` as `go-env` JSON
1 parent c51a720 commit 2c81452

File tree

5 files changed

+112
-12
lines changed

5 files changed

+112
-12
lines changed

.github/workflows/outputs.yml

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Test outputs
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
pull_request:
8+
9+
jobs:
10+
setup-go-env:
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v3
14+
- id: setup-go
15+
uses: ./
16+
- run: |
17+
echo GOPATH=${{ steps.setup-go.outputs.go-path }}
18+
echo GOROOT=${{ steps.setup-go.outputs.go-root }}
19+
echo GOMOD=${{ steps.setup-go.outputs.go-mod }}
20+
echo GOMODCACHE=${{ steps.setup-go.outputs.go-mod-cache }}
21+
echo GOVERSION=${{ steps.setup-go.outputs.go-version }}
22+
23+
echo Go environment variables json:
24+
jq . <<< '${{ steps.setup-go.outputs.go-env }}'

__tests__/setup-go.test.ts

+23
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,29 @@ describe('setup-go', () => {
129129
expect(main.parseGoVersion(goVersionOutput)).toBe('1.16.6');
130130
});
131131

132+
it('can read go env variables', async () => {
133+
const goRoot = '/opt/hostedtoolcache/go/1.18.10/x64';
134+
const goPath = '/home/runner/go';
135+
const goModCache = '/home/runner/go/pkg/mod';
136+
const goCache = '/home/runner/.cache/go-build';
137+
const goVersion = 'go1.18.10';
138+
139+
const env = `
140+
GOROOT="${goRoot}"
141+
GOPATH="${goPath}"
142+
GOMODCACHE="${goModCache}"
143+
GOCACHE="${goCache}"
144+
GOVERSION="${goVersion}"
145+
`;
146+
const json = JSON.parse(main.convertEnvStringToJson(env));
147+
expect(json).toBeDefined();
148+
expect(json['GOROOT']).toBe(goRoot);
149+
expect(json['GOPATH']).toBe(goPath);
150+
expect(json['GOMODCACHE']).toBe(goModCache);
151+
expect(json['GOCACHE']).toBe(goCache);
152+
expect(json['GOVERSION']).toBe(goVersion);
153+
});
154+
132155
it('can find 1.9.7 from manifest on osx', async () => {
133156
os.platform = 'darwin';
134157
os.arch = 'x64';

action.yml

+10
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ inputs:
2222
outputs:
2323
go-version:
2424
description: 'The installed Go version. Useful when given a version range as input.'
25+
go-path:
26+
description: 'The GOPATH environment variable'
27+
go-root:
28+
description: 'The GOROOT environment variable'
29+
go-mod:
30+
description: 'The GOMOD environment variable'
31+
go-mod-cache:
32+
description: 'The GOMODCACHE environment variable'
33+
go-env:
34+
description: 'The Go environment variables in JSON format'
2535
cache-hit:
2636
description: 'A boolean value to indicate if a cache was hit'
2737
runs:

dist/setup/index.js

+26-6
Original file line numberDiff line numberDiff line change
@@ -63566,7 +63566,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6356663566
return (mod && mod.__esModule) ? mod : { "default": mod };
6356763567
};
6356863568
Object.defineProperty(exports, "__esModule", ({ value: true }));
63569-
exports.parseGoVersion = exports.addBinToPath = exports.run = void 0;
63569+
exports.convertEnvStringToJson = exports.parseGoVersion = exports.addBinToPath = exports.run = void 0;
6357063570
const core = __importStar(__nccwpck_require__(2186));
6357163571
const io = __importStar(__nccwpck_require__(7436));
6357263572
const installer = __importStar(__nccwpck_require__(2574));
@@ -63611,11 +63611,19 @@ function run() {
6361163611
}
6361263612
const goPath = yield io.which('go');
6361363613
const goVersion = (child_process_1.default.execSync(`${goPath} version`) || '').toString();
63614+
const goEnv = (child_process_1.default.execSync(`${goPath} env`) || '').toString();
63615+
const goEnvJson = JSON.parse(convertEnvStringToJson(goEnv));
63616+
const parsedGoVersion = parseGoVersion(goVersion);
63617+
// Go versions less that 1.16 do not have the GOVERSION environment variable
63618+
if (semver.lt(parsedGoVersion, '1.16.0')) {
63619+
goEnvJson['GOVERSION'] = 'go' + parsedGoVersion;
63620+
}
63621+
core.info(goVersion);
6361463622
if (cache && cache_utils_1.isCacheFeatureAvailable()) {
6361563623
const packageManager = 'default';
6361663624
const cacheDependencyPath = core.getInput('cache-dependency-path');
6361763625
try {
63618-
yield cache_restore_1.restoreCache(parseGoVersion(goVersion), packageManager, cacheDependencyPath);
63626+
yield cache_restore_1.restoreCache(parsedGoVersion, packageManager, cacheDependencyPath);
6361963627
}
6362063628
catch (error) {
6362163629
core.warning(`Restore cache failed: ${error.message}`);
@@ -63624,11 +63632,13 @@ function run() {
6362463632
// add problem matchers
6362563633
const matchersPath = path_1.default.join(__dirname, '../..', 'matchers.json');
6362663634
core.info(`##[add-matcher]${matchersPath}`);
63627-
// output the version actually being used
63628-
core.info(goVersion);
63629-
core.setOutput('go-version', parseGoVersion(goVersion));
63635+
core.setOutput('go-version', parsedGoVersion);
63636+
core.setOutput('go-path', goEnvJson['GOPATH']);
63637+
core.setOutput('go-root', goEnvJson['GOROOT']);
63638+
core.setOutput('go-cache', goEnvJson['GOCACHE']);
63639+
core.setOutput('go-mod-cache', goEnvJson['GOMODCACHE']);
63640+
core.setOutput('go-env', goEnvJson);
6363063641
core.startGroup('go env');
63631-
const goEnv = (child_process_1.default.execSync(`${goPath} env`) || '').toString();
6363263642
core.info(goEnv);
6363363643
core.endGroup();
6363463644
}
@@ -63676,6 +63686,16 @@ function parseGoVersion(versionString) {
6367663686
return versionString.split(' ')[2].slice('go'.length);
6367763687
}
6367863688
exports.parseGoVersion = parseGoVersion;
63689+
function convertEnvStringToJson(envString) {
63690+
const envArray = envString.split('\n');
63691+
const envObject = {};
63692+
envArray.forEach(envVar => {
63693+
const [key, value] = envVar.split(/=(?=")/);
63694+
envObject[key] = value === null || value === void 0 ? void 0 : value.replace(/"/g, '');
63695+
});
63696+
return JSON.stringify(envObject);
63697+
}
63698+
exports.convertEnvStringToJson = convertEnvStringToJson;
6367963699
function resolveVersionInput() {
6368063700
let version = core.getInput('go-version');
6368163701
const versionFilePath = core.getInput('go-version-file');

src/main.ts

+29-6
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,23 @@ export async function run() {
5858

5959
const goPath = await io.which('go');
6060
const goVersion = (cp.execSync(`${goPath} version`) || '').toString();
61+
const goEnv = (cp.execSync(`${goPath} env`) || '').toString();
62+
const goEnvJson = JSON.parse(convertEnvStringToJson(goEnv));
63+
const parsedGoVersion = parseGoVersion(goVersion);
64+
65+
// Go versions less that 1.16 do not have the GOVERSION environment variable
66+
if (semver.lt(parsedGoVersion, '1.16.0')) {
67+
goEnvJson['GOVERSION'] = 'go' + parsedGoVersion;
68+
}
69+
70+
core.info(goVersion);
6171

6272
if (cache && isCacheFeatureAvailable()) {
6373
const packageManager = 'default';
6474
const cacheDependencyPath = core.getInput('cache-dependency-path');
6575
try {
6676
await restoreCache(
67-
parseGoVersion(goVersion),
77+
parsedGoVersion,
6878
packageManager,
6979
cacheDependencyPath
7080
);
@@ -77,13 +87,14 @@ export async function run() {
7787
const matchersPath = path.join(__dirname, '../..', 'matchers.json');
7888
core.info(`##[add-matcher]${matchersPath}`);
7989

80-
// output the version actually being used
81-
core.info(goVersion);
82-
83-
core.setOutput('go-version', parseGoVersion(goVersion));
90+
core.setOutput('go-version', parsedGoVersion);
91+
core.setOutput('go-path', goEnvJson['GOPATH']);
92+
core.setOutput('go-root', goEnvJson['GOROOT']);
93+
core.setOutput('go-cache', goEnvJson['GOCACHE']);
94+
core.setOutput('go-mod-cache', goEnvJson['GOMODCACHE']);
95+
core.setOutput('go-env', goEnvJson);
8496

8597
core.startGroup('go env');
86-
const goEnv = (cp.execSync(`${goPath} env`) || '').toString();
8798
core.info(goEnv);
8899
core.endGroup();
89100
} catch (error) {
@@ -130,6 +141,18 @@ export function parseGoVersion(versionString: string): string {
130141
return versionString.split(' ')[2].slice('go'.length);
131142
}
132143

144+
export function convertEnvStringToJson(envString: string): string {
145+
const envArray = envString.split('\n');
146+
const envObject: {[key: string]: string} = {};
147+
148+
envArray.forEach(envVar => {
149+
const [key, value] = envVar.split(/=(?=")/);
150+
envObject[key] = value?.replace(/"/g, '');
151+
});
152+
153+
return JSON.stringify(envObject);
154+
}
155+
133156
function resolveVersionInput(): string {
134157
let version = core.getInput('go-version');
135158
const versionFilePath = core.getInput('go-version-file');

0 commit comments

Comments
 (0)