Skip to content

Commit 18bc768

Browse files
authored
Adding graph ql for Helm versions (#21)
* Adding graphql query to fetch latest helm release of specified type * Updating typescript version and js file * Fixing PR comments in release * Adding feature flag as environment variable in release * Changing feature flag name * Updating files as per latest changes in master after resolving merge conflicts * Removing non prod modules
1 parent d55017e commit 18bc768

File tree

365 files changed

+48161
-800510
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

365 files changed

+48161
-800510
lines changed

action.yml

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ inputs:
55
description: 'Version of helm'
66
required: true
77
default: 'latest'
8+
token:
9+
description: 'Github token'
10+
default: ${{ github.token }}
11+
required: true
812
outputs:
913
helm-path:
1014
description: 'Path to the cached helm binary'

lib/run.js

+94-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,26 @@
11
"use strict";
22
// Copyright (c) Microsoft Corporation.
3+
// Copyright (c) Microsoft Corporation.
34
// Licensed under the MIT license.
5+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6+
if (k2 === undefined) k2 = k;
7+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
8+
}) : (function(o, m, k, k2) {
9+
if (k2 === undefined) k2 = k;
10+
o[k2] = m[k];
11+
}));
12+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
13+
Object.defineProperty(o, "default", { enumerable: true, value: v });
14+
}) : function(o, v) {
15+
o["default"] = v;
16+
});
17+
var __importStar = (this && this.__importStar) || function (mod) {
18+
if (mod && mod.__esModule) return mod;
19+
var result = {};
20+
if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
21+
__setModuleDefault(result, mod);
22+
return result;
23+
};
424
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
525
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
626
return new (P || (P = Promise))(function (resolve, reject) {
@@ -10,30 +30,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1030
step((generator = generator.apply(thisArg, _arguments || [])).next());
1131
});
1232
};
13-
var __importStar = (this && this.__importStar) || function (mod) {
14-
if (mod && mod.__esModule) return mod;
15-
var result = {};
16-
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
17-
result["default"] = mod;
18-
return result;
19-
};
2033
Object.defineProperty(exports, "__esModule", { value: true });
34+
exports.run = exports.findHelm = exports.downloadHelm = exports.walkSync = exports.getStableHelmVersion = exports.getHelmDownloadURL = exports.getExecutableExtension = void 0;
2135
const os = __importStar(require("os"));
2236
const path = __importStar(require("path"));
2337
const util = __importStar(require("util"));
2438
const fs = __importStar(require("fs"));
2539
const semver = __importStar(require("semver"));
2640
const toolCache = __importStar(require("@actions/tool-cache"));
2741
const core = __importStar(require("@actions/core"));
42+
const graphql_1 = require("@octokit/graphql");
2843
const helmToolName = 'helm';
2944
const stableHelmVersion = 'v3.2.1';
45+
const stableHelm3Version = 'v3.5.3';
46+
const stableHelm2Version = 'v2.17.0';
47+
const LATEST_HELM2_VERSION = '2.*';
48+
const LATEST_HELM3_VERSION = '3.*';
3049
const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases';
3150
function getExecutableExtension() {
3251
if (os.type().match(/^Win/)) {
3352
return '.exe';
3453
}
3554
return '';
3655
}
56+
exports.getExecutableExtension = getExecutableExtension;
3757
function getHelmDownloadURL(version) {
3858
switch (os.type()) {
3959
case 'Linux':
@@ -45,6 +65,7 @@ function getHelmDownloadURL(version) {
4565
return util.format('https://get.helm.sh/helm-%s-windows-amd64.zip', version);
4666
}
4767
}
68+
exports.getHelmDownloadURL = getHelmDownloadURL;
4869
function getStableHelmVersion() {
4970
return __awaiter(this, void 0, void 0, function* () {
5071
try {
@@ -71,12 +92,13 @@ function getStableHelmVersion() {
7192
return stableHelmVersion;
7293
});
7394
}
74-
var walkSync = function (dir, filelist, fileToFind) {
95+
exports.getStableHelmVersion = getStableHelmVersion;
96+
exports.walkSync = function (dir, filelist, fileToFind) {
7597
var files = fs.readdirSync(dir);
7698
filelist = filelist || [];
7799
files.forEach(function (file) {
78100
if (fs.statSync(path.join(dir, file)).isDirectory()) {
79-
filelist = walkSync(path.join(dir, file), filelist, fileToFind);
101+
filelist = exports.walkSync(path.join(dir, file), filelist, fileToFind);
80102
}
81103
else {
82104
core.debug(file);
@@ -113,26 +135,81 @@ function downloadHelm(version) {
113135
return helmpath;
114136
});
115137
}
138+
exports.downloadHelm = downloadHelm;
139+
function getLatestHelmVersionFor(type) {
140+
return __awaiter(this, void 0, void 0, function* () {
141+
const token = core.getInput('token', { 'required': true });
142+
try {
143+
const { repository } = yield graphql_1.graphql(`{
144+
repository(name: "helm", owner: "helm") {
145+
releases(last: 100) {
146+
nodes {
147+
tagName
148+
}
149+
}
150+
}
151+
}`, {
152+
headers: {
153+
authorization: `token ${token}`
154+
}
155+
});
156+
const releases = repository.releases.nodes.reverse();
157+
let latestValidRelease = releases.find(release => isValidVersion(release.tagName, type));
158+
if (latestValidRelease)
159+
return latestValidRelease.tagName;
160+
}
161+
catch (err) {
162+
core.warning(util.format("Error while fetching the latest Helm %s release. Error: %s. Using default Helm version %s.", type, err.toString(), getStableHelmVersionFor(type)));
163+
return getStableHelmVersionFor(type);
164+
}
165+
core.warning(util.format("Could not find stable release for Helm %s. Using default Helm version %s.", type, getStableHelmVersionFor(type)));
166+
return getStableHelmVersionFor(type);
167+
});
168+
}
169+
function getStableHelmVersionFor(type) {
170+
return type === "v2" ? stableHelm2Version : stableHelm3Version;
171+
}
172+
// isValidVersion checks if verison matches the specified type and is a stable release
173+
function isValidVersion(version, type) {
174+
if (!version.toLocaleLowerCase().startsWith(type))
175+
return false;
176+
return version.indexOf('rc') == -1;
177+
}
116178
function findHelm(rootFolder) {
117179
fs.chmodSync(rootFolder, '777');
118180
var filelist = [];
119-
walkSync(rootFolder, filelist, helmToolName + getExecutableExtension());
120-
if (!filelist) {
121-
throw new Error(util.format("Helm executable not found in path ", rootFolder));
181+
exports.walkSync(rootFolder, filelist, helmToolName + getExecutableExtension());
182+
if (!filelist || filelist.length == 0) {
183+
throw new Error(util.format("Helm executable not found in path", rootFolder));
122184
}
123185
else {
124186
return filelist[0];
125187
}
126188
}
189+
exports.findHelm = findHelm;
127190
function run() {
128191
return __awaiter(this, void 0, void 0, function* () {
129192
let version = core.getInput('version', { 'required': true });
130-
if (version.toLocaleLowerCase() === 'latest') {
131-
version = yield getStableHelmVersion();
193+
if (process.env['HELM_INSTALLER_LEGACY_VERSIONING'] == 'true') {
194+
if (version.toLocaleLowerCase() === 'latest') {
195+
version = yield getStableHelmVersion();
196+
}
197+
else if (!version.toLocaleLowerCase().startsWith('v')) {
198+
version = 'v' + version;
199+
}
132200
}
133-
else if (!version.toLocaleLowerCase().startsWith('v')) {
134-
version = 'v' + version;
201+
else {
202+
if (version.toLocaleLowerCase() === 'latest' || version === LATEST_HELM3_VERSION) {
203+
version = yield getLatestHelmVersionFor("v3");
204+
}
205+
else if (version === LATEST_HELM2_VERSION) {
206+
version = yield getLatestHelmVersionFor("v2");
207+
}
208+
else if (!version.toLocaleLowerCase().startsWith('v')) {
209+
version = 'v' + version;
210+
}
135211
}
212+
core.debug(util.format("Downloading %s", version));
136213
let cachedPath = yield downloadHelm(version);
137214
try {
138215
if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) {
@@ -146,4 +223,5 @@ function run() {
146223
core.setOutput('helm-path', cachedPath);
147224
});
148225
}
226+
exports.run = run;
149227
run().catch(core.setFailed);

node_modules/.bin/semver.cmd

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/tsc

-15
This file was deleted.

node_modules/.bin/tsc.cmd

-7
This file was deleted.

node_modules/.bin/tsserver

-15
This file was deleted.

node_modules/.bin/tsserver.cmd

-7
This file was deleted.

node_modules/.bin/uuid.cmd

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/@actions/core/package.json

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/@actions/exec/LICENSE.md

+6-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)