setup-go/src/main.ts

98 lines
2.6 KiB
TypeScript
Raw Normal View History

2020-02-09 00:21:39 -05:00
import * as core from '@actions/core';
2020-03-26 12:40:41 -04:00
import * as io from '@actions/io';
2020-02-09 00:21:39 -05:00
import * as tc from '@actions/tool-cache';
import * as installer from './installer';
2020-03-27 00:55:12 -04:00
import path from 'path';
import cp from 'child_process';
import fs from 'fs';
2020-02-09 00:21:39 -05: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 08:47:38 -05:00
2020-02-09 08:44:32 -05:00
// stable will be true unless false is the exact input
// since getting unstable versions should be explicit
2020-02-10 15:21:04 -05:00
let stable = (core.getInput('stable') || 'true').toUpperCase() === 'TRUE';
2020-02-09 00:21:39 -05:00
2020-02-09 22:39:44 -05:00
console.log(
`Setup go ${stable ? 'stable' : ''} version spec ${versionSpec}`
);
2020-02-09 00:21:39 -05:00
if (versionSpec) {
2020-02-09 00:29:21 -05:00
let installDir: string | undefined = tc.find('go', versionSpec);
2020-02-09 00:21:39 -05:00
2020-02-09 00:29:21 -05:00
if (!installDir) {
2020-02-09 22:39:44 -05:00
console.log(
`A version satisfying ${versionSpec} not found locally, attempting to download ...`
);
2020-02-09 00:29:21 -05:00
installDir = await installer.downloadGo(versionSpec, stable);
2020-02-09 22:42:10 -05:00
console.log('Installed');
2020-02-09 00:29:21 -05:00
}
if (installDir) {
core.exportVariable('GOROOT', installDir);
core.addPath(path.join(installDir, 'bin'));
2020-02-09 22:42:10 -05:00
console.log('Added go to the path');
2020-03-26 12:02:52 -04:00
2020-03-26 13:46:15 -04:00
let added = addBinToPath();
core.debug(`add bin ${added}`);
2020-02-09 00:29:21 -05:00
} else {
throw new Error(
`Could not find a version that satisfied version spec: ${versionSpec}`
);
}
2020-02-09 00:21:39 -05:00
}
// add problem matchers
const matchersPath = path.join(__dirname, '..', 'matchers.json');
console.log(`##[add-matcher]${matchersPath}`);
2020-03-31 10:32:03 -04:00
// output the version actually being used
let goPath = await io.which('go');
2020-03-31 10:40:32 -04:00
let goVersion = (cp.execSync(`${goPath} version`) || '').toString();
2020-03-31 10:32:03 -04:00
2020-03-31 10:37:33 -04:00
console.log(goVersion);
2020-02-09 00:21:39 -05:00
} catch (error) {
core.setFailed(error.message);
}
2020-02-09 00:29:21 -05:00
}
2020-03-26 12:02:52 -04:00
2020-03-27 00:55:12 -04:00
export async function addBinToPath(): Promise<boolean> {
2020-03-26 12:02:52 -04:00
let added = false;
2020-03-26 12:40:41 -04:00
let g = await io.which('go');
2020-03-27 00:55:12 -04:00
_debug(`which go :${g}:`);
2020-03-26 12:40:41 -04:00
if (!g) {
2020-03-27 00:55:12 -04:00
_debug('go not in the path');
2020-03-26 12:40:41 -04:00
return added;
}
2020-03-26 12:17:32 -04:00
2020-03-26 12:40:41 -04:00
let buf = cp.execSync('go env GOPATH');
2020-03-26 12:02:52 -04:00
if (buf) {
2020-03-26 12:40:41 -04:00
let gp = buf.toString().trim();
2020-03-27 00:55:12 -04:00
_debug(`go env GOPATH :${gp}:`);
if (!fs.existsSync(gp)) {
// some of the hosted images have go install but not profile dir
2020-03-27 00:55:12 -04:00
_debug(`creating ${gp}`);
io.mkdirP(gp);
}
2020-03-26 12:23:38 -04:00
let bp = path.join(gp, 'bin');
if (!fs.existsSync(bp)) {
2020-03-27 00:55:12 -04:00
_debug(`creating ${bp}`);
io.mkdirP(bp);
2020-03-26 12:54:21 -04:00
}
core.addPath(bp);
added = true;
2020-03-26 12:02:52 -04:00
}
return added;
}
2020-03-27 00:55:12 -04:00
export function _debug(message: string) {
core.debug(message);
}