eng/common/scripts/Helpers/AzSdkTool-Helpers.ps1 (172 lines of code) (raw):
Set-StrictMode -Version 4
function Get-SystemArchitecture {
$unameOutput = uname -m
switch ($unameOutput) {
"x86_64" { return "X86_64" }
"aarch64" { return "ARM64" }
"arm64" { return "ARM64" }
default { throw "Unable to determine system architecture. uname -m returned $unameOutput." }
}
}
function Get-Package-Meta(
[Parameter(mandatory = $true)]
$FileName,
[Parameter(mandatory = $true)]
$Package
) {
$ErrorActionPreferenceDefault = $ErrorActionPreference
$ErrorActionPreference = "Stop"
$AVAILABLE_BINARIES = @{
"Windows" = @{
"AMD64" = @{
"system" = "Windows"
"machine" = "AMD64"
"file_name" = "$FileName-standalone-win-x64.zip"
"executable" = "$Package.exe"
}
}
"Linux" = @{
"X86_64" = @{
"system" = "Linux"
"machine" = "X86_64"
"file_name" = "$FileName-standalone-linux-x64.tar.gz"
"executable" = "$Package"
}
"ARM64" = @{
"system" = "Linux"
"machine" = "ARM64"
"file_name" = "$FileName-standalone-linux-arm64.tar.gz"
"executable" = "$Package"
}
}
"Darwin" = @{
"X86_64" = @{
"system" = "Darwin"
"machine" = "X86_64"
"file_name" = "$FileName-standalone-osx-x64.zip"
"executable" = "$Package"
}
"ARM64" = @{
"system" = "Darwin"
"machine" = "ARM64"
"file_name" = "$FileName-standalone-osx-arm64.zip"
"executable" = "$Package"
}
}
}
if ($IsWindows) {
$os = "Windows"
# we only support x64 on windows, if that doesn't work the platform is unsupported
$machine = "AMD64"
}
elseif ($IsLinux) {
$os = "Linux"
$machine = Get-SystemArchitecture
}
elseif ($IsMacOS) {
$os = "Darwin"
$machine = Get-SystemArchitecture
}
else {
$os = "unknown"
}
$ErrorActionPreference = $ErrorActionPreferenceDefault
return $AVAILABLE_BINARIES[$os][$machine]
}
function Clear-Directory ($path) {
if (Test-Path -Path $path) {
Remove-Item -Path $path -Recurse -Force
}
New-Item -ItemType Directory -Path $path -Force
}
function isNewVersion(
[Parameter(mandatory = $true)]
$Version,
[Parameter(mandatory = $true)]
$Directory
) {
$savedVersionTxt = Join-Path $Directory "downloaded_version.txt"
if (Test-Path $savedVersionTxt) {
$result = (Get-Content -Raw $savedVersionTxt).Trim()
if ($result -eq $Version) {
return $false
}
}
return $true
}
<#
.SYNOPSIS
Installs a standalone version of an engsys tool.
.PARAMETER Version
The version of the tool to install. Requires a full version to be provided. EG "1.0.0-dev.20240617.1"
.PARAMETER Directory
The directory within which the exe will exist after this function invokes. Defaults to "."
#>
function Install-Standalone-Tool (
[Parameter()]
[string]$Version,
[Parameter(mandatory = $true)]
[string]$FileName,
[Parameter(mandatory = $true)]
[string]$Package,
[Parameter()]
[string]$Repository = "Azure/azure-sdk-tools",
[Parameter()]
$Directory = "."
) {
$ErrorActionPreference = "Stop"
$PSNativeCommandUseErrorActionPreference = $true
$systemDetails = Get-Package-Meta -FileName $FileName -Package $Package
if (!(Test-Path $Directory) -and $Directory -ne ".") {
New-Item -ItemType Directory -Path $Directory -Force | Out-Null
}
$tag = "${Package}_${Version}"
if (!$Version -or $Version -eq "*") {
Write-Host "Attempting to find latest version for package '$Package'"
$releasesUrl = "https://api.github.com/repos/$Repository/releases"
$releases = Invoke-RestMethod -Uri $releasesUrl
$found = $false
foreach ($release in $releases) {
if ($release.tag_name -like "$Package*") {
$tag = $release.tag_name
$Version = $release.tag_name -replace "${Package}_", ""
$found = $true
break
}
}
if ($found -eq $false) {
throw "No release found for package '$Package'"
}
}
$downloadFolder = Resolve-Path $Directory
$downloadUrl = "https://github.com/$Repository/releases/download/$tag/$($systemDetails.file_name)"
$downloadFile = $downloadUrl.Split('/')[-1]
$downloadLocation = Join-Path $downloadFolder $downloadFile
$savedVersionTxt = Join-Path $downloadFolder "downloaded_version.txt"
$executable_path = Join-Path $downloadFolder $systemDetails.executable
if (isNewVersion $version $downloadFolder) {
Write-Host "Installing '$Package' '$Version' to '$downloadFolder' from $downloadUrl"
Invoke-WebRequest -Uri $downloadUrl -OutFile $downloadLocation
if ($downloadFile -like "*.zip") {
Expand-Archive -Path $downloadLocation -DestinationPath $downloadFolder -Force
}
elseif ($downloadFile -like "*.tar.gz") {
tar -xzf $downloadLocation -C $downloadFolder
}
else {
throw "Unsupported file format"
}
# Remove the downloaded file after extraction
Remove-Item -Path $downloadLocation -Force
# Record downloaded version
Set-Content -Path $savedVersionTxt -Value $Version
# Set executable permissions if on macOS (Darwin)
if ($IsMacOS) {
chmod 755 $executable_path
}
}
else {
Write-Host "Target version '$Version' already present in target directory '$downloadFolder'"
}
return $executable_path
}