From 8c7b37733f4f411a0d56ed94a05e07f60fc420d3 Mon Sep 17 00:00:00 2001 From: Jared Cuffe Date: Wed, 3 Mar 2021 20:58:18 -0800 Subject: [PATCH] Uses tool cache - skips wrapper create on hit. --- dist/index.js | 44 ++++++++++++++++++++++++++++++++++-------- lib/setup-terraform.js | 44 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/dist/index.js b/dist/index.js index 9c5f3c03..55d1f55e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -34,6 +34,9 @@ const tc = __webpack_require__(7784); const io = __webpack_require__(7436); const releases = __webpack_require__(9947); +// Constants +const CACHE_KEY = 'terraform'; + // arch in [arm, x32, x64...] (https://nodejs.org/api/os.html#os_os_arch) // return value in [amd64, 386, arm] function mapArch (arch) { @@ -53,7 +56,8 @@ function mapOS (os) { return mappings[os] || os; } -async function downloadCLI (url) { +async function downloadCLI (url, version) { + // Look for CLI in the cache first core.debug(`Downloading Terraform CLI from ${url}`); const pathToCLIZip = await tc.downloadTool(url); @@ -65,7 +69,24 @@ async function downloadCLI (url) { throw new Error(`Unable to download Terraform from ${url}`); } - return pathToCLI; + // Cache for later + const cachedPath = await tc.cacheDir(pathToCLI, CACHE_KEY, version); + return cachedPath; +} + +async function checkWrapper (pathToCLI) { + const exeSuffix = os.platform().startsWith('win') ? '.exe' : ''; + const target = [pathToCLI, `terraform-bin${exeSuffix}`].join(path.sep); + + core.debug('Checking for existing wrapper'); + + const hasWrapper = io.which(target); + + if (hasWrapper) { + core.debug('Wrapper found, skipping creation.'); + } + + return hasWrapper; } async function installWrapper (pathToCLI) { @@ -95,9 +116,6 @@ async function installWrapper (pathToCLI) { core.error(`Unable to copy ${source} to ${target}.`); throw e; } - - // Export a new environment variable, so our wrapper can locate the binary - core.exportVariable('TERRAFORM_CLI_PATH', pathToCLI); } // Add credentials to CLI Configuration File @@ -151,14 +169,24 @@ async function run () { throw new Error(`Terraform version ${version} not available for ${platform} and ${arch}`); } - // Download requested version - const pathToCLI = await downloadCLI(build.url); + // Check cache for requested version, then download if not present + let pathToCLI = tc.find(CACHE_KEY, release.version, os.arch()); + + // Check to see if wrapper has been installed in a previous run + const hasWrapper = pathToCLI && checkWrapper(pathToCLI); + + if (!pathToCLI) { + pathToCLI = await downloadCLI(build.url, release.version); + } // Install our wrapper - if (wrapper) { + if (wrapper && !hasWrapper) { await installWrapper(pathToCLI); } + // Export a new environment variable, so our wrapper can locate the binary + core.exportVariable('TERRAFORM_CLI_PATH', pathToCLI); + // Add to path core.addPath(pathToCLI); diff --git a/lib/setup-terraform.js b/lib/setup-terraform.js index 2f0b8bf6..0f9801af 100644 --- a/lib/setup-terraform.js +++ b/lib/setup-terraform.js @@ -9,6 +9,9 @@ const tc = require('@actions/tool-cache'); const io = require('@actions/io'); const releases = require('@hashicorp/js-releases'); +// Constants +const CACHE_KEY = 'terraform'; + // arch in [arm, x32, x64...] (https://nodejs.org/api/os.html#os_os_arch) // return value in [amd64, 386, arm] function mapArch (arch) { @@ -28,7 +31,8 @@ function mapOS (os) { return mappings[os] || os; } -async function downloadCLI (url) { +async function downloadCLI (url, version) { + // Look for CLI in the cache first core.debug(`Downloading Terraform CLI from ${url}`); const pathToCLIZip = await tc.downloadTool(url); @@ -40,7 +44,24 @@ async function downloadCLI (url) { throw new Error(`Unable to download Terraform from ${url}`); } - return pathToCLI; + // Cache for later + const cachedPath = await tc.cacheDir(pathToCLI, CACHE_KEY, version); + return cachedPath; +} + +async function checkWrapper (pathToCLI) { + const exeSuffix = os.platform().startsWith('win') ? '.exe' : ''; + const target = [pathToCLI, `terraform-bin${exeSuffix}`].join(path.sep); + + core.debug('Checking for existing wrapper'); + + const hasWrapper = io.which(target); + + if (hasWrapper) { + core.debug('Wrapper found, skipping creation.'); + } + + return hasWrapper; } async function installWrapper (pathToCLI) { @@ -70,9 +91,6 @@ async function installWrapper (pathToCLI) { core.error(`Unable to copy ${source} to ${target}.`); throw e; } - - // Export a new environment variable, so our wrapper can locate the binary - core.exportVariable('TERRAFORM_CLI_PATH', pathToCLI); } // Add credentials to CLI Configuration File @@ -126,14 +144,24 @@ async function run () { throw new Error(`Terraform version ${version} not available for ${platform} and ${arch}`); } - // Download requested version - const pathToCLI = await downloadCLI(build.url); + // Check cache for requested version, then download if not present + let pathToCLI = tc.find(CACHE_KEY, release.version, os.arch()); + + // Check to see if wrapper has been installed in a previous run + const hasWrapper = pathToCLI && checkWrapper(pathToCLI); + + if (!pathToCLI) { + pathToCLI = await downloadCLI(build.url, release.version); + } // Install our wrapper - if (wrapper) { + if (wrapper && !hasWrapper) { await installWrapper(pathToCLI); } + // Export a new environment variable, so our wrapper can locate the binary + core.exportVariable('TERRAFORM_CLI_PATH', pathToCLI); + // Add to path core.addPath(pathToCLI);