Pipelines/Install-BcContainerHelper.ps1

Param(
    [string] $bcContainerHelperVersion = "",
    [string] $genericImageName = ""
)

function Expand-7zipArchive {
    Param (
        [Parameter(Mandatory = $true)]
        [string] $Path,
        [string] $DestinationPath
    )

    $7zipPath = "$env:ProgramFiles\7-Zip\7z.exe"

    $use7zip = $false
    if (Test-Path -Path $7zipPath -PathType Leaf) {
        try {
            $use7zip = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($7zipPath).FileMajorPart -ge 19
        }
        catch {
            $use7zip = $false
        }
    }

    if ($use7zip) {
        OutputDebug -message "Using 7zip"
        Set-Alias -Name 7z -Value $7zipPath
        $command = '7z x "{0}" -o"{1}" -aoa -r' -f $Path, $DestinationPath
        Invoke-Expression -Command $command | Out-Null
    }
    else {
        OutputDebug -message "Using Expand-Archive"
        Expand-Archive -Path $Path -DestinationPath "$DestinationPath" -Force
    }
}

function OutputError {
    Param(
        [string] $message
    )

    if ($runningLocal) {
        throw $message
    }
    else {
        Write-Host "::Error::$($message.Replace("`r",'').Replace("`n",' '))"
        $host.SetShouldExit(1)
    }
}

function OutputWarning {
    Param(
        [string] $message
    )

    if ($runningLocal) {
        Write-Host -ForegroundColor Yellow "WARNING: $message"
    }
    else {
        Write-Host "::Warning::$message"
    }
}

function OutputNotice {
    Param(
        [string] $message
    )

    if ($runningLocal) {
        Write-Host $message
    }
    else {
        Write-Host "::Notice::$message"
    }
}

function OutputDebug {
    Param(
        [string] $message
    )

    if ($runningLocal) {
        Write-Host $message
    }
    else {
        Write-Host "::Debug::$message"
    }
}

function GetBcContainerHelperPath([string] $bcContainerHelperVersion) {
    if ("$env:BcContainerHelperPath" -and (Test-Path -Path $env:BcContainerHelperPath -PathType Leaf)) {
        return $env:BcContainerHelperPath
    }

    if ($bcContainerHelperVersion -eq 'None') {
        $module = Get-Module BcContainerHelper
        if (-not $module) {
            OutputError "When setting BcContainerHelperVersion to none, you need to ensure that BcContainerHelper is installed on the build agent"
        }
        $bcContainerHelperPath = Join-Path (Split-Path $module.Path -parent) "BcContainerHelper.ps1" -Resolve
    }
    else {
        $bcContainerHelperRootFolder = 'C:\ProgramData\BcContainerHelper'
        if (!(Test-Path $bcContainerHelperRootFolder)) {
            New-Item -Path $bcContainerHelperRootFolder -ItemType Directory | Out-Null
        }

        $webclient = New-Object System.Net.WebClient
        $tempName = Join-Path $bcContainerHelperRootFolder ([Guid]::NewGuid().ToString())
        if ($bcContainerHelperVersion -eq "dev") {
            # For backwards compatibility, use preview when dev is specified
            $bcContainerHelperVersion = 'preview'
        }
        Write-Host "Downloading BcContainerHelper $bcContainerHelperVersion version from Blob Storage"
        $webclient.DownloadFile("https://bccontainerhelper.blob.core.windows.net/public/$($bcContainerHelperVersion).zip", "$tempName.zip")

        Expand-7zipArchive -Path "$tempName.zip" -DestinationPath $tempName
        $bcContainerHelperPath = (Get-Item -Path (Join-Path $tempName "*\BcContainerHelper.ps1")).FullName
        Remove-Item -Path "$tempName.zip" -ErrorAction SilentlyContinue

        # Check whether the version is already available in the cache
        $version = ([System.IO.File]::ReadAllText((Join-Path $tempName 'BcContainerHelper/Version.txt'), [System.Text.Encoding]::UTF8)).Trim()
        $cacheFolder = Join-Path $bcContainerHelperRootFolder $version
        # To avoid two agents on the same machine downloading the same version at the same time, use a mutex
        $buildMutexName = "DownloadAndImportBcContainerHelper"
        $buildMutex = New-Object System.Threading.Mutex($false, $buildMutexName)
        try {
            try {
                if (!$buildMutex.WaitOne(1000)) {
                    Write-Host "Waiting for other process loading BcContainerHelper"
                    $buildMutex.WaitOne() | Out-Null
                    Write-Host "Other process completed loading BcContainerHelper"
                }
            }
            catch [System.Threading.AbandonedMutexException] {
                Write-Host "Other process terminated abnormally"
            }
            if (Test-Path $cacheFolder) {
                Remove-Item $tempName -Recurse -Force
            }
            else {
                Rename-Item -Path $tempName -NewName $version
            }
        }
        finally {
            $buildMutex.ReleaseMutex()
        }
        $bcContainerHelperPath = Join-Path $cacheFolder "BcContainerHelper/BcContainerHelper.ps1"
    }
    $env:BcContainerHelperPath = $bcContainerHelperPath
    if ($ENV:GITHUB_ENV) {
        Add-Content -Encoding UTF8 -Path $ENV:GITHUB_ENV "BcContainerHelperPath=$bcContainerHelperPath"
    }
    return $bcContainerHelperPath
}

Write-Host "Installing BcContainerHelper version $bcContainerHelperVersion"

if ($bcContainerHelperVersion -eq '') {
    $bcContainerHelperVersion = "latest"
}

$bcContainerHelperPath = GetBcContainerHelperPath -bcContainerHelperVersion $bcContainerHelperVersion
$params = @{ "ExportTelemetryFunctions" = $true }

Write-Host "Import from $bcContainerHelperPath"
. $bcContainerHelperPath @params

# if (Get-Module -ListAvailable -Name BcContainerHelper) {
# $installedVersion = (Get-InstalledModule -Name BcContainerHelper).Version
# if ($bcContainerHelperVersion -eq "latest") {
# $latestVersion = (Find-Module -Name BcContainerHelper).Version
# if ($installedVersion -eq $latestVersion) {
# Write-Host "The latest version ($latestVersion) of BcContainerHelper module is already installed"
# } else {
# Write-Host "Installing the latest version of BcContainerHelper"
# Install-Module -Name BcContainerHelper -Force
# }
# } elseif ($installedVersion -eq $bcContainerHelperVersion) {
# Write-Host "Version $bcContainerHelperVersion of BcContainerHelper module is already installed"
# } else {
# Write-Host "Installing BcContainerHelper version $bcContainerHelperVersion"
# Install-Module -Name BcContainerHelper -RequiredVersion $bcContainerHelperVersion -Force
# Import-Module -Name BcContainerHelper -RequiredVersion $bcContainerHelperVersion
# }
# } else {
# Write-Host "BcContainerHelper module is not installed"
# if ($bcContainerHelperVersion -eq "latest") {
# Write-Host "Installing the latest version of BcContainerHelper"
# Install-Module -Name BcContainerHelper -Force
# } else {
# Write-Host "Installing BcContainerHelper version $bcContainerHelperVersion"
# Install-Module -Name BcContainerHelper -RequiredVersion $bcContainerHelperVersion -Force
# }
# }

if ($genericImageName) {
    $bcContainerHelperConfig.genericImageName = $genericImageName
}