From 5d2ec201a9405e667e05d67d42726b543e82f72c Mon Sep 17 00:00:00 2001 From: Audrey Eschright Date: Tue, 8 Dec 2020 11:26:01 -0800 Subject: [PATCH] Document pre-release behavior (#73) * Add user agent reporting to terraform download * Upgrade js-releases dependency --- README.md | 4 ++-- dist/index.js | 19 +++++++++++-------- lib/setup-terraform.js | 2 +- package-lock.json | 12 ++++++------ package.json | 2 +- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index a2f3223..4923170 100644 --- a/README.md +++ b/README.md @@ -147,8 +147,8 @@ The action supports the following inputs: - `terraform_version` - (optional) The version of Terraform CLI to install. Instead of a full version string, you can also specify a constraint string (see [Semver Ranges](https://www.npmjs.com/package/semver#ranges) for available range specifications). Examples are: `<0.14.0`, `~0.13.0`, `0.13.x` (all three installing - the latest available 0.13 version). Prerelease versions are always ignored. The special value of `latest` - installs the latest version of Terraform CLI. Defaults to `latest`. + the latest available 0.13 version). Prerelease versions can be specified and a range will stay within the + given tag such as `beta` or `rc`. If no version is given, it will default to `latest`. - `terraform_wrapper` - (optional) Whether to install a wrapper to wrap subsequent calls of the `terraform` binary and expose its STDOUT, STDERR, and exit code as outputs diff --git a/dist/index.js b/dist/index.js index 9a15e29..58ade30 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2347,7 +2347,7 @@ async function run () { const osArch = os.arch(); core.debug(`Finding releases for Terraform version ${version}`); - const release = await releases.getRelease('terraform', version); + const release = await releases.getRelease('terraform', version, 'GitHub Action: Setup Terraform'); const platform = mapOS(osPlatform); const arch = mapArch(osArch); core.debug(`Getting build for Terraform version ${release.version}: ${platform} ${arch}`); @@ -52497,27 +52497,30 @@ class Release { } } exports.Release = Release; -function getRelease(product, version, userAgent) { +function getRelease(product, version, userAgent, includePrerelease) { return __awaiter(this, void 0, void 0, function* () { - const validVersion = semver.validRange(version); // "latest" will return invalid but that's ok because we'll select it by default + const validVersion = semver.validRange(version, { includePrerelease, loose: true }); // "latest" will return invalid but that's ok because we'll select it by default const indexUrl = `${releasesUrl}/${product}/index.json`; const headers = userAgent ? { 'User-Agent': userAgent } : null; const body = yield utils_1.httpsRequest(indexUrl, { headers }); const response = JSON.parse(body); let release; - if (!validVersion) { // pick the latest release - version = Object.keys(response.versions).sort(semver.rcompare)[0]; + if (!validVersion) { // pick the latest release (prereleases will be skipped for safety, set an explicit version instead) + const releaseVersions = Object.keys(response.versions).filter(v => !semver.prerelease(v)); + version = releaseVersions.sort((a, b) => semver.rcompare(a, b))[0]; release = new Release(response.versions[version]); } else { - release = matchVersion(response.versions, validVersion); + release = matchVersion(response.versions, validVersion, includePrerelease); } return release; }); } exports.getRelease = getRelease; -function matchVersion(versions, range) { - const version = semver.maxSatisfying(Object.keys(versions), range); +function matchVersion(versions, range, includePrerelease) { + // If a prerelease version range is given, it will match in that series (0.14-rc0, 0.14-rc1) + // https://www.npmjs.com/package/semver#prerelease-tags + const version = semver.maxSatisfying(Object.keys(versions), range, { includePrerelease }); if (version) { return new Release(versions[version]); } diff --git a/lib/setup-terraform.js b/lib/setup-terraform.js index c97bf1d..2f0b8bf 100644 --- a/lib/setup-terraform.js +++ b/lib/setup-terraform.js @@ -117,7 +117,7 @@ async function run () { const osArch = os.arch(); core.debug(`Finding releases for Terraform version ${version}`); - const release = await releases.getRelease('terraform', version); + const release = await releases.getRelease('terraform', version, 'GitHub Action: Setup Terraform'); const platform = mapOS(osPlatform); const arch = mapArch(osArch); core.debug(`Getting build for Terraform version ${release.version}: ${platform} ${arch}`); diff --git a/package-lock.json b/package-lock.json index 3128fa3..574ba2e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -808,9 +808,9 @@ } }, "@hashicorp/js-releases": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@hashicorp/js-releases/-/js-releases-1.1.0.tgz", - "integrity": "sha512-Dk6k9nuAZUwRbtLcUFXDSPECuK9Xh6QPt2x2qv8m2DKz7ksY1jv7YnZAYk/H195Eq2Puxd4UK83XSA9PnWdQKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@hashicorp/js-releases/-/js-releases-1.2.0.tgz", + "integrity": "sha512-SXMzKOVdLKHRGSpCVowKC2vUAsvc/cZm0WRd5mOiDn/7SkTC9hFIuGUo/e8yXriJj/FbZepm/30cTKBWY/qH5w==", "requires": { "@types/semver": "^7.3.1", "del": "^5.1.0", @@ -5968,9 +5968,9 @@ "dev": true }, "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==" }, "safe-buffer": { "version": "5.1.2", diff --git a/package.json b/package.json index 57a1cd3..3f17f7e 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@actions/github": "^4.0.0", "@actions/io": "^1.0.2", "@actions/tool-cache": "^1.6.1", - "@hashicorp/js-releases": "^1.1.0" + "@hashicorp/js-releases": "^1.2.0" }, "devDependencies": { "@zeit/ncc": "0.22.1",