diff --git a/images/win/Windows2016-Azure.json b/images/win/Windows2016-Azure.json index e24bd75e..47bcdbd4 100644 --- a/images/win/Windows2016-Azure.json +++ b/images/win/Windows2016-Azure.json @@ -28,7 +28,9 @@ "capture_name_prefix": "packer", "image_version": "dev", "image_os": "win16", - "github_feed_token": "{{env `GITHUB_FEED_TOKEN`}}" + "github_feed_token": "{{env `GITHUB_FEED_TOKEN`}}", + "go_versions": "1.9, 1.10, 1.11, 1.12, 1.13, 1.14", + "go_default": "1.14" }, "sensitive-variables": ["install_password", "ssh_password", "client_secret", "github_feed_token"], "builders": [ @@ -342,8 +344,8 @@ { "type": "powershell", "environment_vars": [ - "GO_VERSIONS=1.9.7,1.10.8,1.11.12,1.12.7,1.13", - "GO_DEFAULT=1.12.7" + "GO_VERSIONS={{user `go_versions`}}", + "GO_DEFAULT={{user `go_default`}}" ], "scripts":[ "{{ template_dir }}/scripts/Installers/Install-Go.ps1" @@ -651,8 +653,8 @@ { "type": "powershell", "environment_vars": [ - "GO_VERSIONS=1.9.7,1.10.8,1.11.12,1.12.7,1.13", - "GO_DEFAULT=1.12.7" + "GO_VERSIONS={{user `go_versions`}}", + "GO_DEFAULT={{ user `go_default`}}" ], "scripts":[ "{{ template_dir }}/scripts/Installers/Validate-Go.ps1" diff --git a/images/win/Windows2019-Azure.json b/images/win/Windows2019-Azure.json index 668451eb..e1e91ac5 100644 --- a/images/win/Windows2019-Azure.json +++ b/images/win/Windows2019-Azure.json @@ -28,7 +28,9 @@ "capture_name_prefix": "packer", "image_version": "dev", "image_os": "win19", - "github_feed_token": "{{env `GITHUB_FEED_TOKEN`}}" + "github_feed_token": "{{env `GITHUB_FEED_TOKEN`}}", + "go_versions": "1.9, 1.10, 1.11, 1.12, 1.13, 1.14", + "go_default": "1.14" }, "sensitive-variables": ["install_password", "ssh_password", "client_secret", "github_feed_token"], "builders": [ @@ -317,8 +319,8 @@ { "type": "powershell", "environment_vars": [ - "GO_VERSIONS=1.10.8,1.11.12,1.12.7,1.13", - "GO_DEFAULT=1.12.7" + "GO_VERSIONS={{user `go_versions`}}", + "GO_DEFAULT={{user `go_default`}}" ], "scripts":[ "{{ template_dir }}/scripts/Installers/Install-Go.ps1" @@ -638,8 +640,8 @@ { "type": "powershell", "environment_vars": [ - "GO_VERSIONS=1.10.8,1.11.12,1.12.7,1.13", - "GO_DEFAULT=1.12.7" + "GO_VERSIONS={{user `go_versions`}}", + "GO_DEFAULT={{user `go_default`}}" ], "scripts":[ "{{ template_dir }}/scripts/Installers/Validate-Go.ps1" diff --git a/images/win/scripts/Installers/Install-Go.ps1 b/images/win/scripts/Installers/Install-Go.ps1 index c33baeca..db186186 100644 --- a/images/win/scripts/Installers/Install-Go.ps1 +++ b/images/win/scripts/Installers/Install-Go.ps1 @@ -5,6 +5,7 @@ Import-Module -Name ImageHelpers -Force +$refsJson = Invoke-RestMethod "https://api.github.com/repos/golang/go/git/refs/tags" function Install-GoVersion { Param @@ -13,17 +14,20 @@ function Install-GoVersion [Switch]$addToDefaultPath ) + $latestVersionObject = $refsJson | Where-Object { $_.ref -Match "refs/tags/go$goVersion[./d]*" } | Select-Object -Last 1 + $latestVersion = $latestVersionObject.ref.replace('refs/tags/go','') + # Download the Go zip archive. - Write-Host "Downloading Go $goVersion..." + Write-Host "Downloading Go $latestVersion..." $ProgressPreference = 'SilentlyContinue' - Invoke-WebRequest -UseBasicParsing -Uri "https://dl.google.com/go/go$goVersion.windows-amd64.zip" -OutFile go$goVersion.windows-amd64.zip + Invoke-WebRequest -UseBasicParsing -Uri "https://dl.google.com/go/go$latestVersion.windows-amd64.zip" -OutFile go$latestVersion.windows-amd64.zip # Extract the zip archive. It contains a single directory named "go". - Write-Host "Extracting Go $goVersion..." - Expand-Archive -Path go$goVersion.windows-amd64.zip -DestinationPath "C:\" -Force + Write-Host "Extracting Go $latestVersion..." + Expand-Archive -Path go$latestVersion.windows-amd64.zip -DestinationPath "C:\" -Force # Delete unnecessary files to conserve space - Write-Host "Cleaning directories of Go $goVersion..." + Write-Host "Cleaning directories of Go $latestVersion..." if (Test-Path "C:\go\doc") { Remove-Item -Recurse -Force "C:\go\doc" @@ -34,17 +38,17 @@ function Install-GoVersion } # Rename the extracted "go" directory to include the Go version number (to support side-by-side versions of Go). - $newDirName = "Go$goVersion" + $newDirName = "Go$latestVersion" Rename-Item -path "C:\go" -newName $newDirName # Delete the Go zip archive. - Write-Host "Deleting downloaded archive of Go $goVersion..." - Remove-Item go$goVersion.windows-a`md64.zip + Write-Host "Deleting downloaded archive of Go $latestVersion..." + Remove-Item go$latestVersion.windows-amd64.zip # Make this the default version of Go? if ($addToDefaultPath) { - Write-Host "Adding Go $goVersion to the path..." + Write-Host "Adding Go $latestVersion to the path..." # Add the Go binaries to the path. Add-MachinePathItem "C:\$newDirName\bin" | Out-Null # Set the GOROOT environment variable. @@ -52,12 +56,12 @@ function Install-GoVersion } # Done - Write-Host "Done installing Go $goVersion." + Write-Host "Done installing Go $latestVersion." return "C:\$newDirName" } # Install Go -$goVersionsToInstall = $env:GO_VERSIONS.split(",") +$goVersionsToInstall = $env:GO_VERSIONS.split(", ", [System.StringSplitOptions]::RemoveEmptyEntries) foreach($go in $goVersionsToInstall) { Write-Host "Installing Go ${go}" @@ -66,6 +70,6 @@ foreach($go in $goVersionsToInstall) { } else { $installDirectory = Install-GoVersion -goVersion $go } - $envName = "GOROOT_{0}_{1}_X64" -f $go.split(".") + $envName = "GOROOT_{0}_{1}_X64" -f $go.split(".") setx $envName "$installDirectory" /M } diff --git a/images/win/scripts/Installers/Validate-Go.ps1 b/images/win/scripts/Installers/Validate-Go.ps1 index 5ff3ad16..059ea8fa 100644 --- a/images/win/scripts/Installers/Validate-Go.ps1 +++ b/images/win/scripts/Installers/Validate-Go.ps1 @@ -8,18 +8,31 @@ function Get-GoVersion { Param ( - [String]$goRootPath + [String]$goVersion ) + Write-Host "Check if $goVersion is presented in the system" + $DestinationPath = "$($env:SystemDrive)\" + $goDirectory = Get-ChildItem -Path $DestinationPath -Filter "Go$goVersion*" | Select-Object -First 1 + $goPath = Join-Path $env:SystemDrive $goDirectory - $env:Path = "$goRootPath\bin;" + $env:Path - if( $(go version) -match 'go version go(?.*) win.*' ) + $env:Path = "$goPath\bin;" + $env:Path + $version = $(go version) + + $matchVersion = $version -match $goVersion + $semanticEquality = $version -match 'go version go(?.*) win.*' + + if($semanticEquality -And $matchVersion) { - $goVersion = $Matches.version - return $goVersion - } + $goFullVersion = $Matches.version + Write-Host "$goFullVersion has been found" - Write-Host "Unable to determine Go version at " + $goRootPath - return "" + return $goFullVersion + } + else + { + Write-Host "Unable to determine Go version at " + $goPath + exit 1 + } } # Verify that go.exe is on the path @@ -53,10 +66,10 @@ _Environment:_ $SoftwareName = "Go (x64)" $Description = New-Object System.Text.StringBuilder -$goVersionsToInstall = $env:GO_VERSIONS.split(",") +$goVersionsToInstall = $env:GO_VERSIONS.split(", ", [System.StringSplitOptions]::RemoveEmptyEntries) foreach($go in $goVersionsToInstall) { - $goVersion = Get-GoVersion -goRootPath "C:\Go${go}" + $goVersion = Get-GoVersion -goVersion $go $goVersionTag = "GOROOT_{0}_{1}_X64" -f $go.split(".") if ($goVersion -eq $go) { if($go -eq $env:GO_DEFAULT) {