diff --git a/.gitea/workflows/publish-psgallery.yml b/.gitea/workflows/publish-psgallery.yml index e391266..39447ec 100644 --- a/.gitea/workflows/publish-psgallery.yml +++ b/.gitea/workflows/publish-psgallery.yml @@ -319,9 +319,65 @@ jobs: run: | $ErrorActionPreference = 'Stop' $moduleDir = Join-Path $PWD 'Module/PSInfisicalAPI' - Write-Host "Publishing module from: $moduleDir" - Publish-PSResource ` - -Path $moduleDir ` - -Repository PSGallery ` - -ApiKey $env:PSGALLERY_API_KEY ` - -Verbose + $manifest = Test-ModuleManifest -Path (Join-Path $moduleDir 'PSInfisicalAPI.psd1') + $version = $manifest.Version.ToString() + + # NuGet strips leading zeros from each segment, so the manifest's 2026.07.30.2309 is listed on the + # gallery as 2026.7.30.2309. Compare on the normalized form or every lookup misses. + function Get-NormalizedVersion { + param([string]$Value) + $parts = $Value -split '\.' + $normalized = foreach ($part in $parts) { + $number = 0 + if ([int]::TryParse($part, [ref]$number)) { $number.ToString([System.Globalization.CultureInfo]::InvariantCulture) } else { $part } + } + return ($normalized -join '.') + } + + function Test-PublishedVersion { + param([string]$Normalized) + $uri = "https://www.powershellgallery.com/api/v2/FindPackagesById()?id='PSInfisicalAPI'&`$select=Version" + try { + $feed = Invoke-RestMethod -Uri $uri -TimeoutSec 120 + } catch { + Write-Host "==> Could not query the gallery for existing versions: $($_.Exception.Message)" + return $false + } + + foreach ($entry in @($feed)) { + $candidate = $entry.properties.Version + if ([string]::IsNullOrWhiteSpace($candidate)) { continue } + if ((Get-NormalizedVersion -Value $candidate) -eq $Normalized) { return $true } + } + + return $false + } + + $normalizedVersion = Get-NormalizedVersion -Value $version + Write-Host "==> Module version : $version (gallery form: $normalizedVersion)" + Write-Host "==> Publishing from: $moduleDir" + + if (Test-PublishedVersion -Normalized $normalizedVersion) { + Write-Host "==> Version $normalizedVersion is already on the PowerShell Gallery; nothing to publish." + exit 0 + } + + try { + Publish-PSResource ` + -Path $moduleDir ` + -Repository PSGallery ` + -ApiKey $env:PSGALLERY_API_KEY ` + -Verbose + Write-Host "==> Published $normalizedVersion to the PowerShell Gallery." + } catch { + # A push can be accepted by the gallery and still surface as an error here; when that happens the + # retry comes back as 409. Re-check before failing the run over an upload that actually landed. + Write-Host "==> Publish-PSResource reported: $($_.Exception.Message)" + Start-Sleep -Seconds 15 + if (Test-PublishedVersion -Normalized $normalizedVersion) { + Write-Host "==> Version $normalizedVersion is present on the gallery; treating the publish as successful." + exit 0 + } + + throw + } diff --git a/.github/workflows/publish-psgallery.yml b/.github/workflows/publish-psgallery.yml index e6add7c..4a211ed 100644 --- a/.github/workflows/publish-psgallery.yml +++ b/.github/workflows/publish-psgallery.yml @@ -320,9 +320,65 @@ jobs: run: | $ErrorActionPreference = 'Stop' $moduleDir = Join-Path $PWD 'Module/PSInfisicalAPI' - Write-Host "Publishing module from: $moduleDir" - Publish-PSResource ` - -Path $moduleDir ` - -Repository PSGallery ` - -ApiKey $env:PSGALLERY_API_KEY ` - -Verbose + $manifest = Test-ModuleManifest -Path (Join-Path $moduleDir 'PSInfisicalAPI.psd1') + $version = $manifest.Version.ToString() + + # NuGet strips leading zeros from each segment, so the manifest's 2026.07.30.2309 is listed on the + # gallery as 2026.7.30.2309. Compare on the normalized form or every lookup misses. + function Get-NormalizedVersion { + param([string]$Value) + $parts = $Value -split '\.' + $normalized = foreach ($part in $parts) { + $number = 0 + if ([int]::TryParse($part, [ref]$number)) { $number.ToString([System.Globalization.CultureInfo]::InvariantCulture) } else { $part } + } + return ($normalized -join '.') + } + + function Test-PublishedVersion { + param([string]$Normalized) + $uri = "https://www.powershellgallery.com/api/v2/FindPackagesById()?id='PSInfisicalAPI'&`$select=Version" + try { + $feed = Invoke-RestMethod -Uri $uri -TimeoutSec 120 + } catch { + Write-Host "==> Could not query the gallery for existing versions: $($_.Exception.Message)" + return $false + } + + foreach ($entry in @($feed)) { + $candidate = $entry.properties.Version + if ([string]::IsNullOrWhiteSpace($candidate)) { continue } + if ((Get-NormalizedVersion -Value $candidate) -eq $Normalized) { return $true } + } + + return $false + } + + $normalizedVersion = Get-NormalizedVersion -Value $version + Write-Host "==> Module version : $version (gallery form: $normalizedVersion)" + Write-Host "==> Publishing from: $moduleDir" + + if (Test-PublishedVersion -Normalized $normalizedVersion) { + Write-Host "==> Version $normalizedVersion is already on the PowerShell Gallery; nothing to publish." + exit 0 + } + + try { + Publish-PSResource ` + -Path $moduleDir ` + -Repository PSGallery ` + -ApiKey $env:PSGALLERY_API_KEY ` + -Verbose + Write-Host "==> Published $normalizedVersion to the PowerShell Gallery." + } catch { + # A push can be accepted by the gallery and still surface as an error here; when that happens the + # retry comes back as 409. Re-check before failing the run over an upload that actually landed. + Write-Host "==> Publish-PSResource reported: $($_.Exception.Message)" + Start-Sleep -Seconds 15 + if (Test-PublishedVersion -Normalized $normalizedVersion) { + Write-Host "==> Version $normalizedVersion is present on the gallery; treating the publish as successful." + exit 0 + } + + throw + }