forked from actions/runner-images
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Python tools installation from Github releases for Windows (actio…
…ns#705) * Add Toolset provision for Windows Co-authored-by: MaksimZhukov <v-mazhuk@microsoft.com>
- Loading branch information
Showing
12 changed files
with
303 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
################################################################################ | ||
## File: Install-Toolset.ps1 | ||
## Team: CI-Build | ||
## Desc: Install toolset | ||
################################################################################ | ||
|
||
Function Install-Asset { | ||
param( | ||
[Parameter(Mandatory=$true)] | ||
[object] $ReleaseAsset | ||
) | ||
|
||
$releaseAssetName = [System.IO.Path]::GetFileNameWithoutExtension($ReleaseAsset.filename) | ||
$assetFolderPath = Join-Path $env:TEMP $releaseAssetName | ||
$assetArchivePath = Start-DownloadWithRetry -Url $ReleaseAsset.download_url -Name $ReleaseAsset.filename | ||
|
||
Write-Host "Extract $($ReleaseAsset.filename) content..." | ||
7z.exe x $assetArchivePath -o"$assetFolderPath" -y | Out-Null | ||
|
||
Write-Host "Invoke installation script..." | ||
Push-Location -Path $assetFolderPath | ||
Invoke-Expression .\setup.ps1 | ||
Pop-Location | ||
} | ||
|
||
Function Set-DefaultPythonVersion { | ||
param( | ||
[Parameter(Mandatory=$true)] | ||
[object[]] $Toolset | ||
) | ||
|
||
$python = $Toolset | Where-Object { ($_.name -eq "Python") -and ($_.default -ne "") } ` | ||
| Select-Object default, arch -First 1 | ||
|
||
if ($python.default -ne $null) { | ||
$pythonPath = Join-Path $Env:AGENT_TOOLSDIRECTORY "/Python/$($python.default)/$($python.arch)" -Resolve | ||
|
||
Write-Host "Use Python $($python.default) as a system Python" | ||
Add-MachinePathItem -PathItem $pythonPath | ||
Add-MachinePathItem -PathItem "$pythonPath\Scripts" | ||
} else { | ||
Write-Host "Default Python version not found in toolset file!" | ||
} | ||
} | ||
|
||
$ErrorActionPreference = "Stop" | ||
|
||
Import-Module -Name ImageHelpers -Force | ||
|
||
# Get toolcache content from toolset | ||
$tools = Get-ToolsetContent | Select-Object -ExpandProperty toolcache | ||
|
||
foreach ($tool in $tools) { | ||
# Get versions manifest for current tool | ||
$assets = Invoke-RestMethod $tool.url | ||
|
||
# Get github release asset for each version | ||
foreach ($toolVersion in $tool.versions) { | ||
$asset = $assets | Where-Object version -like $toolVersion ` | ||
| Sort-Object -Property {[version]$_.version} -Descending ` | ||
| Select-Object -ExpandProperty files ` | ||
| Where-Object { ($_.platform -eq $tool.platform) -and ($_.arch -eq $tool.arch) } ` | ||
| Select-Object -First 1 | ||
|
||
Write-Host "Installing $($tool.name) $toolVersion $($tool.arch)..." | ||
if ($asset -ne $null) { | ||
Install-Asset -ReleaseAsset $asset | ||
} else { | ||
Write-Host "Asset was not found in versions manifest" | ||
exit 1 | ||
} | ||
} | ||
} | ||
|
||
# Install default python version | ||
Set-DefaultPythonVersion -Toolset $tools |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
################################################################################ | ||
## File: Validate-Toolset.ps1 | ||
## Team: CI-Build | ||
## Desc: Validate Toolset | ||
################################################################################ | ||
|
||
function Run-ExecutableTests { | ||
param ( | ||
[Parameter(Mandatory)] [string[]] $Executables, | ||
[Parameter(Mandatory)] [string] $ToolPath | ||
) | ||
|
||
foreach ($executable in $Executables) { | ||
$executablePath = Join-Path $ToolPath $executable | ||
|
||
Write-Host "Check $executable..." | ||
if (Test-Path $executablePath) { | ||
Write-Host "$executable is successfully installed: $(& $executablePath --version)" | ||
} else { | ||
Write-Host "$executablePath is not installed!" | ||
exit 1 | ||
} | ||
} | ||
} | ||
|
||
function Validate-SystemDefaultTool { | ||
param ( | ||
[Parameter(Mandatory)] [string] $ToolName, | ||
[Parameter(Mandatory)] [string] $ExpectedVersion | ||
) | ||
|
||
$binName = $ToolName.ToLower() | ||
|
||
# Check if tool on path | ||
if (Get-Command -Name $binName) { | ||
$versionOnPath = $(& $binName --version 2>&1) | Select-String -Pattern ".*(\d+\.\d+\.\d+)" | ||
$versionBinPath = Split-Path -Path (Get-Command -Name $binName).Path | ||
|
||
# Check if version is correct | ||
if ($versionOnPath.matches.Groups[1].Value -notlike $ExpectedVersion) { | ||
Write-Error "$ToolName $ExpectedVersion is not in the PATH" | ||
exit 1 | ||
} | ||
|
||
Write-Host "$ToolName $versionOnPath on path" | ||
} else { | ||
Write-Host "$ToolName is not on path" | ||
exit 1 | ||
} | ||
|
||
# Add default version description to markdown | ||
$description = "<br/>__System default version:__ $versionOnPath<br/>" | ||
$description += "_Environment:_<br/>" | ||
$description += "* Location: $versionBinPath<br/>" | ||
$description += "* PATH: contains the location of $versionOnPath<br/>" | ||
|
||
return $description | ||
} | ||
|
||
$ErrorActionPreference = "Stop" | ||
|
||
Import-Module -Name ImageHelpers -Force | ||
|
||
# Define executables for cached tools | ||
$toolsExecutables = @{ Python = @("python.exe", "Scripts\pip.exe") } | ||
|
||
# Get toolcache content from toolset | ||
$tools = Get-ToolsetContent | Select-Object -ExpandProperty toolcache | ||
|
||
foreach($tool in $tools) { | ||
$markdownDescription = "" | ||
|
||
$toolPath = Join-Path $env:AGENT_TOOLSDIRECTORY $tool.name | ||
# Get executables for current tool | ||
$toolExecs = $toolsExecutables[$tool.name] | ||
|
||
foreach ($version in $tool.versions) { | ||
# Check if version folder exists | ||
$expectedVersionPath = Join-Path $toolPath $version | ||
if (-not (Test-Path $expectedVersionPath)) { | ||
Write-Host "Expected $($tool.name) $version folder is not found!" | ||
exit 1 | ||
} | ||
|
||
# Take latest installed version in case if toolset version contains wildcards | ||
$foundVersion = Get-Item $expectedVersionPath ` | ||
| Sort-Object -Property {[version]$_.name} -Descending ` | ||
| Select-Object -First 1 | ||
|
||
# Check for required architecture folder | ||
$foundVersionArchPath = Join-Path $foundVersion $tool.arch | ||
if (-not (Test-Path $foundVersionArchPath)) { | ||
Write-Host "Expected $($tool.name)($($tool.arch)) $($foundVersion.name) architecture folder is not found!" | ||
exit 1 | ||
} | ||
|
||
Write-Host "Run validation test for $($tool.name)($($tool.arch)) $($foundVersion.name) executables..." | ||
Run-ExecutableTests -Executables $toolExecs -ToolPath $foundVersionArchPath | ||
|
||
# Add to tool version to markdown | ||
$markdownDescription += "_Version:_ $($foundVersion.name)<br/>" | ||
} | ||
|
||
# Create markdown description for system default tool | ||
if (-not ([string]::IsNullOrEmpty($tool.default))) { | ||
Write-Host "Validate system default $($tool.name)($($tool.arch)) $($tool.default)..." | ||
$markdownDescription += Validate-SystemDefaultTool -ToolName $tool.name -ExpectedVersion $tool.default | ||
} | ||
|
||
Add-SoftwareDetailsToMarkdown -SoftwareName "$($tool.name) ($($tool.arch))" -DescriptionMarkdown $markdownDescription | ||
} |
Oops, something went wrong.