2020-02-09 13:21:39 +08:00
|
|
|
import * as core from '@actions/core';
|
2020-03-27 00:40:41 +08:00
|
|
|
import * as io from '@actions/io';
|
2020-02-09 13:21:39 +08:00
|
|
|
import * as installer from './installer';
|
2022-03-15 00:21:30 +08:00
|
|
|
import * as semver from 'semver';
|
2020-03-27 12:55:12 +08:00
|
|
|
import path from 'path';
|
|
|
|
import cp from 'child_process';
|
|
|
|
import fs from 'fs';
|
2020-06-29 23:41:13 +08:00
|
|
|
import {URL} from 'url';
|
2020-02-09 13:21:39 +08:00
|
|
|
|
|
|
|
export async function run() {
|
|
|
|
try {
|
|
|
|
//
|
|
|
|
// versionSpec is optional. If supplied, install / use from the tool cache
|
|
|
|
// If not supplied then problem matchers will still be setup. Useful for self-hosted.
|
|
|
|
//
|
|
|
|
let versionSpec = core.getInput('go-version');
|
2020-02-09 21:47:38 +08:00
|
|
|
|
2022-02-28 15:16:32 +08:00
|
|
|
core.info(`Setup go version spec ${versionSpec}`);
|
2020-02-10 11:39:44 +08:00
|
|
|
|
2020-02-09 13:21:39 +08:00
|
|
|
if (versionSpec) {
|
2020-06-29 23:41:13 +08:00
|
|
|
let token = core.getInput('token');
|
|
|
|
let auth = !token || isGhes() ? undefined : `token ${token}`;
|
2020-02-09 13:21:39 +08:00
|
|
|
|
2022-02-09 19:59:04 +08:00
|
|
|
const checkLatest = core.getBooleanInput('check-latest');
|
2022-02-28 15:16:32 +08:00
|
|
|
const installDir = await installer.getGo(versionSpec, checkLatest, auth);
|
2020-02-09 13:29:21 +08:00
|
|
|
|
2020-06-29 23:41:13 +08:00
|
|
|
core.addPath(path.join(installDir, 'bin'));
|
|
|
|
core.info('Added go to the path');
|
2020-03-27 00:02:52 +08:00
|
|
|
|
2022-03-15 00:21:30 +08:00
|
|
|
const version = installer.makeSemver(versionSpec);
|
|
|
|
// Go versions less than 1.9 require GOROOT to be set
|
|
|
|
if (semver.lt(version, '1.9.0')) {
|
2022-03-15 00:23:03 +08:00
|
|
|
core.info('Setting GOROOT for Go version < 1.9');
|
2022-03-15 00:21:30 +08:00
|
|
|
core.exportVariable('GOROOT', installDir);
|
|
|
|
}
|
|
|
|
|
2020-06-29 23:41:13 +08:00
|
|
|
let added = await addBinToPath();
|
|
|
|
core.debug(`add bin ${added}`);
|
2022-05-03 20:43:40 +08:00
|
|
|
core.info(`Successfully set up Go version ${versionSpec}`);
|
2020-02-09 13:21:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// add problem matchers
|
|
|
|
const matchersPath = path.join(__dirname, '..', 'matchers.json');
|
2020-06-29 23:41:13 +08:00
|
|
|
core.info(`##[add-matcher]${matchersPath}`);
|
2020-03-31 22:32:03 +08:00
|
|
|
|
|
|
|
// output the version actually being used
|
|
|
|
let goPath = await io.which('go');
|
2020-03-31 22:40:32 +08:00
|
|
|
let goVersion = (cp.execSync(`${goPath} version`) || '').toString();
|
2020-06-29 23:41:13 +08:00
|
|
|
core.info(goVersion);
|
2020-04-06 20:42:55 +08:00
|
|
|
|
2022-04-09 00:23:10 +08:00
|
|
|
core.setOutput('go-version', parseGoVersion(goVersion));
|
|
|
|
|
2020-04-06 20:42:55 +08:00
|
|
|
core.startGroup('go env');
|
|
|
|
let goEnv = (cp.execSync(`${goPath} env`) || '').toString();
|
2020-06-29 23:41:13 +08:00
|
|
|
core.info(goEnv);
|
2020-04-06 20:42:55 +08:00
|
|
|
core.endGroup();
|
2020-02-09 13:21:39 +08:00
|
|
|
} catch (error) {
|
|
|
|
core.setFailed(error.message);
|
|
|
|
}
|
2020-02-09 13:29:21 +08:00
|
|
|
}
|
2020-03-27 00:02:52 +08:00
|
|
|
|
2020-03-27 12:55:12 +08:00
|
|
|
export async function addBinToPath(): Promise<boolean> {
|
2020-03-27 00:02:52 +08:00
|
|
|
let added = false;
|
2020-03-27 00:40:41 +08:00
|
|
|
let g = await io.which('go');
|
2020-06-29 23:41:13 +08:00
|
|
|
core.debug(`which go :${g}:`);
|
2020-03-27 00:40:41 +08:00
|
|
|
if (!g) {
|
2020-06-29 23:41:13 +08:00
|
|
|
core.debug('go not in the path');
|
2020-03-27 00:40:41 +08:00
|
|
|
return added;
|
|
|
|
}
|
2020-03-27 00:17:32 +08:00
|
|
|
|
2020-03-27 00:40:41 +08:00
|
|
|
let buf = cp.execSync('go env GOPATH');
|
2022-04-17 23:36:51 +08:00
|
|
|
if (buf.length > 1) {
|
2020-03-27 00:40:41 +08:00
|
|
|
let gp = buf.toString().trim();
|
2020-06-29 23:41:13 +08:00
|
|
|
core.debug(`go env GOPATH :${gp}:`);
|
2020-03-27 01:00:45 +08:00
|
|
|
if (!fs.existsSync(gp)) {
|
|
|
|
// some of the hosted images have go install but not profile dir
|
2020-06-29 23:41:13 +08:00
|
|
|
core.debug(`creating ${gp}`);
|
2022-03-28 17:54:44 +08:00
|
|
|
await io.mkdirP(gp);
|
2020-03-27 01:00:45 +08:00
|
|
|
}
|
2020-03-27 00:23:38 +08:00
|
|
|
|
2020-03-27 01:00:45 +08:00
|
|
|
let bp = path.join(gp, 'bin');
|
|
|
|
if (!fs.existsSync(bp)) {
|
2020-06-29 23:41:13 +08:00
|
|
|
core.debug(`creating ${bp}`);
|
2022-03-28 17:54:44 +08:00
|
|
|
await io.mkdirP(bp);
|
2020-03-27 00:54:21 +08:00
|
|
|
}
|
2020-03-27 01:00:45 +08:00
|
|
|
|
|
|
|
core.addPath(bp);
|
|
|
|
added = true;
|
2020-03-27 00:02:52 +08:00
|
|
|
}
|
|
|
|
return added;
|
|
|
|
}
|
2020-03-27 12:55:12 +08:00
|
|
|
|
2020-06-29 23:41:13 +08:00
|
|
|
function isGhes(): boolean {
|
|
|
|
const ghUrl = new URL(
|
|
|
|
process.env['GITHUB_SERVER_URL'] || 'https://github.com'
|
|
|
|
);
|
|
|
|
return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM';
|
2020-03-27 12:55:12 +08:00
|
|
|
}
|
2022-04-09 00:23:10 +08:00
|
|
|
|
|
|
|
export function parseGoVersion(versionString: string): string {
|
|
|
|
// get the installed version as an Action output
|
|
|
|
// based on go/src/cmd/go/internal/version/version.go:
|
|
|
|
// fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
|
|
|
|
// expecting go<version> for runtime.Version()
|
|
|
|
return versionString.split(' ')[2].slice('go'.length);
|
|
|
|
}
|