Enable pipeline to sync PSGallery modules to AzArtifacts feed (#8316)
Compare the PowerShell modules dependencies on PowerShell Gallery and sync them to AzDevOps artifacts feed if a newer is available. The release builds pick up modules from AzDevOps feed.
This commit is contained in:
parent
b0daa1e724
commit
9510fe56f5
|
@ -0,0 +1,33 @@
|
|||
# Sync packages from PSGallery to Azure DevOps Artifacts feed
|
||||
|
||||
resources:
|
||||
- repo: self
|
||||
clean: true
|
||||
|
||||
queue:
|
||||
name: Hosted VS2017
|
||||
steps:
|
||||
- powershell: |
|
||||
Install-Module -Name PowerShellGet -MinimumVersion 2.0.1 -Force
|
||||
Import-Module PowerShellGet -Force -Verbose
|
||||
displayName: Update PSGet and PackageManagement
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- powershell: |
|
||||
Import-Module -Force "$(Build.SourcesDirectory)/tools/releaseBuild/azureDevOps/AzArtifactFeed/SyncGalleryToAzArtifacts.psm1"
|
||||
SyncGalleryToAzArtifacts -AzDevOpsPAT $(AzDevOpsPAT) -Destination $(Build.ArtifactStagingDirectory)
|
||||
displayName: Download packages from PSGallery that need to be updated
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- powershell: |
|
||||
Write-Verbose -Verbose "Packages to upload"
|
||||
if(Test-Path $(Build.ArtifactStagingDirectory)) { Get-ChildItem "$(Build.ArtifactStagingDirectory)/*.nupkg" | ForEach-Object { $_.FullName }}
|
||||
displayName: List packages to upload
|
||||
condition: succeededOrFailed()
|
||||
|
||||
- task: NuGetCommand@2
|
||||
displayName: 'NuGet push'
|
||||
inputs:
|
||||
command: push
|
||||
publishVstsFeed: 'https://mscodehub.pkgs.visualstudio.com/_packaging/pscore-release/nuget/v3/index.json'
|
||||
publishFeedCredentials: 'AzArtifactsFeed'
|
|
@ -0,0 +1,114 @@
|
|||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Downloads to packages from PowerShell Gallery which are missing from the Azure DevOps Artifacts feed.
|
||||
|
||||
.PARAMETER AzureDevOpsPAT
|
||||
PAT for the username used for authenticating to the Azure DevOps Artifacts feed.
|
||||
|
||||
.PARAMETER Destination
|
||||
Path to the folder where the packages should be stored for uploading to Azure DevOps Artifacts feed.
|
||||
|
||||
#>
|
||||
function SyncGalleryToAzArtifacts {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)] [string] $AzDevOpsPAT,
|
||||
[Parameter(Mandatory = $true)] [string] $Destination
|
||||
)
|
||||
|
||||
$csproj = [xml] (Get-Content 'src/Modules/PSGalleryModules.csproj')
|
||||
$packages = @($csproj.Project.ItemGroup.PackageReference | ForEach-Object { [ordered] @{Name = $_.Include; Version = $_.Version }})
|
||||
|
||||
$galleryPackages = @()
|
||||
$azArtifactsPackages = @()
|
||||
$modulesToUpdate = @()
|
||||
|
||||
$galleryUrl = 'https://www.powershellgallery.com/api/v2/'
|
||||
$azArtifactsUrl = 'https://mscodehub.pkgs.visualstudio.com/_packaging/pscore-release/nuget/v2'
|
||||
|
||||
$azDevOpsCreds = [pscredential]::new($env:AzDevOpsUserName, (ConvertTo-SecureString -String $AzDevOpsPAT -AsPlainText -Force))
|
||||
|
||||
foreach ($package in $packages) {
|
||||
try {
|
||||
# Get module from gallery
|
||||
$foundPackageOnGallery = Find-Package -ProviderName NuGet -Source $galleryUrl -AllVersions -Name $package.Name -Force -AllowPreReleaseVersion | Sort-Object -Property Version -Descending | Select-Object -First 1
|
||||
Write-Verbose -Verbose "Found module $($package.Name) - $($foundPackageOnGallery.Version) in gallery"
|
||||
$galleryPackages += $foundPackageOnGallery
|
||||
} catch {
|
||||
if ($_.FullyQualifiedErrorId -eq 'NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage') {
|
||||
# Log and ignore failure is required version is not found on gallery.
|
||||
Write-Warning "Module not found on gallery $($package.Name) - $($package.Version)"
|
||||
}
|
||||
else {
|
||||
Write-Error $_
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
# Get module from Az Artifacts
|
||||
# There seems to be a bug in the feed with RequiredVersion matching. Adding workaround with post filtering.
|
||||
# Issue: https://github.com/OneGet/oneget/issues/397
|
||||
$foundPackageOnAz = Find-Package -ProviderName NuGet -Source $azArtifactsUrl -AllVersions -Name $package.Name -Force -Credential $azDevOpsCreds -AllowPreReleaseVersion | Sort-Object -Property Version -Descending | Select-Object -First 1
|
||||
Write-Verbose -Verbose "Found module $($package.Name) - $($foundPackageOnAz.Version) in azArtifacts"
|
||||
$azArtifactsPackages += $foundPackageOnAz
|
||||
} catch {
|
||||
if ($_.FullyQualifiedErrorId -eq 'NoMatchFoundForCriteria,Microsoft.PowerShell.PackageManagement.Cmdlets.FindPackage') {
|
||||
# Log and add the module to update list.
|
||||
Write-Verbose -Verbose "Az Artifacts Module needs update to - $($package.Name) - $($package.Version)"
|
||||
$modulesToUpdate += $package
|
||||
}
|
||||
else {
|
||||
Write-Error $_
|
||||
}
|
||||
}
|
||||
|
||||
# Check if Az package version is less that gallery version
|
||||
if ($foundPackageOnAz.Version -lt $foundPackageOnGallery.Version) {
|
||||
Write-Verbose -Verbose "Module needs to be updated $($package.Name) - $($foundPackageOnGallery.Version)"
|
||||
$modulesToUpdate += $foundPackageOnGallery
|
||||
} elseif ($foundPackageOnGallery.Version -lt $foundPackageOnAz.Version) {
|
||||
Write-Warning "Newer version found on Az Artifacts - $($foundPackageOnAz.Name) - $($foundPackageOnAz.Version)"
|
||||
} else {
|
||||
Write-Verbose -Verbose "Module is in sync - $($package.Name)"
|
||||
}
|
||||
}
|
||||
|
||||
"Gallery Packages:`n"
|
||||
$galleryPackages
|
||||
|
||||
"Az Artifacts Packages:`n"
|
||||
$azArtifactsPackages
|
||||
|
||||
"Modules to update:`n"
|
||||
$modulesToUpdate
|
||||
|
||||
foreach ($package in $modulesToUpdate) {
|
||||
Save-Package -Provider NuGet -Source $galleryUrl -Name $package.Name -RequiredVersion $package.Version -Path $Destination
|
||||
}
|
||||
|
||||
# Remove dependent packages downloaded by Save-Module if there are already present in AzArtifacts feed.
|
||||
try {
|
||||
Register-PackageSource -Name local -Location $Destination -ProviderName NuGet -Force
|
||||
$packageNamesToKeep = @()
|
||||
$savedPackages = Find-Package -Source local -AllVersions -AllowPreReleaseVersion
|
||||
|
||||
foreach($package in $savedPackages) {
|
||||
$foundMatch = $azArtifactsPackages | Where-Object { $_.Name -eq $package.Name -and $_.Version -eq $package.Version }
|
||||
|
||||
if(-not $foundMatch) {
|
||||
Write-Verbose "Keeping package $($package.PackageFileName)"
|
||||
$packageNamesToKeep += $package.PackageFilename
|
||||
}
|
||||
}
|
||||
|
||||
Remove-Item -Path $Destination -Exclude $packageNamesToKeep -Recurse -Force
|
||||
}
|
||||
finally {
|
||||
Unregister-PackageSource -Name local -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Export-ModuleMember -Function 'SyncGalleryToAzArtifacts'
|
Loading…
Reference in a new issue