2018-10-22 05:07:26 +00:00
<#
. SYNOPSIS
Entry point script for installing native tools
. DESCRIPTION
Reads $RepoRoot \ global . json file to determine native assets to install
and executes installers for those tools
. PARAMETER BaseUri
Base file directory or Url from which to acquire tool archives
. PARAMETER InstallDirectory
Directory to install native toolset . This is a command-line override for the default
Install directory precedence order :
- InstallDirectory command-line override
- NETCOREENG_INSTALL_DIRECTORY environment variable
- ( default ) % USERPROFILE % / . netcoreeng / native
. PARAMETER Clean
Switch specifying to not install anything , but cleanup native asset folders
. PARAMETER Force
Clean and then install tools
. PARAMETER DownloadRetries
Total number of retry attempts
. PARAMETER RetryWaitTimeInSeconds
Wait time between retry attempts in seconds
. PARAMETER GlobalJsonFile
File path to global . json file
2022-04-08 15:36:49 +00:00
. PARAMETER PathPromotion
Optional switch to enable either promote native tools specified in the global . json to the path ( in Azure Pipelines )
or break the build if a native tool is not found on the path ( on a local dev machine )
2018-10-22 05:07:26 +00:00
. NOTES
#>
[ CmdletBinding ( PositionalBinding = $false ) ]
Param (
2019-11-22 13:41:58 +00:00
[ string ] $BaseUri = 'https://netcorenativeassets.blob.core.windows.net/resource-packages/external' ,
2018-10-22 05:07:26 +00:00
[ string ] $InstallDirectory ,
[ switch ] $Clean = $False ,
[ switch ] $Force = $False ,
[ int ] $DownloadRetries = 5 ,
[ int ] $RetryWaitTimeInSeconds = 30 ,
2022-04-08 15:36:49 +00:00
[ string ] $GlobalJsonFile ,
[ switch ] $PathPromotion
2018-10-22 05:07:26 +00:00
)
2019-05-02 12:26:55 +00:00
if ( ! $GlobalJsonFile ) {
2019-11-22 13:41:58 +00:00
$GlobalJsonFile = Join-Path ( Get-Item $PSScriptRoot ) . Parent . Parent . FullName 'global.json'
2019-05-02 12:26:55 +00:00
}
2018-10-22 05:07:26 +00:00
Set-StrictMode -version 2.0
2019-11-22 13:41:58 +00:00
$ErrorActionPreference = 'Stop'
2018-10-22 05:07:26 +00:00
2019-11-22 13:41:58 +00:00
. $PSScriptRoot \ pipeline-logging -functions . ps1
Import-Module -Name ( Join-Path $PSScriptRoot 'native\CommonLibrary.psm1' )
2018-10-22 05:07:26 +00:00
try {
# Define verbose switch if undefined
2019-11-22 13:41:58 +00:00
$Verbose = $VerbosePreference -Eq 'Continue'
2018-10-22 05:07:26 +00:00
2019-11-22 13:41:58 +00:00
$EngCommonBaseDir = Join-Path $PSScriptRoot 'native\'
2018-10-22 05:07:26 +00:00
$NativeBaseDir = $InstallDirectory
if ( ! $NativeBaseDir ) {
$NativeBaseDir = CommonLibrary \ Get-NativeInstallDirectory
}
$Env:CommonLibrary_NativeInstallDir = $NativeBaseDir
2019-11-22 13:41:58 +00:00
$InstallBin = Join-Path $NativeBaseDir 'bin'
$InstallerPath = Join-Path $EngCommonBaseDir 'install-tool.ps1'
2018-10-22 05:07:26 +00:00
# Process tools list
Write-Host " Processing $GlobalJsonFile "
If ( -Not ( Test-Path $GlobalJsonFile ) ) {
Write-Host " Unable to find ' $GlobalJsonFile ' "
exit 0
}
$NativeTools = Get-Content ( $GlobalJsonFile ) -Raw |
ConvertFrom-Json |
2019-11-22 13:41:58 +00:00
Select-Object -Expand 'native-tools' -ErrorAction SilentlyContinue
2018-10-22 05:07:26 +00:00
if ( $NativeTools ) {
2022-04-08 15:36:49 +00:00
if ( $PathPromotion -eq $True ) {
if ( $env:SYSTEM_TEAMPROJECT ) { # check to see if we're in an Azure pipelines build
$NativeTools . PSObject . Properties | ForEach-Object {
$ToolName = $_ . Name
$ToolVersion = $_ . Value
2022-07-05 12:38:53 +00:00
$InstalledTools = @ { }
2022-04-08 15:36:49 +00:00
if ( ( Get-Command " $ToolName " -ErrorAction SilentlyContinue ) -eq $null ) {
if ( $ToolVersion -eq " latest " ) {
$ToolVersion = " "
}
$ArcadeToolsDirectory = " C:\arcade-tools "
2022-05-13 05:53:38 +00:00
if ( -not ( Test-Path $ArcadeToolsDirectory ) ) {
2022-04-08 15:36:49 +00:00
Write-Error " Arcade tools directory ' $ArcadeToolsDirectory ' was not found; artifacts were not properly installed. "
exit 1
2019-07-23 12:42:18 +00:00
}
2022-09-16 14:25:17 +00:00
$ToolDirectories = ( Get-ChildItem -Path " $ArcadeToolsDirectory " -Filter " $ToolName - $ToolVersion * " | Sort-Object -Descending )
if ( $ToolDirectories -eq $null ) {
2022-04-08 15:36:49 +00:00
Write-Error " Unable to find directory for $ToolName $ToolVersion ; please make sure the tool is installed on this image. "
exit 1
2019-07-23 12:42:18 +00:00
}
2022-09-16 14:25:17 +00:00
$ToolDirectory = $ToolDirectories [ 0 ]
2022-04-08 15:36:49 +00:00
$BinPathFile = " $( $ToolDirectory . FullName ) \binpath.txt "
2022-05-13 05:53:38 +00:00
if ( -not ( Test-Path -Path " $BinPathFile " ) ) {
2022-04-08 15:36:49 +00:00
Write-Error " Unable to find binpath.txt in ' $( $ToolDirectory . FullName ) ' ( $ToolName $ToolVersion ); artifact is either installed incorrectly or is not a bootstrappable tool. "
exit 1
}
$BinPath = Get-Content " $BinPathFile "
2022-05-13 05:53:38 +00:00
$ToolPath = Convert-Path -Path $BinPath
Write-Host " Adding $ToolName to the path ( $ToolPath )... "
Write-Host " ##vso[task.prependpath] $ToolPath "
2022-09-30 12:25:51 +00:00
$env:PATH = " $ToolPath ; $env:PATH "
2022-07-05 12:38:53 +00:00
$InstalledTools + = @ { $ToolName = $ToolDirectory . FullName }
2022-04-08 15:36:49 +00:00
}
}
2022-07-05 12:38:53 +00:00
return $InstalledTools
2022-04-08 15:36:49 +00:00
} else {
$NativeTools . PSObject . Properties | ForEach-Object {
$ToolName = $_ . Name
$ToolVersion = $_ . Value
if ( ( Get-Command " $ToolName " -ErrorAction SilentlyContinue ) -eq $null ) {
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message " $ToolName not found on path. Please install $ToolName $ToolVersion before proceeding. "
}
2019-03-20 21:42:05 +00:00
}
2022-04-08 15:36:49 +00:00
exit 0
}
} else {
$NativeTools . PSObject . Properties | ForEach-Object {
$ToolName = $_ . Name
$ToolVersion = $_ . Value
$LocalInstallerArguments = @ { ToolName = " $ToolName " }
$LocalInstallerArguments + = @ { InstallPath = " $InstallBin " }
$LocalInstallerArguments + = @ { BaseUri = " $BaseUri " }
$LocalInstallerArguments + = @ { CommonLibraryDirectory = " $EngCommonBaseDir " }
$LocalInstallerArguments + = @ { Version = " $ToolVersion " }
if ( $Verbose ) {
$LocalInstallerArguments + = @ { Verbose = $True }
}
if ( Get-Variable 'Force' -ErrorAction 'SilentlyContinue' ) {
if ( $Force ) {
$LocalInstallerArguments + = @ { Force = $True }
}
}
if ( $Clean ) {
$LocalInstallerArguments + = @ { Clean = $True }
}
Write-Verbose " Installing $ToolName version $ToolVersion "
Write-Verbose " Executing ' $InstallerPath $( $LocalInstallerArguments . Keys . ForEach ( { " - $_ ' $( $LocalInstallerArguments . $_ ) ' " } ) -join ' ' ) ' "
& $InstallerPath @LocalInstallerArguments
if ( $LASTEXITCODE -Ne " 0 " ) {
$errMsg = " $ToolName installation failed "
if ( ( Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue' ) -and $DoNotAbortNativeToolsInstallationOnFailure ) {
$showNativeToolsWarning = $true
if ( ( Get-Variable 'DoNotDisplayNativeToolsInstallationWarnings' -ErrorAction 'SilentlyContinue' ) -and $DoNotDisplayNativeToolsInstallationWarnings ) {
$showNativeToolsWarning = $false
}
if ( $showNativeToolsWarning ) {
Write-Warning $errMsg
}
$toolInstallationFailure = $true
} else {
# We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
Write-Host $errMsg
exit 1
}
}
}
if ( ( Get-Variable 'toolInstallationFailure' -ErrorAction 'SilentlyContinue' ) -and $toolInstallationFailure ) {
# We cannot change this to Write-PipelineTelemetryError because of https://github.com/dotnet/arcade/issues/4482
Write-Host 'Native tools bootstrap failed'
exit 1
2018-10-22 05:07:26 +00:00
}
2019-03-20 21:42:05 +00:00
}
2018-10-22 05:07:26 +00:00
}
else {
2019-11-22 13:41:58 +00:00
Write-Host 'No native tools defined in global.json'
2018-10-22 05:07:26 +00:00
exit 0
}
if ( $Clean ) {
exit 0
}
if ( Test-Path $InstallBin ) {
2019-11-22 13:41:58 +00:00
Write-Host 'Native tools are available from ' ( Convert-Path -Path $InstallBin )
2018-10-22 05:07:26 +00:00
Write-Host " ##vso[task.prependpath] $( Convert-Path -Path $InstallBin ) "
2019-10-24 22:05:36 +00:00
return $InstallBin
2018-10-22 05:07:26 +00:00
}
2022-05-13 05:53:38 +00:00
elseif ( -not ( $PathPromotion ) ) {
2019-11-22 13:41:58 +00:00
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message 'Native tools install directory does not exist, installation failed'
2018-10-22 05:07:26 +00:00
exit 1
}
exit 0
}
catch {
2019-11-22 13:41:58 +00:00
Write-Host $_ . ScriptStackTrace
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message $_
ExitWithExitCode 1
2018-10-22 05:07:26 +00:00
}