Sync eng/common directory with azure-sdk-tools for PR 6521 (#4793)
* Use System.Threading.Mutex to make threadsafe * Rename test, add comments --------- Co-authored-by: Mike Harder <mharder@microsoft.com>
This commit is contained in:
Родитель
3d6fb8d457
Коммит
3c1ed52f3e
|
@ -47,6 +47,7 @@ function Update-PSModulePathForCI()
|
|||
}
|
||||
}
|
||||
|
||||
# Manual test at eng/common-tests/psmodule-helpers/Install-Module-Parallel.ps1
|
||||
# If we want to use another default repository other then PSGallery we can update the default parameters
|
||||
function Install-ModuleIfNotInstalled()
|
||||
{
|
||||
|
@ -65,35 +66,53 @@ function Install-ModuleIfNotInstalled()
|
|||
|
||||
if ($modules.Count -eq 0)
|
||||
{
|
||||
$repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl })
|
||||
if ($repositories.Count -eq 0)
|
||||
{
|
||||
Register-PSRepository -Name $repositoryUrl -SourceLocation $repositoryUrl -InstallationPolicy Trusted
|
||||
$repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl })
|
||||
if ($repositories.Count -eq 0) {
|
||||
Write-Error "Failed to registory package repository $repositoryUrl."
|
||||
return
|
||||
# Use double-checked locking to avoid locking when module is already installed
|
||||
$mutex = New-Object System.Threading.Mutex($false, "Install-ModuleIfNotInstalled")
|
||||
$null = $mutex.WaitOne()
|
||||
|
||||
try {
|
||||
# Check installed modules again after acquiring lock
|
||||
$modules = (Get-Module -ListAvailable $moduleName)
|
||||
if ($version -as [Version]) {
|
||||
$modules = $modules.Where({ [Version]$_.Version -ge [Version]$version })
|
||||
}
|
||||
|
||||
if ($modules.Count -eq 0)
|
||||
{
|
||||
$repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl })
|
||||
if ($repositories.Count -eq 0)
|
||||
{
|
||||
Register-PSRepository -Name $repositoryUrl -SourceLocation $repositoryUrl -InstallationPolicy Trusted
|
||||
$repositories = (Get-PSRepository).Where({ $_.SourceLocation -eq $repositoryUrl })
|
||||
if ($repositories.Count -eq 0) {
|
||||
Write-Error "Failed to register package repository $repositoryUrl."
|
||||
return
|
||||
}
|
||||
}
|
||||
$repository = $repositories[0]
|
||||
|
||||
if ($repository.InstallationPolicy -ne "Trusted") {
|
||||
Set-PSRepository -Name $repository.Name -InstallationPolicy "Trusted"
|
||||
}
|
||||
|
||||
Write-Host "Installing module $moduleName with min version $version from $repositoryUrl"
|
||||
# Install under CurrentUser scope so that the end up under $CurrentUserModulePath for caching
|
||||
Install-Module $moduleName -MinimumVersion $version -Repository $repository.Name -Scope CurrentUser -Force
|
||||
|
||||
# Ensure module installed
|
||||
$modules = (Get-Module -ListAvailable $moduleName)
|
||||
if ($version -as [Version]) {
|
||||
$modules = $modules.Where({ [Version]$_.Version -ge [Version]$version })
|
||||
}
|
||||
|
||||
if ($modules.Count -eq 0) {
|
||||
Write-Error "Failed to install module $moduleName with version $version"
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
$repository = $repositories[0]
|
||||
|
||||
if ($repository.InstallationPolicy -ne "Trusted") {
|
||||
Set-PSRepository -Name $repository.Name -InstallationPolicy "Trusted"
|
||||
}
|
||||
|
||||
Write-Host "Installing module $moduleName with min version $version from $repositoryUrl"
|
||||
# Install under CurrentUser scope so that the end up under $CurrentUserModulePath for caching
|
||||
Install-Module $moduleName -MinimumVersion $version -Repository $repository.Name -Scope CurrentUser -Force
|
||||
|
||||
# Ensure module installed
|
||||
$modules = (Get-Module -ListAvailable $moduleName)
|
||||
if ($version -as [Version]) {
|
||||
$modules = $modules.Where({ [Version]$_.Version -ge [Version]$version })
|
||||
}
|
||||
|
||||
if ($modules.Count -eq 0) {
|
||||
Write-Error "Failed to install module $moduleName with version $version"
|
||||
return
|
||||
finally {
|
||||
$mutex.ReleaseMutex()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче