Compare commits

...

13 Commits

Author SHA1 Message Date
shigupt202
0f81cb3d41 Update README.md 2021-08-10 16:29:00 +05:30
shigupt202
ac8103f453 Create CODEOWNERS (#47) 2021-08-10 15:53:58 +05:30
shigupt202
feeafa6152 Update issue templates (#46) 2021-06-30 11:05:14 +05:30
shigupt202
b8c59ed1e4 Create defaultLabels.yml (#44) 2021-06-25 17:05:14 +05:30
Sundar
14d85694fc Update run.ts 2021-06-24 19:26:50 +05:30
Sundar
cfc72cf63e Update run.ts 2021-06-24 19:25:35 +05:30
shigupt202
470bf91618 Syncing package-lock.json in master with release (#42)
* Syncing package.json and package-lock.json in master with release

* reverting changes in package.json
2021-06-03 14:10:06 +05:30
dependabot[bot]
0a4da9a67f Bump ws from 7.4.4 to 7.4.6 (#41)
Bumps [ws](https://github.com/websockets/ws) from 7.4.4 to 7.4.6.
- [Release notes](https://github.com/websockets/ws/releases)
- [Commits](https://github.com/websockets/ws/compare/7.4.4...7.4.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-01 16:01:11 +05:30
dependabot[bot]
07143cd16a Bump browserslist from 4.16.3 to 4.16.6 (#40)
Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.16.6.
- [Release notes](https://github.com/browserslist/browserslist/releases)
- [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md)
- [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.16.6)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-06-01 16:00:44 +05:30
dependabot[bot]
dcb450d677 Bump hosted-git-info from 2.8.8 to 2.8.9 (#39)
Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9.
- [Release notes](https://github.com/npm/hosted-git-info/releases)
- [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md)
- [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-05-26 13:05:55 +05:30
Sundar
1571d72e78 skipLibCheck (#31)
* Update package.json

* Update tsconfig.json
2021-04-01 14:19:07 +05:30
Sundar
62aeada586 Added trigger for L2 tests. (#26) 2021-03-31 17:23:12 +05:30
shigupt202
edc063ca5f adding graph ql for Helm versions - master (#22)
* Adding graphql to find out latest helm version of specified type

* Updating package-loc.json

* Updating js file

* Fixing PR comments

* Adding feature flag as environment variable

* Changing feature flag name

* Updating package-loc.json
2021-03-30 22:43:44 +05:30
13 changed files with 336 additions and 6072 deletions

1
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1 @@
* @ds-ms

View File

@@ -0,0 +1,10 @@
---
name: 'Issue: Bug Report / Feature Request'
about: Create a report to help us improve
title: ''
labels: need-to-triage
assignees: ''
---

View File

@@ -0,0 +1,33 @@
token=$1
commit=$2
repository=$3
prNumber=$4
frombranch=$5
tobranch=$6
patUser=$7
getPayLoad() {
cat <<EOF
{
"event_type": "SetupHelmActionPR",
"client_payload":
{
"action": "SetupHelm",
"commit": "$commit",
"repository": "$repository",
"prNumber": "$prNumber",
"tobranch": "$tobranch",
"frombranch": "$frombranch"
}
}
EOF
}
response=$(curl -u $patUser:$token -X POST https://api.github.com/repos/Azure/azure-actions-integration-tests/dispatches --data "$(getPayLoad)")
if [ "$response" == "" ]; then
echo "Integration tests triggered successfully"
else
echo "Triggering integration tests failed with: '$response'"
exit 1
fi

36
.github/workflows/defaultLabels.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: setting-default-labels
# Controls when the action will run.
on:
schedule:
- cron: "0 0/3 * * *"
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- uses: actions/stale@v3
name: Setting issue as idle
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: 'This issue is idle because it has been open for 14 days with no activity.'
stale-issue-label: 'idle'
days-before-stale: 14
days-before-close: -1
operations-per-run: 100
exempt-issue-labels: 'backlog'
- uses: actions/stale@v3
name: Setting PR as idle
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-pr-message: 'This PR is idle because it has been open for 14 days with no activity.'
stale-pr-label: 'idle'
days-before-stale: 14
days-before-close: -1
operations-per-run: 100

19
.github/workflows/integration-tests.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: "Trigger Integration tests"
on:
pull_request:
branches:
- master
- 'releases/*'
jobs:
trigger-integration-tests:
name: Trigger Integration tests
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v2
with:
path: IntegrationTests
- name: Trigger Test run
run: |
bash ./IntegrationTests/.github/workflows/TriggerIntegrationTests.sh ${{ secrets.L2_REPO_TOKEN }} ${{ github.event.pull_request.head.sha }} ${{ github.repository }} ${{ github.event.pull_request.number }} ${{ github.event.pull_request.head.ref }} ${{ github.event.pull_request.base.ref }} ${{ secrets.L2_REPO_USER }}

View File

@@ -1,4 +1,4 @@
name: "build-test" name: "Run unit tests."
on: # rebuild any PRs and main branch changes on: # rebuild any PRs and main branch changes
pull_request: pull_request:
branches: branches:
@@ -14,7 +14,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v1
- run: |
- name: Run L0 tests.
run: |
npm install npm install
npm build
npm test npm test

View File

@@ -1,5 +1,6 @@
# Setup Helm # Setup Helm
#### Install a specific version of helm binary on the runner. Install a specific version of helm binary on the runner.
## Example
Acceptable values are latest or any semantic version string like v2.16.7 Use this action in workflow to define which version of helm will be used. Acceptable values are latest or any semantic version string like v2.16.7 Use this action in workflow to define which version of helm will be used.

View File

@@ -1,10 +1,14 @@
name: 'Helm tool installer' name: 'Helm tool installer'
description: 'Install a specific version of helm binary. Acceptable values are latest or any semantic version string like 1.15.0' description: 'Install a specific version of helm binary. Acceptable values are latest or any semantic version string like 1.15.0'
inputs: inputs:
version: version:
description: 'Version of helm' description: 'Version of helm'
required: true required: true
default: 'latest' default: 'latest'
token:
description: 'Github token'
default: ${{ github.token }}
required: true
outputs: outputs:
helm-path: helm-path:
description: 'Path to the cached helm binary' description: 'Path to the cached helm binary'

View File

@@ -1,6 +1,26 @@
"use strict"; "use strict";
// Copyright (c) Microsoft Corporation. // Copyright (c) Microsoft Corporation.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license. // 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) { var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) { return new (P || (P = Promise))(function (resolve, reject) {
@@ -10,14 +30,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); 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 }); Object.defineProperty(exports, "__esModule", { value: true });
exports.getStableHelmVersion = void 0;
const os = __importStar(require("os")); const os = __importStar(require("os"));
const path = __importStar(require("path")); const path = __importStar(require("path"));
const util = __importStar(require("util")); const util = __importStar(require("util"));
@@ -25,8 +39,13 @@ const fs = __importStar(require("fs"));
const semver = __importStar(require("semver")); const semver = __importStar(require("semver"));
const toolCache = __importStar(require("@actions/tool-cache")); const toolCache = __importStar(require("@actions/tool-cache"));
const core = __importStar(require("@actions/core")); const core = __importStar(require("@actions/core"));
const graphql_1 = require("@octokit/graphql");
const helmToolName = 'helm'; const helmToolName = 'helm';
const stableHelmVersion = 'v3.2.1'; const stableHelmVersion = 'v3.2.1';
const stableHelm3Version = 'v3.5.3';
const stableHelm2Version = 'v2.17.0';
const LATEST_HELM2_VERSION = '2.*';
const LATEST_HELM3_VERSION = '3.*';
const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'; const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases';
function getExecutableExtension() { function getExecutableExtension() {
if (os.type().match(/^Win/)) { if (os.type().match(/^Win/)) {
@@ -71,6 +90,7 @@ function getStableHelmVersion() {
return stableHelmVersion; return stableHelmVersion;
}); });
} }
exports.getStableHelmVersion = getStableHelmVersion;
var walkSync = function (dir, filelist, fileToFind) { var walkSync = function (dir, filelist, fileToFind) {
var files = fs.readdirSync(dir); var files = fs.readdirSync(dir);
filelist = filelist || []; filelist = filelist || [];
@@ -90,7 +110,7 @@ var walkSync = function (dir, filelist, fileToFind) {
function downloadHelm(version) { function downloadHelm(version) {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
if (!version) { if (!version) {
version = yield getStableHelmVersion(); version = yield getLatestHelmVersionFor("v3");
} }
let cachedToolpath = toolCache.find(helmToolName, version); let cachedToolpath = toolCache.find(helmToolName, version);
if (!cachedToolpath) { if (!cachedToolpath) {
@@ -113,6 +133,45 @@ function downloadHelm(version) {
return helmpath; 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(), getStableHelmVersionFor(type)));
return getStableHelmVersionFor(type);
}
core.warning(util.format("Could not find stable release for Helm %s. Using default Helm version %s.", type, getStableHelmVersionFor(type)));
return getStableHelmVersionFor(type);
});
}
function getStableHelmVersionFor(type) {
return type === "v2" ? stableHelm2Version : stableHelm3Version;
}
// 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) { function findHelm(rootFolder) {
fs.chmodSync(rootFolder, '777'); fs.chmodSync(rootFolder, '777');
var filelist = []; var filelist = [];
@@ -127,12 +186,26 @@ function findHelm(rootFolder) {
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
let version = core.getInput('version', { 'required': true }); let version = core.getInput('version', { 'required': true });
if (version.toLocaleLowerCase() === 'latest') { if (process.env['HELM_INSTALLER_LEGACY_VERSIONING'] == 'true') {
version = yield getStableHelmVersion(); if (version.toLocaleLowerCase() === 'latest') {
version = yield getStableHelmVersion();
}
else if (!version.toLocaleLowerCase().startsWith('v')) {
version = 'v' + version;
}
} }
else if (!version.toLocaleLowerCase().startsWith('v')) { else {
version = 'v' + version; 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); let cachedPath = yield downloadHelm(version);
try { try {
if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) { if (!process.env['PATH'].startsWith(path.dirname(cachedPath))) {

6115
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,15 +6,16 @@
"author": "Anumita Shenoy", "author": "Anumita Shenoy",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/tool-cache": "1.1.2",
"@actions/io": "^1.0.0",
"@actions/core": "^1.2.6", "@actions/core": "^1.2.6",
"@actions/exec": "^1.0.0", "@actions/exec": "^1.0.0",
"@actions/io": "^1.0.0",
"@actions/tool-cache": "1.1.2",
"@octokit/graphql": "^4.6.1",
"semver": "^6.1.0" "semver": "^6.1.0"
}, },
"main": "lib/run.js", "main": "lib/run.js",
"scripts": { "scripts": {
"build": "tsc", "build": "tsc --outDir ./lib --rootDir ./src",
"test": "jest", "test": "jest",
"test-coverage": "jest --coverage" "test-coverage": "jest --coverage"
}, },

View File

@@ -1,4 +1,5 @@
// Copyright (c) Microsoft Corporation. // Copyright (c) Microsoft Corporation.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license. // Licensed under the MIT license.
import * as os from 'os'; import * as os from 'os';
@@ -9,9 +10,14 @@ import * as semver from 'semver';
import * as toolCache from '@actions/tool-cache'; import * as toolCache from '@actions/tool-cache';
import * as core from '@actions/core'; import * as core from '@actions/core';
import { graphql } from '@octokit/graphql';
const helmToolName = 'helm'; const helmToolName = 'helm';
const stableHelmVersion = 'v3.2.1'; const stableHelmVersion = 'v3.2.1';
const stableHelm3Version = 'v3.5.3';
const stableHelm2Version = 'v2.17.0';
const LATEST_HELM2_VERSION = '2.*';
const LATEST_HELM3_VERSION = '3.*';
const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases'; const helmAllReleasesUrl = 'https://api.github.com/repos/helm/helm/releases';
export function getExecutableExtension(): string { export function getExecutableExtension(): string {
@@ -32,7 +38,6 @@ export function getHelmDownloadURL(version: string): string {
case 'Windows_NT': case 'Windows_NT':
default: default:
return util.format('https://get.helm.sh/helm-%s-windows-amd64.zip', version); return util.format('https://get.helm.sh/helm-%s-windows-amd64.zip', version);
} }
} }
@@ -61,7 +66,6 @@ export async function getStableHelmVersion(): Promise<string> {
return stableHelmVersion; return stableHelmVersion;
} }
export var walkSync = function (dir, filelist, fileToFind) { export var walkSync = function (dir, filelist, fileToFind) {
var files = fs.readdirSync(dir); var files = fs.readdirSync(dir);
filelist = filelist || []; filelist = filelist || [];
@@ -104,6 +108,49 @@ export async function downloadHelm(version: string): Promise<string> {
return helmpath; return helmpath;
} }
async function getLatestHelmVersionFor(type: string): Promise<string> {
const token = core.getInput('token', { 'required': true });
try {
const { repository } = await 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(), getStableHelmVersionFor(type)));
return getStableHelmVersionFor(type);
}
core.warning(util.format("Could not find stable release for Helm %s. Using default Helm version %s.", type, getStableHelmVersionFor(type)));
return getStableHelmVersionFor(type);
}
function getStableHelmVersionFor(type: string) {
return type === "v2" ? stableHelm2Version : stableHelm3Version;
}
// isValidVersion checks if verison matches the specified type and is a stable release
function isValidVersion(version: string, type: string): boolean {
if (!version.toLocaleLowerCase().startsWith(type))
return false;
return version.indexOf('rc') == -1;
}
export function findHelm(rootFolder: string): string { export function findHelm(rootFolder: string): string {
fs.chmodSync(rootFolder, '777'); fs.chmodSync(rootFolder, '777');
var filelist: string[] = []; var filelist: string[] = [];
@@ -118,12 +165,24 @@ export function findHelm(rootFolder: string): string {
export async function run() { export async function run() {
let version = core.getInput('version', { 'required': true }); let version = core.getInput('version', { 'required': true });
if (version.toLocaleLowerCase() === 'latest') {
version = await getStableHelmVersion(); if (process.env['HELM_INSTALLER_LEGACY_VERSIONING'] == 'true') {
} else if (!version.toLocaleLowerCase().startsWith('v')) { if (version.toLocaleLowerCase() === 'latest') {
version = 'v' + version; version = await getStableHelmVersion();
} else if (!version.toLocaleLowerCase().startsWith('v')) {
version = 'v' + version;
}
} else {
if (version.toLocaleLowerCase() === 'latest' || version === LATEST_HELM3_VERSION) {
version = await getLatestHelmVersionFor("v3");
} else if (version === LATEST_HELM2_VERSION) {
version = await getLatestHelmVersionFor("v2");
} else if (!version.toLocaleLowerCase().startsWith('v')) {
version = 'v' + version;
}
} }
core.debug(util.format("Downloading %s", version));
let cachedPath = await downloadHelm(version); let cachedPath = await downloadHelm(version);
try { try {
@@ -140,4 +199,4 @@ export async function run() {
core.setOutput('helm-path', cachedPath); core.setOutput('helm-path', cachedPath);
} }
run().catch(core.setFailed); run().catch(core.setFailed);

View File

@@ -58,6 +58,7 @@
/* Experimental Options */ /* Experimental Options */
// "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
// "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
"skipLibCheck": true
}, },
"exclude": ["node_modules", "**/*.test.ts"] "exclude": ["node_modules", "**/*.test.ts"]
} }