alz/azuredevops/pipelines/terraform/templates/helpers/terraform-installer.yaml (106 lines of code) (raw):

--- parameters: - name: terraformVersion default: 'latest' steps: - pwsh: | $TF_VERSION = $env:TF_VERSION $TOOLS_PATH = $env:TOOLS_PATH $release = $null if($TF_VERSION -eq "latest") { $versionResponse = Invoke-WebRequest -Uri "https://api.releases.hashicorp.com/v1/releases/terraform?limit=20" if($versionResponse.StatusCode -ne "200") { throw "Unable to query Terraform version, please check your internet connection and try again..." } $releases = ($versionResponse).Content | ConvertFrom-Json | Where-Object -Property is_prerelease -EQ $false $release = $releases[0] $TF_VERSION = $releases[0].version } else { $versionResponse = Invoke-WebRequest -Uri "https://api.releases.hashicorp.com/v1/releases/terraform/$($TF_VERSION)" if($versionResponse.StatusCode -ne "200") { throw "Unable to query Terraform version, please check the supplied version and try again..." } $release = ($versionResponse).Content | ConvertFrom-Json } $commandDetails = Get-Command -Name terraform -ErrorAction SilentlyContinue if($commandDetails) { Write-Host "Terraform already installed in $($commandDetails.Path), checking version" $installedVersion = terraform version -json | ConvertFrom-Json Write-Host "Installed version: $($installedVersion.terraform_version) on $($installedVersion.platform)" if($installedVersion.terraform_version -eq $TF_VERSION) { Write-Host "Installed version matches required version $TF_VERSION, skipping install" return } } $unzipdir = Join-Path -Path $TOOLS_PATH -ChildPath "terraform_$TF_VERSION" if (Test-Path $unzipdir) { Write-Host "Terraform $TF_VERSION already installed." if($os -eq "windows") { $env:PATH = "$($unzipdir);$env:PATH" } else { $env:PATH = "$($unzipdir):$env:PATH" } Write-Host "##vso[task.setvariable variable=PATH]$env:PATH" return } $os = "" if ($IsWindows) { $os = "windows" } if($IsLinux) { $os = "linux" } if($IsMacOS) { $os = "darwin" } # Enum values can be seen here: https://learn.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.architecture?view=net-7.0#fields $architecture = ([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture).ToString().ToLower() if($architecture -eq "x64") { $architecture = "amd64" } if($architecture -eq "x86") { $architecture = "386" } $osAndArchitecture = "$($os)_$($architecture)" $supportedOsAndArchitectures = @( "darwin_amd64", "darwin_arm64", "linux_386", "linux_amd64", "linux_arm64", "windows_386", "windows_amd64" ) if($supportedOsAndArchitectures -notcontains $osAndArchitecture) { Write-Error "Unsupported OS and architecture combination: $osAndArchitecture" exit 1 } $zipfilePath = "$unzipdir.zip" $url = $release.builds | Where-Object { $_.arch -eq $architecture -and $_.os -eq $os } | Select-Object -First 1 -ExpandProperty url if(!(Test-Path $TOOLS_PATH)) { New-Item -ItemType Directory -Path $TOOLS_PATH| Out-String | Write-Verbose } Invoke-WebRequest -Uri $url -OutFile "$zipfilePath" | Out-String | Write-Verbose Expand-Archive -Path $zipfilePath -DestinationPath $unzipdir $toolFileName = "terraform" if($os -eq "windows") { $toolFileName = "$($toolFileName).exe" } $toolFilePath = Join-Path -Path $unzipdir -ChildPath $toolFileName if($os -ne "windows") { $isExecutable = $(test -x $toolFilePath; 0 -eq $LASTEXITCODE) if(!($isExecutable)) { chmod +x $toolFilePath } } if($os -eq "windows") { $env:PATH = "$($unzipdir);$env:PATH" } else { $env:PATH = "$($unzipdir):$env:PATH" } Write-Host "##vso[task.setvariable variable=PATH]$env:PATH" Remove-Item $zipfilePath Write-Host "Installed Terraform version $TF_VERSION" displayName: Install Terraform env: TF_VERSION: $${{ parameters.terraformVersion }} TOOLS_PATH: $(Agent.ToolsDirectory)