Compare commits

..

22 Commits

Author SHA1 Message Date
Imran Ismail
60866b9f80 Add retry mechanism to octokit client 2021-01-20 03:02:45 +08:00
Imran Ismail
91ce0fb611 Add changelog following https://keepachangelog.com/ format (#31) 2020-10-13 23:16:16 +08:00
Imran Ismail
13cc3947ac Release v1.5.2 2020-10-13 23:01:09 +08:00
dependabot[bot]
548304dcdd Bump @typescript-eslint/parser from 2.34.0 to 4.4.1 (#29)
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 2.34.0 to 4.4.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.4.1/packages/parser)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-13 22:59:19 +08:00
dependabot[bot]
366ebb426b Bump eslint-plugin-jest from 23.20.0 to 24.1.0 (#22)
Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 23.20.0 to 24.1.0.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v23.20.0...v24.1.0)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-13 22:51:51 +08:00
dependabot[bot]
0b4205889c Bump jest-circus from 26.4.2 to 26.5.3 (#28)
Bumps [jest-circus](https://github.com/facebook/jest/tree/HEAD/packages/jest-circus) from 26.4.2 to 26.5.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v26.5.3/packages/jest-circus)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-13 22:46:39 +08:00
dependabot[bot]
509da12cc4 Bump @zeit/ncc from 0.20.5 to 0.22.3 (#18)
Bumps [@zeit/ncc](https://github.com/zeit/ncc) from 0.20.5 to 0.22.3.
- [Release notes](https://github.com/zeit/ncc/releases)
- [Commits](https://github.com/zeit/ncc/compare/0.20.5...0.22.3)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-13 22:46:09 +08:00
dependabot[bot]
b7c602d150 Bump @types/node from 14.11.2 to 14.11.8 (#27)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.11.2 to 14.11.8.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-13 22:44:28 +08:00
Imran Ismail
d6406c9ed5 Update README.md 2020-10-02 01:49:01 +08:00
dependabot[bot]
965f29eaf7 Bump @types/node from 14.10.0 to 14.11.2 (#12)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.10.0 to 14.11.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:45:02 +08:00
dependabot[bot]
41e7f9975d Bump @types/jest from 26.0.10 to 26.0.14 (#13)
Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 26.0.10 to 26.0.14.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:41:55 +08:00
dependabot[bot]
45c217953c Bump prettier from 2.1.1 to 2.1.2 (#14)
Bumps [prettier](https://github.com/prettier/prettier) from 2.1.1 to 2.1.2.
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/2.1.1...2.1.2)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:41:15 +08:00
dependabot[bot]
ae749a83d7 Bump eslint from 7.8.1 to 7.10.0 (#15)
Bumps [eslint](https://github.com/eslint/eslint) from 7.8.1 to 7.10.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v7.8.1...v7.10.0)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:40:01 +08:00
dependabot[bot]
0c2f32dde2 Bump typescript from 3.9.7 to 4.0.3 (#11)
Bumps [typescript](https://github.com/Microsoft/TypeScript) from 3.9.7 to 4.0.3.
- [Release notes](https://github.com/Microsoft/TypeScript/releases)
- [Commits](https://github.com/Microsoft/TypeScript/compare/v3.9.7...v4.0.3)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:35:36 +08:00
dependabot[bot]
59f3d52ca7 Bump @actions/core from 1.2.5 to 1.2.6 (#16)
Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/actions/toolkit/releases)
- [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md)
- [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core)

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

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-10-02 01:25:34 +08:00
Imran Ismail
ff25099d8b Update manifests 2020-09-25 22:16:19 +08:00
Imran Ismail
359e84cbc9 Cache by requested version name 2020-09-25 22:14:20 +08:00
Imran Ismail
430fa071e8 Run jest tests sequentially 2020-09-25 13:06:21 +08:00
Imran Ismail
b0afa08459 Remove unused import 2020-09-25 12:58:37 +08:00
Imran Ismail
9503343f5a Update test.yml 2020-09-25 12:55:49 +08:00
Imran Ismail
51957eba2f Simplify installer logic 2020-09-25 12:53:36 +08:00
Imran Ismail
399ab9d4d6 Fix dependabot config typo 2020-09-25 10:53:18 +08:00
12 changed files with 1016 additions and 760 deletions

View File

@@ -3,7 +3,7 @@ on: # rebuild any PRs and main branch changes
pull_request:
push:
branches:
- main
- master
- 'releases/*'
jobs:

42
CHANGELOG.MD Normal file
View File

@@ -0,0 +1,42 @@
# Changelog
## v1.5.2
### Security
- Bump @actions/core to v1.2.6 to address deprecations raised in #30
## v1.5.1
### Changed
- Cache kustomize by requested version spec as key
## v1.5.0
### Changed
- Simplified asset look up
## v1.4.0
### Added
- Adds support for semver version ranges. Example: 3.x, 3.2.x
- Add a step in the workflow to test the action with default value
## v1.2.0
N/A
## v1.1.0
### Fixed
- Support for new download path for kustomize
## v1.0.0
### Changed
- Update metadata

View File

@@ -1,4 +1,10 @@
## TLDR
![build-test](https://github.com/imranismail/setup-kustomize/workflows/build-test/badge.svg)
## Description
Install any kustomize version as a step in your workflow
## Usage
```yaml
on:

View File

@@ -10,7 +10,6 @@ process.env['RUNNER_TOOL_CACHE'] = toolDir
process.env['RUNNER_TEMP'] = tempDir
import * as installer from '../src/installer'
import * as semver from 'semver'
const IS_WINDOWS = os.platform() === 'win32'
@@ -18,18 +17,24 @@ describe('installer tests', () => {
beforeAll(async () => {
await io.rmRF(toolDir)
await io.rmRF(tempDir)
}, 100000)
})
afterAll(async () => {
await io.rmRF(toolDir)
await io.rmRF(tempDir)
}, 100000)
it('Acquires the max satisfying version range', async () => {
await installer.getKustomize('~> 3.0')
const kustomizeDir = path.join(toolDir, 'kustomize', '~> 3.0', os.arch())
expect(fs.existsSync(`${kustomizeDir}.complete`)).toBe(true)
it('Acquires the latest kustomize version 3.x successfully', () => {
expect(async () => await installer.getKustomize('3.x')).not.toThrow()
}, 100000)
if (IS_WINDOWS) {
expect(fs.existsSync(path.join(kustomizeDir, 'kustomize.exe'))).toBe(true)
} else {
expect(fs.existsSync(path.join(kustomizeDir, 'kustomize'))).toBe(true)
expect(() =>
fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow()
}
})
it('Acquires kustomize version 3.2.0 successfully', async () => {
it('Acquires kustomize version 3.2.0', async () => {
await installer.getKustomize('3.2.0')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.0', os.arch())
@@ -43,9 +48,9 @@ describe('installer tests', () => {
fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow()
}
}, 100000)
})
it('Acquires kustomize version 3.2.1 successfully', async () => {
it('Acquires kustomize version 3.2.1', async () => {
await installer.getKustomize('3.2.1')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.2.1', os.arch())
@@ -59,9 +64,9 @@ describe('installer tests', () => {
fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow()
}
}, 100000)
})
it('Acquires kustomize version 3.3.0 successfully', async () => {
it('Acquires kustomize version 3.3.0', async () => {
await installer.getKustomize('3.3.0')
const kustomizeDir = path.join(toolDir, 'kustomize', '3.3.0', os.arch())
@@ -75,7 +80,7 @@ describe('installer tests', () => {
fs.accessSync(path.join(kustomizeDir, 'kustomize'), fs.constants.X_OK)
).not.toThrow()
}
}, 100000)
})
it('Throws if no location contains correct kustomize version', async () => {
let thrown = false

255
dist/index.js vendored
View File

@@ -19,7 +19,13 @@ require('./sourcemap-register.js');module.exports =
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ var threw = true;
/******/ try {
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ threw = false;
/******/ } finally {
/******/ if(threw) delete installedModules[moduleId];
/******/ }
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
@@ -1041,9 +1047,9 @@ module.exports = require("tls");
/***/ }),
/***/ 18:
/***/ (function() {
/***/ (function(module) {
eval("require")("encoding");
module.exports = eval("require")("encoding");
/***/ }),
@@ -1505,6 +1511,32 @@ class SemVer {
module.exports = SemVer
/***/ }),
/***/ 82:
/***/ (function(__unusedmodule, exports) {
"use strict";
// We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", { value: true });
/**
* Sanitizes an input into a string so it can be passed into issueCommand safely
* @param input input to sanitize into a string
*/
function toCommandValue(input) {
if (input === null || input === undefined) {
return '';
}
else if (typeof input === 'string' || input instanceof String) {
return input;
}
return JSON.stringify(input);
}
exports.toCommandValue = toCommandValue;
//# sourceMappingURL=utils.js.map
/***/ }),
/***/ 87:
@@ -1514,6 +1546,42 @@ module.exports = require("os");
/***/ }),
/***/ 102:
/***/ (function(__unusedmodule, exports, __webpack_require__) {
"use strict";
// For internal use, subject to change.
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 });
// We use any as a valid input type
/* eslint-disable @typescript-eslint/no-explicit-any */
const fs = __importStar(__webpack_require__(747));
const os = __importStar(__webpack_require__(87));
const utils_1 = __webpack_require__(82);
function issueCommand(command, message) {
const filePath = process.env[`GITHUB_${command}`];
if (!filePath) {
throw new Error(`Unable to find environment variable for file command ${command}`);
}
if (!fs.existsSync(filePath)) {
throw new Error(`Missing file at path: ${filePath}`);
}
fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, {
encoding: 'utf8'
});
}
exports.issueCommand = issueCommand;
//# sourceMappingURL=file-command.js.map
/***/ }),
/***/ 120:
/***/ (function(module, __unusedexports, __webpack_require__) {
@@ -2552,7 +2620,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
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);
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
@@ -3267,6 +3335,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
const os = __importStar(__webpack_require__(87));
const utils_1 = __webpack_require__(82);
/**
* Commands
*
@@ -3320,28 +3389,14 @@ class Command {
return cmdStr;
}
}
/**
* Sanitizes an input into a string so it can be passed into issueCommand safely
* @param input input to sanitize into a string
*/
function toCommandValue(input) {
if (input === null || input === undefined) {
return '';
}
else if (typeof input === 'string' || input instanceof String) {
return input;
}
return JSON.stringify(input);
}
exports.toCommandValue = toCommandValue;
function escapeData(s) {
return toCommandValue(s)
return utils_1.toCommandValue(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A');
}
function escapeProperty(s) {
return toCommandValue(s)
return utils_1.toCommandValue(s)
.replace(/%/g, '%25')
.replace(/\r/g, '%0D')
.replace(/\n/g, '%0A')
@@ -5390,6 +5445,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
};
Object.defineProperty(exports, "__esModule", { value: true });
const command_1 = __webpack_require__(431);
const file_command_1 = __webpack_require__(102);
const utils_1 = __webpack_require__(82);
const os = __importStar(__webpack_require__(87));
const path = __importStar(__webpack_require__(622));
/**
@@ -5416,9 +5473,17 @@ var ExitCode;
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function exportVariable(name, val) {
const convertedVal = command_1.toCommandValue(val);
const convertedVal = utils_1.toCommandValue(val);
process.env[name] = convertedVal;
command_1.issueCommand('set-env', { name }, convertedVal);
const filePath = process.env['GITHUB_ENV'] || '';
if (filePath) {
const delimiter = '_GitHubActionsFileCommandDelimeter_';
const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`;
file_command_1.issueCommand('ENV', commandValue);
}
else {
command_1.issueCommand('set-env', { name }, convertedVal);
}
}
exports.exportVariable = exportVariable;
/**
@@ -5434,7 +5499,13 @@ exports.setSecret = setSecret;
* @param inputPath
*/
function addPath(inputPath) {
command_1.issueCommand('add-path', {}, inputPath);
const filePath = process.env['GITHUB_PATH'] || '';
if (filePath) {
file_command_1.issueCommand('PATH', inputPath);
}
else {
command_1.issueCommand('add-path', {}, inputPath);
}
process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`;
}
exports.addPath = addPath;
@@ -9057,7 +9128,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
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);
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
@@ -9082,16 +9153,16 @@ exports.getKustomize = void 0;
// Load tempDirectory before it gets wiped by tool-cache
const rest_1 = __webpack_require__(889);
const core = __importStar(__webpack_require__(470));
const tc = __importStar(__webpack_require__(533));
const os = __importStar(__webpack_require__(87));
const cache = __importStar(__webpack_require__(533));
const path = __importStar(__webpack_require__(622));
const semver = __importStar(__webpack_require__(876));
const fs = __importStar(__webpack_require__(747));
let tempDirectory = process.env['RUNNER_TEMPDIRECTORY'] || '';
const osPlat = os.platform();
const osArch = os.arch();
const octokit = new rest_1.Octokit();
const versionRegex = /\d+\.?\d*\.?\d*/;
const toolName = 'kustomize';
const platform = process.platform;
const arch = process.arch === 'x64' ? 'amd64' : process.arch;
if (!tempDirectory) {
let baseLocation;
if (process.platform === 'win32') {
@@ -9108,58 +9179,24 @@ if (!tempDirectory) {
}
tempDirectory = path.join(baseLocation, 'actions', 'temp');
}
function getKustomize(versionSpec) {
function getKustomize(targetVersion) {
return __awaiter(this, void 0, void 0, function* () {
// check cache
let toolPath;
toolPath = tc.find('kustomize', versionSpec);
// If not found in cache, download
if (!toolPath) {
let version;
const c = semver.clean(versionSpec) || '';
// If explicit version
if (semver.valid(c) != null) {
// version to download
version = versionSpec;
}
else {
// query kustomize for a matching version
const match = yield queryLatestMatch(versionSpec);
if (!match) {
throw new Error(`Unable to find Kustomize version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`);
}
version = match;
}
if (!toolPath) {
// download, extract, cache
toolPath = yield acquireKustomize(version);
}
if (!semver.validRange(targetVersion))
throw new Error(`invalid semver requested: ${targetVersion}`);
let kustomizePath = cache.find('kustomize', targetVersion);
if (!kustomizePath) {
const version = yield getMaxSatisfyingVersion(targetVersion);
kustomizePath = yield acquireVersion(version);
}
core.addPath(toolPath);
return core.addPath(kustomizePath);
});
}
exports.getKustomize = getKustomize;
function queryLatestMatch(versionSpec) {
function getMaxSatisfyingVersion(targetVersion) {
var e_1, _a;
return __awaiter(this, void 0, void 0, function* () {
let dataFileName;
switch (osPlat) {
case 'linux':
case 'darwin':
case 'win32':
dataFileName = osPlat;
break;
default:
throw new Error(`Unexpected OS '${osPlat}'`);
}
switch (osArch) {
case 'x64':
dataFileName = `${dataFileName}_amd64`;
break;
default:
dataFileName = `${dataFileName}_${osArch}`;
}
const versions = [];
const version = { target: targetVersion };
const availableVersions = new Map();
try {
for (var _b = __asyncValues(octokit.paginate.iterator(octokit.repos.listReleases, {
owner: 'kubernetes-sigs',
@@ -9167,11 +9204,13 @@ function queryLatestMatch(versionSpec) {
})), _c; _c = yield _b.next(), !_c.done;) {
const response = _c.value;
for (const release of response.data) {
if (release.assets.some(asset => asset.name.includes(dataFileName) &&
asset.name.includes('kustomize'))) {
const version = (versionRegex.exec(release.name) || []).shift();
if (version != null) {
versions.push(version);
const matchingAsset = release.assets.find(asset => asset.name.includes('kustomize') &&
asset.name.includes(platform) &&
asset.name.includes(arch));
if (matchingAsset) {
const kustomizeVersion = (versionRegex.exec(release.name) || []).shift();
if (kustomizeVersion != null) {
availableVersions.set(kustomizeVersion, matchingAsset.browser_download_url);
}
}
}
@@ -9184,68 +9223,36 @@ function queryLatestMatch(versionSpec) {
}
finally { if (e_1) throw e_1.error; }
}
return semver.maxSatisfying(versions, versionSpec);
const resolved = semver.maxSatisfying([...availableVersions.keys()], version.target);
if (!resolved) {
throw new Error(`Unable to find Kustomize version '${version.target}' for platform '${platform}' and architecture ${arch}.`);
}
const url = availableVersions.get(resolved);
return Object.assign(Object.assign({}, version), { resolved, url });
});
}
function acquireKustomize(version) {
function acquireVersion(version) {
return __awaiter(this, void 0, void 0, function* () {
version = semver.clean(version) || '';
let downloadUrl;
const toolFilename = process.platform === 'win32' ? `${toolName}.exe` : toolName;
let toolPath;
let toolFilename = 'kustomize';
const toolName = 'kustomize';
if (osPlat === 'win32') {
toolFilename = `${toolFilename}.exe`;
}
if (semver.gte(version, '3.3.0')) {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${version}/kustomize_v${version}_%{os}_%{arch}.tar.gz`;
}
else if (semver.gte(version, '3.2.1')) {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${version}/kustomize_kustomize.v${version}_%{os}_%{arch}`;
}
else {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/v${version}/kustomize_${version}_%{os}_%{arch}`;
}
switch (osPlat) {
case 'win32':
if (semver.lte(version, '3.2.1'))
throw new Error(`Unexpected OS '${osPlat}'`);
downloadUrl = downloadUrl.replace('%{os}', 'windows');
if (semver.lt(version, '3.3.0'))
downloadUrl = `${downloadUrl}.exe`;
break;
case 'linux':
case 'darwin':
downloadUrl = downloadUrl.replace('%{os}', osPlat);
break;
default:
throw new Error(`Unexpected OS '${osPlat}'`);
}
switch (osArch) {
case 'x64':
downloadUrl = downloadUrl.replace('%{arch}', 'amd64');
break;
default:
throw new Error(`Unexpected Arch '${osArch}'`);
}
try {
toolPath = yield tc.downloadTool(downloadUrl);
toolPath = yield cache.downloadTool(version.url);
}
catch (err) {
core.debug(err);
throw new Error(`Failed to download version ${version}: ${err}`);
throw new Error(`Failed to download version ${version.target}: ${err}`);
}
if (downloadUrl.endsWith('.tar.gz')) {
toolPath = yield tc.extractTar(toolPath);
if (version.url.endsWith('.tar.gz')) {
toolPath = yield cache.extractTar(toolPath);
toolPath = path.join(toolPath, toolFilename);
}
switch (osPlat) {
switch (process.platform) {
case 'linux':
case 'darwin':
fs.chmodSync(toolPath, 0o755);
break;
}
return yield tc.cacheFile(toolPath, toolFilename, toolName, version);
return yield cache.cacheFile(toolPath, toolFilename, toolName, version.target);
});
}

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View File

@@ -19,7 +19,13 @@ module.exports =
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ var threw = true;
/******/ try {
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ threw = false;
/******/ } finally {
/******/ if(threw) delete installedModules[moduleId];
/******/ }
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;

View File

@@ -4,8 +4,9 @@ module.exports = {
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner',
testTimeout: 60000,
transform: {
'^.+\\.ts$': 'ts-jest'
},
verbose: true
}
}

1222
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
"package": "ncc build --source-map",
"test": "jest",
"test": "jest -i",
"all": "npm run build && npm run format && npm run lint && npm run package && npm test"
},
"repository": {
@@ -25,26 +25,27 @@
"author": "Imran Ismail",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.2.4",
"@actions/core": "^1.2.6",
"@actions/io": "^1.0.2",
"@actions/tool-cache": "^1.3.3",
"@octokit/plugin-retry": "^3.0.6",
"@octokit/rest": "^18.0.6",
"semver": "^7.3.2"
},
"devDependencies": {
"@types/jest": "^26.0.5",
"@types/node": "^14.0.23",
"@types/jest": "^26.0.14",
"@types/node": "^14.11.8",
"@types/semver": "^7.3.4",
"@typescript-eslint/parser": "^2.8.0",
"@zeit/ncc": "^0.20.5",
"eslint": "^7.5.0",
"@typescript-eslint/parser": "^4.4.1",
"@zeit/ncc": "^0.22.3",
"eslint": "^7.10.0",
"eslint-plugin-github": "^4.0.1",
"eslint-plugin-jest": "^23.18.0",
"eslint-plugin-jest": "^24.1.0",
"jest": "^24.9.0",
"jest-circus": "^26.1.0",
"jest-circus": "^26.5.3",
"js-yaml": "^3.13.1",
"prettier": "^2.0.5",
"prettier": "^2.1.2",
"ts-jest": "^24.2.0",
"typescript": "^3.9.4"
"typescript": "^4.0.3"
}
}

View File

@@ -1,17 +1,19 @@
// Load tempDirectory before it gets wiped by tool-cache
import {Octokit} from '@octokit/rest'
import {retry} from '@octokit/plugin-retry'
import * as core from '@actions/core'
import * as tc from '@actions/tool-cache'
import * as os from 'os'
import * as cache from '@actions/tool-cache'
import * as path from 'path'
import * as semver from 'semver'
import * as fs from 'fs'
let tempDirectory = process.env['RUNNER_TEMPDIRECTORY'] || ''
const osPlat: string = os.platform()
const osArch: string = os.arch()
const octokit = new Octokit()
const RetriableOctokit = Octokit.plugin(retry)
const octokit = new RetriableOctokit()
const versionRegex = /\d+\.?\d*\.?\d*/
const toolName = 'kustomize'
const platform = process.platform
const arch = process.arch === 'x64' ? 'amd64' : process.arch
if (!tempDirectory) {
let baseLocation
@@ -28,64 +30,31 @@ if (!tempDirectory) {
tempDirectory = path.join(baseLocation, 'actions', 'temp')
}
export async function getKustomize(versionSpec: string): Promise<void> {
// check cache
let toolPath: string
export async function getKustomize(targetVersion: string): Promise<void> {
if (!semver.validRange(targetVersion))
throw new Error(`invalid semver requested: ${targetVersion}`)
toolPath = tc.find('kustomize', versionSpec)
let kustomizePath = cache.find('kustomize', targetVersion)
// If not found in cache, download
if (!toolPath) {
let version: string
const c = semver.clean(versionSpec) || ''
// If explicit version
if (semver.valid(c) != null) {
// version to download
version = versionSpec
} else {
// query kustomize for a matching version
const match = await queryLatestMatch(versionSpec)
if (!match) {
throw new Error(
`Unable to find Kustomize version '${versionSpec}' for platform ${osPlat} and architecture ${osArch}.`
)
}
version = match
}
if (!toolPath) {
// download, extract, cache
toolPath = await acquireKustomize(version)
}
if (!kustomizePath) {
const version = await getMaxSatisfyingVersion(targetVersion)
kustomizePath = await acquireVersion(version)
}
core.addPath(toolPath)
return core.addPath(kustomizePath)
}
async function queryLatestMatch(versionSpec: string): Promise<string | null> {
let dataFileName: string
interface Version {
resolved: string
target: string
url: string
}
switch (osPlat) {
case 'linux':
case 'darwin':
case 'win32':
dataFileName = osPlat
break
default:
throw new Error(`Unexpected OS '${osPlat}'`)
}
switch (osArch) {
case 'x64':
dataFileName = `${dataFileName}_amd64`
break
default:
dataFileName = `${dataFileName}_${osArch}`
}
const versions: string[] = []
async function getMaxSatisfyingVersion(
targetVersion: string
): Promise<Version> {
const version = {target: targetVersion}
const availableVersions: Map<string, string> = new Map()
for await (const response of octokit.paginate.iterator(
octokit.repos.listReleases,
@@ -95,86 +64,65 @@ async function queryLatestMatch(versionSpec: string): Promise<string | null> {
}
)) {
for (const release of response.data) {
if (
release.assets.some(
asset =>
asset.name.includes(dataFileName) &&
asset.name.includes('kustomize')
)
) {
const version = (versionRegex.exec(release.name) || []).shift()
const matchingAsset = release.assets.find(
asset =>
asset.name.includes('kustomize') &&
asset.name.includes(platform) &&
asset.name.includes(arch)
)
if (version != null) {
versions.push(version)
if (matchingAsset) {
const kustomizeVersion = (versionRegex.exec(release.name) || []).shift()
if (kustomizeVersion != null) {
availableVersions.set(
kustomizeVersion,
matchingAsset.browser_download_url
)
}
}
}
}
return semver.maxSatisfying(versions, versionSpec)
const resolved = semver.maxSatisfying(
[...availableVersions.keys()],
version.target
)
if (!resolved) {
throw new Error(
`Unable to find Kustomize version '${version.target}' for platform '${platform}' and architecture ${arch}.`
)
}
const url = availableVersions.get(resolved) as string
return {...version, resolved, url}
}
async function acquireKustomize(version: string): Promise<string> {
version = semver.clean(version) || ''
let downloadUrl: string
async function acquireVersion(version: Version): Promise<string> {
const toolFilename =
process.platform === 'win32' ? `${toolName}.exe` : toolName
let toolPath: string
let toolFilename = 'kustomize'
const toolName = 'kustomize'
if (osPlat === 'win32') {
toolFilename = `${toolFilename}.exe`
}
if (semver.gte(version, '3.3.0')) {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${version}/kustomize_v${version}_%{os}_%{arch}.tar.gz`
} else if (semver.gte(version, '3.2.1')) {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v${version}/kustomize_kustomize.v${version}_%{os}_%{arch}`
} else {
downloadUrl = `https://github.com/kubernetes-sigs/kustomize/releases/download/v${version}/kustomize_${version}_%{os}_%{arch}`
}
switch (osPlat) {
case 'win32':
if (semver.lte(version, '3.2.1'))
throw new Error(`Unexpected OS '${osPlat}'`)
downloadUrl = downloadUrl.replace('%{os}', 'windows')
if (semver.lt(version, '3.3.0')) downloadUrl = `${downloadUrl}.exe`
break
case 'linux':
case 'darwin':
downloadUrl = downloadUrl.replace('%{os}', osPlat)
break
default:
throw new Error(`Unexpected OS '${osPlat}'`)
}
switch (osArch) {
case 'x64':
downloadUrl = downloadUrl.replace('%{arch}', 'amd64')
break
default:
throw new Error(`Unexpected Arch '${osArch}'`)
}
try {
toolPath = await tc.downloadTool(downloadUrl)
toolPath = await cache.downloadTool(version.url)
} catch (err) {
core.debug(err)
throw new Error(`Failed to download version ${version}: ${err}`)
throw new Error(`Failed to download version ${version.target}: ${err}`)
}
if (downloadUrl.endsWith('.tar.gz')) {
toolPath = await tc.extractTar(toolPath)
if (version.url.endsWith('.tar.gz')) {
toolPath = await cache.extractTar(toolPath)
toolPath = path.join(toolPath, toolFilename)
}
switch (osPlat) {
switch (process.platform) {
case 'linux':
case 'darwin':
fs.chmodSync(toolPath, 0o755)
break
}
return await tc.cacheFile(toolPath, toolFilename, toolName, version)
return await cache.cacheFile(toolPath, toolFilename, toolName, version.target)
}