pwsh/dev/functions/verifyModules3rd.ps1 (125 lines of code) (raw):
function verifyModules3rd {
[CmdletBinding()]Param(
[object]$modules
)
foreach ($module in $modules) {
$moduleVersion = $module.ModuleVersion
if ($moduleVersion) {
Write-Host "Verify '$($module.ModuleName)' version '$moduleVersion'"
}
else {
Write-Host "Verify '$($module.ModuleName)' (latest)"
}
$maxRetry = 3
$tryCount = 0
do {
$tryCount++
if ($tryCount -gt $maxRetry) {
Write-Host " Managing '$($module.ModuleName)' failed (tried $($tryCount - 1)x)"
throw " Managing '$($module.ModuleName)' failed"
}
$installModuleSuccess = $false
try {
if (-not $moduleVersion) {
Write-Host ' Check latest module version'
try {
$moduleVersion = (Find-Module -Name $($module.ModuleName)).Version
Write-Host " $($module.ModuleName) Latest module version: $moduleVersion"
}
catch {
Write-Host " $($module.ModuleName) - Check latest module version failed"
throw " $($module.ModuleName) - Check latest module version failed"
}
}
if (-not $installModuleSuccess) {
try {
$moduleVersionLoaded = (Get-InstalledModule -Name $($module.ModuleName)).Version
if ([System.Version]$moduleVersionLoaded -eq [System.Version]$moduleVersion) {
$installModuleSuccess = $true
}
else {
Write-Host " $($module.ModuleName) - Deviating module version '$moduleVersionLoaded'"
if ([System.Version]$moduleVersionLoaded -gt [System.Version]$moduleVersion) {
if (($env:SYSTEM_TEAMPROJECTID -and $env:BUILD_REPOSITORY_ID) -or $env:GITHUB_ACTIONS) {
#AzDO or GH
throw " $($module.ModuleName) - Deviating module version $moduleVersionLoaded"
}
else {
Write-Host " Current module version '$moduleVersionLoaded' greater than the minimum required version '$moduleVersion' -> tolerated" -ForegroundColor Yellow
$installModuleSuccess = $true
}
}
else {
Write-Host " Current module version '$moduleVersionLoaded' lower than the minimum required version '$moduleVersion' -> failed"
throw " $($module.ModuleName) - Deviating module version $moduleVersionLoaded"
}
}
}
catch {
throw
}
}
}
catch {
Write-Host " '$($module.ModuleName) $moduleVersion' not installed"
if (($env:SYSTEM_TEAMPROJECTID -and $env:BUILD_REPOSITORY_ID) -or $env:GITHUB_ACTIONS) {
Write-Host " Installing $($module.ModuleName) module ($($moduleVersion))"
$installAzAPICallModuleTryCounter = 0
do {
$installAzAPICallModuleTryCounter++
try {
$params = @{
Name = "$($module.ModuleName)"
Force = $true
RequiredVersion = $moduleVersion
ErrorAction = 'Stop'
}
Install-Module @params
$installAzAPICallModuleSuccess = $true
Write-Host " Try#$($installAzAPICallModuleTryCounter) Installing '$($module.ModuleName)' module ($($moduleVersion)) succeeded"
}
catch {
Write-Host " Try#$($installAzAPICallModuleTryCounter) Installing '$($module.ModuleName)' module ($($moduleVersion)) failed - sleep $($installAzAPICallModuleTryCounter) seconds"
Start-Sleep -Seconds $installAzAPICallModuleTryCounter
$installAzAPICallModuleSuccess = $false
}
}
until($installAzAPICallModuleTryCounter -gt 10 -or $installAzAPICallModuleSuccess)
if (-not $installAzAPICallModuleSuccess) {
throw " Installing '$($module.ModuleName)' module ($($moduleVersion)) failed"
}
}
else {
do {
$installModuleUserChoice = $null
$installModuleUserChoice = Read-Host " Do you want to install $($module.ModuleName) module ($($moduleVersion)) from the PowerShell Gallery? (y/n)"
if ($installModuleUserChoice -eq 'y') {
try {
Install-Module -Name $module.ModuleName -RequiredVersion $moduleVersion -Force -ErrorAction Stop
try {
Import-Module -Name $module.ModuleName -RequiredVersion $moduleVersion -Force -ErrorAction Stop
}
catch {
throw " 'Import-Module -Name $($module.ModuleName) -RequiredVersion $moduleVersion -Force' failed"
}
}
catch {
throw " 'Install-Module -Name $($module.ModuleName) -RequiredVersion $moduleVersion' failed"
}
}
elseif ($installModuleUserChoice -eq 'n') {
Write-Host " $($module.ModuleName) module is required, please visit https://aka.ms/$($module.ModuleProductName) or https://www.powershellgallery.com/packages/$($module.ModuleProductName)"
throw " $($module.ModuleName) module is required"
}
else {
Write-Host " Accepted input 'y' or 'n'; start over.."
}
}
until ($installModuleUserChoice -eq 'y')
}
}
}
until ($installModuleSuccess)
Write-Host " Verify '$($module.ModuleName)' version '$moduleVersion' succeeded" -ForegroundColor Green
}
}