<# .SYNOPSIS The execute command and print all output to the logs #> function Execute-Command { [CmdletBinding()] param( [Parameter(Mandatory=$true)][string] $Command ) Write-Debug "Execute $Command" try { Invoke-Expression $Command | ForEach-Object { Write-Host $_ } if ($LASTEXITCODE -ne 0) { throw "Exit code: $LASTEXITCODE"} } catch { $errorMessage = "Error happened during command execution: $Command `n $_" Write-Host $errorMessage if ($ErrorActionPreference -ne "Continue") { # avoid logging Azure DevOps issues in case of $ErrorActionPreference -eq Continue Write-Host "##vso[task.logissue type=error;] $errorMessage" } } } <# .SYNOPSIS Download file from url and return local path to file #> function Download-File { param( [Parameter(Mandatory=$true)] [Uri]$Uri, [Parameter(Mandatory=$true)] [String]$OutputFolder ) $targetFilename = [IO.Path]::GetFileName($Uri) $targetFilepath = Join-Path $OutputFolder $targetFilename Write-Debug "Download source from $Uri to $OutFile" try { (New-Object System.Net.WebClient).DownloadFile($Uri, $targetFilepath) return $targetFilepath } catch { Write-Host "Error during downloading file from '$Uri'" "$_" exit 1 } } <# .SYNOPSIS Generate file that contains the list of all files in particular directory #> function New-ToolStructureDump { param( [Parameter(Mandatory=$true)] [String]$ToolPath, [Parameter(Mandatory=$true)] [String]$OutputFolder ) $outputFile = Join-Path $OutputFolder "tools_structure.txt" $folderContent = Get-ChildItem -Path $ToolPath -Recurse | Sort-Object | Select-Object -Property FullName, Length $folderContent | ForEach-Object { $relativePath = $_.FullName.Replace($ToolPath, ""); return "${relativePath}" } | Out-File -FilePath $outputFile } <# .SYNOPSIS Check if it is macOS / Ubuntu platform #> function IsNixPlatform { param( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [String]$Platform ) return ($Platform -match "macos") -or ($Platform -match "darwin") -or ($Platform -match "ubuntu") -or ($Platform -match "linux") } <# .SYNOPSIS Get root directory of selected tool #> function GetToolDirectory { param( [Parameter(Mandatory=$true)] [String]$ToolName, [Parameter(Mandatory=$true)] [String]$Version, [Parameter(Mandatory=$true)] [String]$Architecture ) $targetPath = $env:AGENT_TOOLSDIRECTORY if ([string]::IsNullOrEmpty($targetPath)) { # GitHub Windows images don't have `AGENT_TOOLSDIRECTORY` variable $targetPath = $env:RUNNER_TOOL_CACHE } $ToolcachePath = Join-Path -Path $targetPath -ChildPath $ToolName $ToolcacheVersionPath = Join-Path -Path $ToolcachePath -ChildPath $Version return Join-Path $ToolcacheVersionPath $Architecture }