diff --git a/lib/run.js b/lib/run.js index 02c84478..40dd3fa2 100644 --- a/lib/run.js +++ b/lib/run.js @@ -22,11 +22,12 @@ 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 helmToolName = 'helm'; -const stableHelmVersion = 'v2.14.1'; -const helmLatestReleaseUrl = 'https://api.github.com/repos/helm/helm/releases/latest'; +const stableHelmVersion = 'v3.2.1'; +const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'; function getExecutableExtension() { if (os.type().match(/^Win/)) { return '.exe'; @@ -46,17 +47,28 @@ function getHelmDownloadURL(version) { } function getStableHelmVersion() { return __awaiter(this, void 0, void 0, function* () { - return toolCache.downloadTool(helmLatestReleaseUrl).then((downloadPath) => { - const response = JSON.parse(fs.readFileSync(downloadPath, 'utf8').toString().trim()); - if (!response.tag_name) { - return stableHelmVersion; - } - return response.tag_name; - }, (error) => { - core.debug(error); - core.warning(util.format("Failed to read latest kubectl version from stable.txt. From URL %s. Using default stable version %s", helmLatestReleaseUrl, stableHelmVersion)); - return stableHelmVersion; - }); + 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) { diff --git a/package.json b/package.json index 033ff8d1..db685ccb 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "@actions/tool-cache": "1.1.2", "@actions/io": "^1.0.0", "@actions/core": "^1.0.0", - "@actions/exec": "^1.0.0" + "@actions/exec": "^1.0.0", + "semver": "^6.1.0" }, "main": "lib/run.js", "scripts": { diff --git a/src/run.ts b/src/run.ts index fd4f7af6..46aaf43d 100644 --- a/src/run.ts +++ b/src/run.ts @@ -5,13 +5,14 @@ import * as os from 'os'; import * as path from 'path'; import * as util from 'util'; import * as fs from 'fs'; +import * as semver from 'semver'; import * as toolCache from '@actions/tool-cache'; import * as core from '@actions/core'; const helmToolName = 'helm'; -const stableHelmVersion = 'v2.14.1'; -const helmLatestReleaseUrl = 'https://api.github.com/repos/helm/helm/releases/latest'; +const stableHelmVersion = 'v3.2.1'; +const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'; function getExecutableExtension(): string { if (os.type().match(/^Win/)) { @@ -36,40 +37,48 @@ function getHelmDownloadURL(version: string): string { } async function getStableHelmVersion(): Promise { - return toolCache.downloadTool(helmLatestReleaseUrl).then((downloadPath) => { - const response = JSON.parse(fs.readFileSync(downloadPath, 'utf8').toString().trim()); - if (!response.tag_name) - { - return stableHelmVersion; - } - - return response.tag_name; - }, (error) => { - core.debug(error); - core.warning(util.format("Failed to read latest kubectl version from stable.txt. From URL %s. Using default stable version %s", helmLatestReleaseUrl, stableHelmVersion)); - return stableHelmVersion; - }); + try { + const downloadPath = await 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 walkSync = function (dir, filelist, fileToFind) { var files = fs.readdirSync(dir); filelist = filelist || []; - files.forEach(function(file) { - if (fs.statSync(path.join(dir, file)).isDirectory()) { - filelist = walkSync(path.join(dir, file), filelist, fileToFind); - } - else { - core.debug(file); - if(file == fileToFind) - { - filelist.push(path.join(dir, file)); - } - } + files.forEach(function (file) { + if (fs.statSync(path.join(dir, file)).isDirectory()) { + filelist = walkSync(path.join(dir, file), filelist, fileToFind); + } + else { + core.debug(file); + if (file == fileToFind) { + filelist.push(path.join(dir, file)); + } + } }); return filelist; - }; - +}; + async function downloadHelm(version: string): Promise { if (!version) { version = await getStableHelmVersion(); } let cachedToolpath = toolCache.find(helmToolName, version); @@ -90,7 +99,7 @@ async function downloadHelm(version: string): Promise { if (!helmpath) { throw new Error(util.format("Helm executable not found in path ", cachedToolpath)); } - + fs.chmodSync(helmpath, '777'); return helmpath; } @@ -114,9 +123,9 @@ async function run() { } let cachedPath = await downloadHelm(version); - + try { - + if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) { core.addPath(path.dirname(cachedPath)); }