diff --git a/lib/run.js b/lib/run.js index 550c95f..c7d06d9 100644 --- a/lib/run.js +++ b/lib/run.js @@ -1,6 +1,25 @@ "use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; 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) { @@ -10,24 +29,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge 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 os = __importStar(require("os")); const path = __importStar(require("path")); const util = __importStar(require("util")); const fs = __importStar(require("fs")); -const semver = __importStar(require("semver")); const toolCache = __importStar(require("@actions/tool-cache")); const core = __importStar(require("@actions/core")); +const graphql_1 = require("@octokit/graphql"); const helmToolName = 'helm'; const stableHelmVersion = 'v3.2.1'; -const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'; +const LATEST_HELM2_VERSION = '2.*'; +const LATEST_HELM3_VERSION = '3.*'; function getExecutableExtension() { if (os.type().match(/^Win/)) { return '.exe'; @@ -45,32 +58,6 @@ function getHelmDownloadURL(version) { return util.format('https://get.helm.sh/helm-%s-windows-amd64.zip', version); } } -function getStableHelmVersion() { - return __awaiter(this, void 0, void 0, function* () { - try { - const downloadPath = yield toolCache.downloadTool(helmAllReleasesUrl); - const responseArray = JSON.parse(fs.readFileSync(downloadPath, 'utf8').toString().trim()); - let latestHelmVersion = semver.clean(stableHelmVersion); - responseArray.forEach(response => { - if (response && response.tag_name) { - let currentHelmVerison = semver.clean(response.tag_name.toString()); - if (currentHelmVerison) { - if (currentHelmVerison.toString().indexOf('rc') == -1 && semver.gt(currentHelmVerison, latestHelmVersion)) { - //If current helm version is not a pre release and is greater than latest helm version - latestHelmVersion = currentHelmVerison; - } - } - } - }); - latestHelmVersion = "v" + latestHelmVersion; - return latestHelmVersion; - } - catch (error) { - core.warning(util.format("Cannot get the latest Helm info from %s. Error %s. Using default Helm version %s.", helmAllReleasesUrl, error, stableHelmVersion)); - } - return stableHelmVersion; - }); -} var walkSync = function (dir, filelist, fileToFind) { var files = fs.readdirSync(dir); filelist = filelist || []; @@ -90,7 +77,7 @@ var walkSync = function (dir, filelist, fileToFind) { function downloadHelm(version) { return __awaiter(this, void 0, void 0, function* () { if (!version) { - version = yield getStableHelmVersion(); + version = yield getLatestHelmVersionFor("v3"); } let cachedToolpath = toolCache.find(helmToolName, version); if (!cachedToolpath) { @@ -113,6 +100,41 @@ function downloadHelm(version) { return helmpath; }); } +function getLatestHelmVersionFor(type) { + return __awaiter(this, void 0, void 0, function* () { + const token = core.getInput('token', { 'required': true }); + try { + const { repository } = yield graphql_1.graphql(`{ + repository(name:"helm", owner:"helm") { + releases(last: 100) { + nodes { + tagName + } + } + } + }`, { + headers: { + authorization: `token ${token}` + } + }); + const releases = repository.releases.nodes.reverse(); + let latestValidRelease = releases.find(release => isValidVersion(release.tagName, type)); + if (latestValidRelease) + return latestValidRelease.tagName; + } + catch (err) { + core.warning(util.format("Error while fetching the latest Helm %s release. Error: %s. Using default Helm version %s.", type, err.toString(), stableHelmVersion)); + } + core.warning(util.format("Could not find stable release for Helm %s. Using default Helm version %s.", type, stableHelmVersion)); + return stableHelmVersion; + }); +} +// isValidVersion checks if verison matches the specified type and is a stable release +function isValidVersion(version, type) { + if (!version.toLocaleLowerCase().startsWith(type)) + return false; + return version.indexOf('rc') == -1; +} function findHelm(rootFolder) { fs.chmodSync(rootFolder, '777'); var filelist = []; @@ -127,12 +149,16 @@ function findHelm(rootFolder) { function run() { return __awaiter(this, void 0, void 0, function* () { let version = core.getInput('version', { 'required': true }); - if (version.toLocaleLowerCase() === 'latest') { - version = yield getStableHelmVersion(); + if (version.toLocaleLowerCase() === 'latest' || version === LATEST_HELM3_VERSION) { + version = yield getLatestHelmVersionFor("v3"); + } + else if (version === LATEST_HELM2_VERSION) { + version = yield getLatestHelmVersionFor("v2"); } else if (!version.toLocaleLowerCase().startsWith('v')) { version = 'v' + version; } + core.debug(util.format("Downloading %s", version)); let cachedPath = yield downloadHelm(version); try { if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) { @@ -146,4 +172,4 @@ function run() { core.setOutput('helm-path', cachedPath); }); } -run().catch(core.setFailed); +run().catch(core.setFailed); \ No newline at end of file