mirror of
https://github.com/hashicorp/setup-terraform.git
synced 2025-12-16 00:22:34 +00:00
Switch to @hashicorp/js-releases for finding correct package to install (#70)
This commit is contained in:
parent
4c5048fbaf
commit
32c4f59108
5 changed files with 48794 additions and 4682 deletions
22
.github/workflows/setup-terraform.yml
vendored
22
.github/workflows/setup-terraform.yml
vendored
|
|
@ -21,6 +21,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform - ${{ matrix['terraform-versions'] }}
|
||||
uses: ./
|
||||
|
|
@ -45,6 +47,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform (no wrapper) - ${{ matrix['terraform-versions'] }}
|
||||
uses: ./
|
||||
|
|
@ -70,6 +74,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform - ${{ matrix['terraform-versions'] }}
|
||||
uses: ./
|
||||
|
|
@ -89,6 +95,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform (no wrapper) - ${{ matrix['terraform-versions'] }}
|
||||
uses: ./
|
||||
|
|
@ -110,6 +118,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -139,6 +149,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -167,6 +179,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -190,6 +204,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -221,6 +237,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -257,6 +275,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
@ -290,6 +310,8 @@ jobs:
|
|||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Setup Terraform
|
||||
uses: ./
|
||||
|
|
|
|||
47684
dist/index.js
vendored
47684
dist/index.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -7,60 +7,7 @@ const path = require('path');
|
|||
const core = require('@actions/core');
|
||||
const tc = require('@actions/tool-cache');
|
||||
const io = require('@actions/io');
|
||||
const fetch = require('node-fetch');
|
||||
const semver = require('semver');
|
||||
|
||||
// Find latest version given list of all available
|
||||
function findLatest (allVersions) {
|
||||
core.debug('Parsing version list for latest version');
|
||||
|
||||
let latest = '0.0.0';
|
||||
|
||||
for (const version in allVersions.versions) {
|
||||
// Ignore pre-release
|
||||
if (semver.prerelease(version) !== null) {
|
||||
continue;
|
||||
}
|
||||
// is "version" greater than "latest"
|
||||
latest = semver.gt(version, latest) ? version : latest;
|
||||
}
|
||||
|
||||
core.info(`Latest version is ${latest}`);
|
||||
|
||||
return allVersions.versions[latest];
|
||||
}
|
||||
|
||||
// Find specific version given list of all available
|
||||
function findSpecific (allVersions, version) {
|
||||
core.debug(`Parsing version list for version ${version}`);
|
||||
return allVersions.versions[version];
|
||||
}
|
||||
|
||||
// Find specific version given list of all available
|
||||
function findLatestMatchingSpecification (allVersions, version) {
|
||||
core.debug(`Parsing version list for latest matching specification ${version}`);
|
||||
const versionList = [];
|
||||
for (const _version in allVersions.versions) {
|
||||
versionList.push(_version);
|
||||
}
|
||||
const bestMatchVersion = semver.maxSatisfying(versionList, version);
|
||||
if (!bestMatchVersion) {
|
||||
throw new Error(`Could not find Terraform version matching ${version} in version list`);
|
||||
}
|
||||
core.info(`Latest version satisfying ${version} is ${bestMatchVersion}`);
|
||||
|
||||
return allVersions.versions[bestMatchVersion];
|
||||
}
|
||||
|
||||
async function downloadMetadata () {
|
||||
core.debug('Downloading version metadata');
|
||||
|
||||
return fetch('https://releases.hashicorp.com/terraform/index.json')
|
||||
.then(res => res.json())
|
||||
.catch(err => {
|
||||
core.setFailed(`Failed to fetch version metadata. ${err}`);
|
||||
});
|
||||
}
|
||||
const releases = require('@hashicorp/js-releases');
|
||||
|
||||
// arch in [arm, x32, x64...] (https://nodejs.org/api/os.html#os_os_arch)
|
||||
// return value in [amd64, 386, arm]
|
||||
|
|
@ -81,23 +28,6 @@ function mapOS (os) {
|
|||
return mappings[os] || os;
|
||||
}
|
||||
|
||||
// Get build for an operating system and architecture
|
||||
function getBuild (versionObj, os, arch) {
|
||||
core.debug(`Getting build for Terraform version ${versionObj.version}, os ${os}, and arch ${arch}`);
|
||||
|
||||
const buildObj = versionObj.builds.length &&
|
||||
versionObj.builds.find(build =>
|
||||
build.arch === mapArch(arch) &&
|
||||
build.os === mapOS(os)
|
||||
);
|
||||
|
||||
if (!buildObj) {
|
||||
throw new Error(`Terraform version ${versionObj.version} not available for ${os} and ${arch}`);
|
||||
}
|
||||
|
||||
return buildObj;
|
||||
}
|
||||
|
||||
async function downloadCLI (url) {
|
||||
core.debug(`Downloading Terraform CLI from ${url}`);
|
||||
const pathToCLIZip = await tc.downloadTool(url);
|
||||
|
|
@ -183,23 +113,21 @@ async function run () {
|
|||
const wrapper = core.getInput('terraform_wrapper') === 'true';
|
||||
|
||||
// Gather OS details
|
||||
const osPlat = os.platform();
|
||||
const osPlatform = os.platform();
|
||||
const osArch = os.arch();
|
||||
|
||||
// Download metadata about all versions of Terraform CLI
|
||||
const versionMetadata = await downloadMetadata();
|
||||
|
||||
const specificMatch = findSpecific(versionMetadata, version);
|
||||
// Find latest or a specific version like 0.1.0
|
||||
const versionObj = version.toLowerCase() === 'latest'
|
||||
? findLatest(versionMetadata) : specificMatch || findLatestMatchingSpecification(versionMetadata, version);
|
||||
|
||||
if (versionObj) {
|
||||
// Get the build available for this runner's OS and a 64 bit architecture
|
||||
const buildObj = getBuild(versionObj, osPlat, osArch);
|
||||
core.debug(`Finding releases for Terraform version ${version}`);
|
||||
const release = await releases.getRelease('terraform', version);
|
||||
const platform = mapOS(osPlatform);
|
||||
const arch = mapArch(osArch);
|
||||
core.debug(`Getting build for Terraform version ${release.version}: ${platform} ${arch}`);
|
||||
const build = release.getBuild(platform, arch);
|
||||
if (!build) {
|
||||
throw new Error(`Terraform version ${version} not available for ${platform} and ${arch}`);
|
||||
}
|
||||
|
||||
// Download requested version
|
||||
const pathToCLI = await downloadCLI(buildObj.url);
|
||||
const pathToCLI = await downloadCLI(build.url);
|
||||
|
||||
// Install our wrapper
|
||||
if (wrapper) {
|
||||
|
|
@ -211,12 +139,9 @@ async function run () {
|
|||
|
||||
// Add credentials to file if they are provided
|
||||
if (credentialsHostname && credentialsToken) {
|
||||
await addCredentials(credentialsHostname, credentialsToken, osPlat);
|
||||
}
|
||||
return versionObj;
|
||||
} else {
|
||||
core.setFailed(`Could not find Terraform version ${version} in version list`);
|
||||
await addCredentials(credentialsHostname, credentialsToken, osPlatform);
|
||||
}
|
||||
return release;
|
||||
} catch (error) {
|
||||
core.error(error);
|
||||
throw error;
|
||||
|
|
|
|||
5542
package-lock.json
generated
5542
package-lock.json
generated
File diff suppressed because it is too large
Load diff
13
package.json
13
package.json
|
|
@ -15,18 +15,17 @@
|
|||
"author": "",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.2.6",
|
||||
"@actions/github": "^2.1.1",
|
||||
"@actions/github": "^4.0.0",
|
||||
"@actions/io": "^1.0.2",
|
||||
"@actions/tool-cache": "^1.6.0",
|
||||
"node-fetch": "^2.6.1",
|
||||
"semver": "^7.3.2"
|
||||
"@actions/tool-cache": "^1.6.1",
|
||||
"@hashicorp/js-releases": "^1.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@zeit/ncc": "0.22.1",
|
||||
"husky": "^4.3.0",
|
||||
"jest": "^25.2.4",
|
||||
"nock": "^12.0.3",
|
||||
"semistandard": "^14.2.0"
|
||||
"jest": "^26.6.3",
|
||||
"nock": "^13.0.5",
|
||||
"semistandard": "^16.0.0"
|
||||
},
|
||||
"jest": {
|
||||
"testPathIgnorePatterns": [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue