|
|
|
@ -1276,9 +1276,12 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const core = __importStar(__webpack_require__(470));
|
|
|
|
|
const io = __importStar(__webpack_require__(1));
|
|
|
|
|
const tc = __importStar(__webpack_require__(533));
|
|
|
|
|
const installer = __importStar(__webpack_require__(749));
|
|
|
|
|
const path = __importStar(__webpack_require__(622));
|
|
|
|
|
const cp = __importStar(__webpack_require__(129));
|
|
|
|
|
const fs = __importStar(__webpack_require__(747));
|
|
|
|
|
function run() {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
try {
|
|
|
|
@ -1302,6 +1305,8 @@ function run() {
|
|
|
|
|
core.exportVariable('GOROOT', installDir);
|
|
|
|
|
core.addPath(path.join(installDir, 'bin'));
|
|
|
|
|
console.log('Added go to the path');
|
|
|
|
|
let added = addBinToPath();
|
|
|
|
|
core.debug(`add bin ${added}`);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
throw new Error(`Could not find a version that satisfied version spec: ${versionSpec}`);
|
|
|
|
@ -1317,6 +1322,35 @@ function run() {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
exports.run = run;
|
|
|
|
|
function addBinToPath() {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
let added = false;
|
|
|
|
|
let g = yield io.which('go');
|
|
|
|
|
core.debug(`which go :${g}:`);
|
|
|
|
|
if (!g) {
|
|
|
|
|
core.debug('go not in the path');
|
|
|
|
|
return added;
|
|
|
|
|
}
|
|
|
|
|
let buf = cp.execSync('go env GOPATH');
|
|
|
|
|
if (buf) {
|
|
|
|
|
let gp = buf.toString().trim();
|
|
|
|
|
core.debug(`go env GOPATH :${gp}:`);
|
|
|
|
|
if (!fs.existsSync(gp)) {
|
|
|
|
|
// some of the hosted images have go install but not profile dir
|
|
|
|
|
core.debug(`creating ${gp}`);
|
|
|
|
|
io.mkdirP(gp);
|
|
|
|
|
}
|
|
|
|
|
let bp = path.join(gp, 'bin');
|
|
|
|
|
if (!fs.existsSync(bp)) {
|
|
|
|
|
core.debug(`creating ${bp}`);
|
|
|
|
|
io.mkdirP(bp);
|
|
|
|
|
}
|
|
|
|
|
core.addPath(bp);
|
|
|
|
|
added = true;
|
|
|
|
|
}
|
|
|
|
|
return added;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
@ -3279,9 +3313,12 @@ const os = __importStar(__webpack_require__(87));
|
|
|
|
|
const path = __importStar(__webpack_require__(622));
|
|
|
|
|
const httpm = __importStar(__webpack_require__(539));
|
|
|
|
|
const semver = __importStar(__webpack_require__(280));
|
|
|
|
|
const stream = __importStar(__webpack_require__(794));
|
|
|
|
|
const util = __importStar(__webpack_require__(669));
|
|
|
|
|
const v4_1 = __importDefault(__webpack_require__(826));
|
|
|
|
|
const exec_1 = __webpack_require__(986);
|
|
|
|
|
const assert_1 = __webpack_require__(357);
|
|
|
|
|
const retry_helper_1 = __webpack_require__(979);
|
|
|
|
|
class HTTPError extends Error {
|
|
|
|
|
constructor(httpStatusCode) {
|
|
|
|
|
super(`Unexpected HTTP response: ${httpStatusCode}`);
|
|
|
|
@ -3292,31 +3329,6 @@ class HTTPError extends Error {
|
|
|
|
|
exports.HTTPError = HTTPError;
|
|
|
|
|
const IS_WINDOWS = process.platform === 'win32';
|
|
|
|
|
const userAgent = 'actions/tool-cache';
|
|
|
|
|
// On load grab temp directory and cache directory and remove them from env (currently don't want to expose this)
|
|
|
|
|
let tempDirectory = process.env['RUNNER_TEMP'] || '';
|
|
|
|
|
let cacheRoot = process.env['RUNNER_TOOL_CACHE'] || '';
|
|
|
|
|
// If directories not found, place them in common temp locations
|
|
|
|
|
if (!tempDirectory || !cacheRoot) {
|
|
|
|
|
let baseLocation;
|
|
|
|
|
if (IS_WINDOWS) {
|
|
|
|
|
// On windows use the USERPROFILE env variable
|
|
|
|
|
baseLocation = process.env['USERPROFILE'] || 'C:\\';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
if (process.platform === 'darwin') {
|
|
|
|
|
baseLocation = '/Users';
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
baseLocation = '/home';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!tempDirectory) {
|
|
|
|
|
tempDirectory = path.join(baseLocation, 'actions', 'temp');
|
|
|
|
|
}
|
|
|
|
|
if (!cacheRoot) {
|
|
|
|
|
cacheRoot = path.join(baseLocation, 'actions', 'cache');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Download a tool from an url and stream it into a file
|
|
|
|
|
*
|
|
|
|
@ -3326,52 +3338,71 @@ if (!tempDirectory || !cacheRoot) {
|
|
|
|
|
*/
|
|
|
|
|
function downloadTool(url, dest) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
// Wrap in a promise so that we can resolve from within stream callbacks
|
|
|
|
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
try {
|
|
|
|
|
const http = new httpm.HttpClient(userAgent, [], {
|
|
|
|
|
allowRetries: true,
|
|
|
|
|
maxRetries: 3
|
|
|
|
|
});
|
|
|
|
|
dest = dest || path.join(tempDirectory, v4_1.default());
|
|
|
|
|
dest = dest || path.join(_getTempDirectory(), v4_1.default());
|
|
|
|
|
yield io.mkdirP(path.dirname(dest));
|
|
|
|
|
core.debug(`Downloading ${url}`);
|
|
|
|
|
core.debug(`Downloading ${dest}`);
|
|
|
|
|
core.debug(`Destination ${dest}`);
|
|
|
|
|
const maxAttempts = 3;
|
|
|
|
|
const minSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MIN_SECONDS', 10);
|
|
|
|
|
const maxSeconds = _getGlobal('TEST_DOWNLOAD_TOOL_RETRY_MAX_SECONDS', 20);
|
|
|
|
|
const retryHelper = new retry_helper_1.RetryHelper(maxAttempts, minSeconds, maxSeconds);
|
|
|
|
|
return yield retryHelper.execute(() => __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
return yield downloadToolAttempt(url, dest || '');
|
|
|
|
|
}), (err) => {
|
|
|
|
|
if (err instanceof HTTPError && err.httpStatusCode) {
|
|
|
|
|
// Don't retry anything less than 500, except 408 Request Timeout and 429 Too Many Requests
|
|
|
|
|
if (err.httpStatusCode < 500 &&
|
|
|
|
|
err.httpStatusCode !== 408 &&
|
|
|
|
|
err.httpStatusCode !== 429) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// Otherwise retry
|
|
|
|
|
return true;
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
exports.downloadTool = downloadTool;
|
|
|
|
|
function downloadToolAttempt(url, dest) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
if (fs.existsSync(dest)) {
|
|
|
|
|
throw new Error(`Destination file path ${dest} already exists`);
|
|
|
|
|
}
|
|
|
|
|
// Get the response headers
|
|
|
|
|
const http = new httpm.HttpClient(userAgent, [], {
|
|
|
|
|
allowRetries: false
|
|
|
|
|
});
|
|
|
|
|
const response = yield http.get(url);
|
|
|
|
|
if (response.message.statusCode !== 200) {
|
|
|
|
|
const err = new HTTPError(response.message.statusCode);
|
|
|
|
|
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
|
|
|
|
throw err;
|
|
|
|
|
}
|
|
|
|
|
const file = fs.createWriteStream(dest);
|
|
|
|
|
file.on('open', () => __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
// Download the response body
|
|
|
|
|
const pipeline = util.promisify(stream.pipeline);
|
|
|
|
|
const responseMessageFactory = _getGlobal('TEST_DOWNLOAD_TOOL_RESPONSE_MESSAGE_FACTORY', () => response.message);
|
|
|
|
|
const readStream = responseMessageFactory();
|
|
|
|
|
let succeeded = false;
|
|
|
|
|
try {
|
|
|
|
|
const stream = response.message.pipe(file);
|
|
|
|
|
stream.on('close', () => {
|
|
|
|
|
yield pipeline(readStream, fs.createWriteStream(dest));
|
|
|
|
|
core.debug('download complete');
|
|
|
|
|
resolve(dest);
|
|
|
|
|
});
|
|
|
|
|
succeeded = true;
|
|
|
|
|
return dest;
|
|
|
|
|
}
|
|
|
|
|
finally {
|
|
|
|
|
// Error, delete dest before retry
|
|
|
|
|
if (!succeeded) {
|
|
|
|
|
core.debug('download failed');
|
|
|
|
|
try {
|
|
|
|
|
yield io.rmRF(dest);
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
core.debug(`Failed to download from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
|
|
|
|
|
reject(err);
|
|
|
|
|
core.debug(`Failed to delete '${dest}'. ${err.message}`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
file.on('error', err => {
|
|
|
|
|
file.end();
|
|
|
|
|
reject(err);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
reject(err);
|
|
|
|
|
}
|
|
|
|
|
}));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
exports.downloadTool = downloadTool;
|
|
|
|
|
/**
|
|
|
|
|
* Extract a .7z file
|
|
|
|
|
*
|
|
|
|
@ -3461,14 +3492,17 @@ function extractTar(file, dest, flags = 'xz') {
|
|
|
|
|
// Create dest
|
|
|
|
|
dest = yield _createExtractFolder(dest);
|
|
|
|
|
// Determine whether GNU tar
|
|
|
|
|
core.debug('Checking tar --version');
|
|
|
|
|
let versionOutput = '';
|
|
|
|
|
yield exec_1.exec('tar --version', [], {
|
|
|
|
|
ignoreReturnCode: true,
|
|
|
|
|
silent: true,
|
|
|
|
|
listeners: {
|
|
|
|
|
stdout: (data) => (versionOutput += data.toString()),
|
|
|
|
|
stderr: (data) => (versionOutput += data.toString())
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
core.debug(versionOutput.trim());
|
|
|
|
|
const isGnuTar = versionOutput.toUpperCase().includes('GNU TAR');
|
|
|
|
|
// Initialize args
|
|
|
|
|
const args = [flags];
|
|
|
|
@ -3629,7 +3663,7 @@ function find(toolName, versionSpec, arch) {
|
|
|
|
|
let toolPath = '';
|
|
|
|
|
if (versionSpec) {
|
|
|
|
|
versionSpec = semver.clean(versionSpec) || '';
|
|
|
|
|
const cachePath = path.join(cacheRoot, toolName, versionSpec, arch);
|
|
|
|
|
const cachePath = path.join(_getCacheDirectory(), toolName, versionSpec, arch);
|
|
|
|
|
core.debug(`checking cache: ${cachePath}`);
|
|
|
|
|
if (fs.existsSync(cachePath) && fs.existsSync(`${cachePath}.complete`)) {
|
|
|
|
|
core.debug(`Found tool in cache ${toolName} ${versionSpec} ${arch}`);
|
|
|
|
@ -3651,7 +3685,7 @@ exports.find = find;
|
|
|
|
|
function findAllVersions(toolName, arch) {
|
|
|
|
|
const versions = [];
|
|
|
|
|
arch = arch || os.arch();
|
|
|
|
|
const toolPath = path.join(cacheRoot, toolName);
|
|
|
|
|
const toolPath = path.join(_getCacheDirectory(), toolName);
|
|
|
|
|
if (fs.existsSync(toolPath)) {
|
|
|
|
|
const children = fs.readdirSync(toolPath);
|
|
|
|
|
for (const child of children) {
|
|
|
|
@ -3670,7 +3704,7 @@ function _createExtractFolder(dest) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
if (!dest) {
|
|
|
|
|
// create a temp dir
|
|
|
|
|
dest = path.join(tempDirectory, v4_1.default());
|
|
|
|
|
dest = path.join(_getTempDirectory(), v4_1.default());
|
|
|
|
|
}
|
|
|
|
|
yield io.mkdirP(dest);
|
|
|
|
|
return dest;
|
|
|
|
@ -3678,7 +3712,7 @@ function _createExtractFolder(dest) {
|
|
|
|
|
}
|
|
|
|
|
function _createToolPath(tool, version, arch) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
|
|
|
|
const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || '');
|
|
|
|
|
core.debug(`destination ${folderPath}`);
|
|
|
|
|
const markerPath = `${folderPath}.complete`;
|
|
|
|
|
yield io.rmRF(folderPath);
|
|
|
|
@ -3688,7 +3722,7 @@ function _createToolPath(tool, version, arch) {
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function _completeToolPath(tool, version, arch) {
|
|
|
|
|
const folderPath = path.join(cacheRoot, tool, semver.clean(version) || version, arch || '');
|
|
|
|
|
const folderPath = path.join(_getCacheDirectory(), tool, semver.clean(version) || version, arch || '');
|
|
|
|
|
const markerPath = `${folderPath}.complete`;
|
|
|
|
|
fs.writeFileSync(markerPath, '');
|
|
|
|
|
core.debug('finished caching tool');
|
|
|
|
@ -3725,6 +3759,31 @@ function _evaluateVersions(versions, versionSpec) {
|
|
|
|
|
}
|
|
|
|
|
return version;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Gets RUNNER_TOOL_CACHE
|
|
|
|
|
*/
|
|
|
|
|
function _getCacheDirectory() {
|
|
|
|
|
const cacheDirectory = process.env['RUNNER_TOOL_CACHE'] || '';
|
|
|
|
|
assert_1.ok(cacheDirectory, 'Expected RUNNER_TOOL_CACHE to be defined');
|
|
|
|
|
return cacheDirectory;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Gets RUNNER_TEMP
|
|
|
|
|
*/
|
|
|
|
|
function _getTempDirectory() {
|
|
|
|
|
const tempDirectory = process.env['RUNNER_TEMP'] || '';
|
|
|
|
|
assert_1.ok(tempDirectory, 'Expected RUNNER_TEMP to be defined');
|
|
|
|
|
return tempDirectory;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Gets a global variable
|
|
|
|
|
*/
|
|
|
|
|
function _getGlobal(key, defaultValue) {
|
|
|
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
|
|
|
const value = global[key];
|
|
|
|
|
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
|
|
|
return value !== undefined ? value : defaultValue;
|
|
|
|
|
}
|
|
|
|
|
//# sourceMappingURL=tool-cache.js.map
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
@ -4601,7 +4660,7 @@ function downloadGo(versionSpec, stable) {
|
|
|
|
|
core_1.debug(`extracted to ${extPath}`);
|
|
|
|
|
// extracts with a root folder that matches the fileName downloaded
|
|
|
|
|
const toolRoot = path.join(extPath, 'go');
|
|
|
|
|
toolPath = yield tc.cacheDir(toolRoot, 'go', versionSpec);
|
|
|
|
|
toolPath = yield tc.cacheDir(toolRoot, 'go', makeSemver(match.version));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (error) {
|
|
|
|
@ -4684,6 +4743,13 @@ function makeSemver(version) {
|
|
|
|
|
exports.makeSemver = makeSemver;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
|
|
|
|
/***/ 794:
|
|
|
|
|
/***/ (function(module) {
|
|
|
|
|
|
|
|
|
|
module.exports = require("stream");
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
|
|
|
|
/***/ 826:
|
|
|
|
@ -4792,6 +4858,83 @@ function checkBypass(reqUrl) {
|
|
|
|
|
exports.checkBypass = checkBypass;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
|
|
|
|
/***/ 979:
|
|
|
|
|
/***/ (function(__unusedmodule, exports, __webpack_require__) {
|
|
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
|
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
|
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
|
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
|
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
|
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
|
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
|
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
|
|
if (mod && mod.__esModule) return mod;
|
|
|
|
|
var result = {};
|
|
|
|
|
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
|
|
|
result["default"] = mod;
|
|
|
|
|
return result;
|
|
|
|
|
};
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
|
|
const core = __importStar(__webpack_require__(470));
|
|
|
|
|
/**
|
|
|
|
|
* Internal class for retries
|
|
|
|
|
*/
|
|
|
|
|
class RetryHelper {
|
|
|
|
|
constructor(maxAttempts, minSeconds, maxSeconds) {
|
|
|
|
|
if (maxAttempts < 1) {
|
|
|
|
|
throw new Error('max attempts should be greater than or equal to 1');
|
|
|
|
|
}
|
|
|
|
|
this.maxAttempts = maxAttempts;
|
|
|
|
|
this.minSeconds = Math.floor(minSeconds);
|
|
|
|
|
this.maxSeconds = Math.floor(maxSeconds);
|
|
|
|
|
if (this.minSeconds > this.maxSeconds) {
|
|
|
|
|
throw new Error('min seconds should be less than or equal to max seconds');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
execute(action, isRetryable) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
let attempt = 1;
|
|
|
|
|
while (attempt < this.maxAttempts) {
|
|
|
|
|
// Try
|
|
|
|
|
try {
|
|
|
|
|
return yield action();
|
|
|
|
|
}
|
|
|
|
|
catch (err) {
|
|
|
|
|
if (isRetryable && !isRetryable(err)) {
|
|
|
|
|
throw err;
|
|
|
|
|
}
|
|
|
|
|
core.info(err.message);
|
|
|
|
|
}
|
|
|
|
|
// Sleep
|
|
|
|
|
const seconds = this.getSleepAmount();
|
|
|
|
|
core.info(`Waiting ${seconds} seconds before trying again`);
|
|
|
|
|
yield this.sleep(seconds);
|
|
|
|
|
attempt++;
|
|
|
|
|
}
|
|
|
|
|
// Last attempt
|
|
|
|
|
return yield action();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
getSleepAmount() {
|
|
|
|
|
return (Math.floor(Math.random() * (this.maxSeconds - this.minSeconds + 1)) +
|
|
|
|
|
this.minSeconds);
|
|
|
|
|
}
|
|
|
|
|
sleep(seconds) {
|
|
|
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
|
|
|
return new Promise(resolve => setTimeout(resolve, seconds * 1000));
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
exports.RetryHelper = RetryHelper;
|
|
|
|
|
//# sourceMappingURL=retry-helper.js.map
|
|
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
|
|
|
|
|
|
/***/ 986:
|
|
|
|
|