setup-go/src/main.ts

181 lines
5 KiB
TypeScript
Raw Normal View History

2020-02-09 05:21:39 +00:00
import * as core from '@actions/core';
2020-03-26 16:40:41 +00:00
import * as io from '@actions/io';
2020-02-09 05:21:39 +00:00
import * as installer from './installer';
2022-03-14 16:21:30 +00:00
import * as semver from 'semver';
2020-03-27 04:55:12 +00:00
import path from 'path';
2023-09-15 21:43:13 +01:00
import {restoreBuildCache, restoreModCache} from './cache-restore';
import {
getBuildDependenciesPath,
getModDependenciesPath,
isCacheFeatureAvailable,
needBuildCache,
needModCache
} from './cache-utils';
2020-03-27 04:55:12 +00:00
import cp from 'child_process';
import fs from 'fs';
2022-08-12 11:29:48 +01:00
import os from 'os';
2020-02-09 05:21:39 +00: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.
//
2022-05-12 09:04:39 +01:00
const versionSpec = resolveVersionInput();
2020-02-09 13:47:38 +00:00
core.info(`Setup go version spec ${versionSpec}`);
2020-02-10 03:39:44 +00:00
2022-08-12 11:29:48 +01:00
let arch = core.getInput('architecture');
if (!arch) {
arch = os.arch();
}
2020-02-09 05:21:39 +00:00
if (versionSpec) {
const token = core.getInput('token');
const auth = !token ? undefined : `token ${token}`;
2020-02-09 05:21:39 +00:00
const checkLatest = core.getBooleanInput('check-latest');
2022-08-12 11:29:48 +01:00
const installDir = await installer.getGo(
versionSpec,
checkLatest,
auth,
arch
);
2020-02-09 05:29:21 +00:00
const installDirVersion = path.basename(path.dirname(installDir));
core.addPath(path.join(installDir, 'bin'));
core.info('Added go to the path');
2020-03-26 16:02:52 +00:00
const version = installer.makeSemver(installDirVersion);
2022-03-14 16:21:30 +00:00
// Go versions less than 1.9 require GOROOT to be set
if (semver.lt(version, '1.9.0')) {
2022-03-14 16:23:03 +00:00
core.info('Setting GOROOT for Go version < 1.9');
2022-03-14 16:21:30 +00:00
core.exportVariable('GOROOT', installDir);
}
2022-05-03 13:43:40 +01:00
core.info(`Successfully set up Go version ${versionSpec}`);
} else {
core.info(
'[warning]go-version input was not specified. The action will try to use pre-installed version.'
);
2020-02-09 05:21:39 +00:00
}
const added = await addBinToPath();
core.debug(`add bin ${added}`);
const goPath = await io.which('go');
const goVersion = (cp.execSync(`${goPath} version`) || '').toString();
2023-01-20 00:28:58 +00:00
2023-09-15 21:43:13 +01:00
const cacheFeatureAvailable = isCacheFeatureAvailable()
if (needModCache() && cacheFeatureAvailable) {
const packageManager = 'default';
2023-09-15 21:43:13 +01:00
const cacheDependencyPath = getModDependenciesPath()
try {
2023-09-15 21:43:13 +01:00
await restoreModCache(
parseGoVersion(goVersion),
packageManager,
cacheDependencyPath
);
} catch (error) {
2023-09-15 21:43:13 +01:00
core.warning(`Restore modules cache failed: ${error.message}`);
}
}
if (needBuildCache() && cacheFeatureAvailable) {
const cacheBuildPath = getBuildDependenciesPath()
try {
await restoreBuildCache(
parseGoVersion(goVersion),
cacheBuildPath
);
} catch (error) {
core.warning(`Restore modules cache failed: ${error.message}`);
}
}
2020-02-09 05:21:39 +00:00
// add problem matchers
const matchersPath = path.join(__dirname, '../..', 'matchers.json');
core.info(`##[add-matcher]${matchersPath}`);
2020-03-31 15:32:03 +01:00
// output the version actually being used
core.info(goVersion);
2020-04-06 13:42:55 +01:00
core.setOutput('go-version', parseGoVersion(goVersion));
2020-04-06 13:42:55 +01:00
core.startGroup('go env');
const goEnv = (cp.execSync(`${goPath} env`) || '').toString();
core.info(goEnv);
2020-04-06 13:42:55 +01:00
core.endGroup();
2020-02-09 05:21:39 +00:00
} catch (error) {
core.setFailed(error.message);
}
2020-02-09 05:29:21 +00:00
}
2020-03-26 16:02:52 +00:00
2020-03-27 04:55:12 +00:00
export async function addBinToPath(): Promise<boolean> {
2020-03-26 16:02:52 +00:00
let added = false;
const g = await io.which('go');
core.debug(`which go :${g}:`);
2020-03-26 16:40:41 +00:00
if (!g) {
core.debug('go not in the path');
2020-03-26 16:40:41 +00:00
return added;
}
2020-03-26 16:17:32 +00:00
const buf = cp.execSync('go env GOPATH');
2022-04-17 16:36:51 +01:00
if (buf.length > 1) {
const gp = buf.toString().trim();
core.debug(`go env GOPATH :${gp}:`);
if (!fs.existsSync(gp)) {
2023-09-15 21:43:13 +01:00
// some of hosted images have go install but not profile dir
core.debug(`creating ${gp}`);
2022-03-28 10:54:44 +01:00
await io.mkdirP(gp);
}
2020-03-26 16:23:38 +00:00
const bp = path.join(gp, 'bin');
if (!fs.existsSync(bp)) {
core.debug(`creating ${bp}`);
2022-03-28 10:54:44 +01:00
await io.mkdirP(bp);
2020-03-26 16:54:21 +00:00
}
core.addPath(bp);
added = true;
2020-03-26 16:02:52 +00:00
}
return added;
}
2020-03-27 04:55:12 +00: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);
}
2022-05-12 09:04:39 +01:00
function resolveVersionInput(): string {
let version = core.getInput('go-version');
const versionFilePath = core.getInput('go-version-file');
if (version && versionFilePath) {
core.warning(
'Both go-version and go-version-file inputs are specified, only go-version will be used'
);
}
if (version) {
return version;
}
if (versionFilePath) {
if (!fs.existsSync(versionFilePath)) {
throw new Error(
`The specified go version file at: ${versionFilePath} does not exist`
);
}
version = installer.parseGoVersionFile(versionFilePath);
}
return version;
}