diff --git a/action.yml b/action.yml index 0077ecd7..0edea86a 100644 --- a/action.yml +++ b/action.yml @@ -11,7 +11,9 @@ inputs: required: false terraform_version: description: 'The version of Terraform CLI to install. Instead of full version string you can also specify constraint string starting with "<" (for example `<1.13.0`) to install the latest version satisfying the constraint. A value of `latest` will install the latest version of Terraform CLI. Defaults to `latest`.' - default: 'latest' + required: false + terraform_version_file: + description: 'The version of Terraform CLI to install, specify the path of your terraform version file.' required: false terraform_wrapper: description: 'Whether or not to install a wrapper to wrap subsequent calls of the `terraform` binary and expose its STDOUT, STDERR, and exit code as outputs named `stdout`, `stderr`, and `exitcode` respectively. Defaults to `true`.' diff --git a/dist/index.js b/dist/index.js index ff3d27a9..a1471c43 100644 --- a/dist/index.js +++ b/dist/index.js @@ -125,11 +125,48 @@ credentials "${credentialsHostname}" { core.debug(`Adding credentials to ${credsFile}`); await fs.writeFile(credsFile, creds); } +async function isVersionFileExist(versionFilePath) { + try { + await fs.access(versionFilePath); + return true; + } catch (err) { + return false; + } +} +async function resolveVersionInput() { + let version = core.getInput("terraform_version"); + const versionFileInput = core.getInput("terraform_version_file"); + if (version && versionFileInput) { + core.warning( + "Both terraform_version and terraform_version_file inputs are specified, only terraform_version will be used" + ); + } + if (version) { + return version; + } + if (versionFileInput) { + const versionFilePath = path.join( + process.env.GITHUB_WORKSPACE, + versionFileInput + ); + const fileExists = await isVersionFileExist(versionFilePath); + if (!fileExists) { + throw new Error( + `The specified terraform version file at: ${versionFilePath} does not exist` + ); + } + + version = await fs.readFile(versionFilePath, "utf-8"); + + core.info(`Resolved ${versionFileInput} as ${version}`); + } + return version || "latest"; +} async function run () { try { // Gather GitHub Actions inputs - const version = core.getInput('terraform_version'); + const version = await resolveVersionInput(); const credentialsHostname = core.getInput('cli_config_credentials_hostname'); const credentialsToken = core.getInput('cli_config_credentials_token'); const wrapper = core.getInput('terraform_wrapper') === 'true'; diff --git a/lib/setup-terraform.js b/lib/setup-terraform.js index 3e726cfa..f8d66f35 100644 --- a/lib/setup-terraform.js +++ b/lib/setup-terraform.js @@ -119,11 +119,48 @@ credentials "${credentialsHostname}" { core.debug(`Adding credentials to ${credsFile}`); await fs.writeFile(credsFile, creds); } +async function isVersionFileExist(versionFilePath) { + try { + await fs.access(versionFilePath); + return true; + } catch (err) { + return false; + } +} +async function resolveVersionInput() { + let version = core.getInput("terraform_version"); + const versionFileInput = core.getInput("terraform_version_file"); + if (version && versionFileInput) { + core.warning( + "Both terraform_version and terraform_version_file inputs are specified, only terraform_version will be used" + ); + } + if (version) { + return version; + } + if (versionFileInput) { + const versionFilePath = path.join( + process.env.GITHUB_WORKSPACE, + versionFileInput + ); + const fileExists = await isVersionFileExist(versionFilePath); + if (!fileExists) { + throw new Error( + `The specified terraform version file at: ${versionFilePath} does not exist` + ); + } + + version = await fs.readFile(versionFilePath, "utf-8"); + + core.info(`Resolved ${versionFileInput} as ${version}`); + } + return version || "latest"; +} async function run () { try { // Gather GitHub Actions inputs - const version = core.getInput('terraform_version'); + const version = await resolveVersionInput(); const credentialsHostname = core.getInput('cli_config_credentials_hostname'); const credentialsToken = core.getInput('cli_config_credentials_token'); const wrapper = core.getInput('terraform_wrapper') === 'true';