🧪 Validate Process-PSModule publish fix (PSModule/Process-PSModule#529) - #63
Conversation
Point the caller at PSModule/Process-PSModule#529 (copilot/fix-publish-module-error) to verify that publishing a version which does not yet exist on the PowerShell Gallery succeeds. Includes a documentation-only change to Get-CurrentDateTime so the pipeline has a release to publish. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
✅ New prerelease: PowerShell Gallery - MariusTestModule 0.4.13-validatepublishfixpr529001 |
|
✅ New prerelease: GitHub - MariusTestModule v0.4.13-validatepublishfixpr529001 |
|
✅ New prerelease: PowerShell Gallery - MariusTestModule 0.4.13-validatepublishfixpr529001 |
|
✅ New prerelease: GitHub - MariusTestModule v0.4.13-validatepublishfixpr529001 |
✅ Validation passed — the fix works end to endBoth branches of the Gallery existence probe confirmed on live infrastructure. New version publishes — Publish-Module, run 33597824748: Same Resume path intact — re-run of the same job, with the version now present: No re-upload, no conflict. This was the risk in narrowing the error filter, and it holds. Note for anyone re-running thisThe first run came back all-green with Don't trust the overall run status here; confirm Still a draft on purpose
|
A module version that has never been published to the PowerShell Gallery can now be published. Any first release, and every subsequent new version, previously failed the Publish-Module stage before the upload was attempted. ## Fixed: New module versions publish to the PowerShell Gallery Publishing a version that is not yet on the PowerShell Gallery now succeeds. The stage checks whether the version already exists so an interrupted run can resume, and treats an absent version as the expected result for a new release rather than an error. Before this change the Publish-Module job failed with the following, and no module was ever uploaded: ```text Find-PSResource: Package with name 'MyModule', version '1.3.1' could not be found in repository 'PSGallery'. Error: Process completed with exit code 1. ``` No repository configuration changes are needed. A workflow run that previously failed at this point succeeds on re-run. Resuming an interrupted publication is unchanged: when the version is already on the Gallery, the run skips the upload and continues to GitHub release creation. --- <details> <summary>Technical details</summary> - `.github/actions/Publish-PSModule/src/publish.ps1` — the Gallery existence probe in the `Publish to PSGallery` region ran `Find-PSResource` with `-ErrorAction Stop`. `Microsoft.PowerShell.PSResourceGet` raises `PackageNotFound,Microsoft.PowerShell.PSResourceGet.Cmdlets.FindPSResource` when the requested version does not exist, which `-ErrorAction Stop` turns into a throw, so the probe made a missing version fatal instead of returning `$null`. The probe now keeps `-ErrorAction Stop` and catches only `PackageNotFound`, treating that one error as 'not yet published' and letting the `if ($publishedPackage)` branch decide the outcome. Every other error stays fatal, so a transient Gallery failure cannot be misread as 'version absent' and cause a re-upload of a version that already exists. - The probe was introduced in #512 to make Gallery publication idempotent for the default-branch push release path. That path replaced a `try`/`catch` around `Publish-PSResource`, which is why the regression reached `main` without an existing test catching it. - `.github/actions/Publish-PSModule/tests/Publish-PSModule.Recovery.Tests.ps1` — the harness could not observe whether publication happened, so its assertions were vacuous: `Publish-PSResource` was shimmed to set `$script:publishInvoked`, but `publish.ps1` runs in its own scope via `&`, so the flag never propagated and stayed `$false` regardless. Replaced with a hashtable captured by `GetNewClosure()`, which is shared by reference. A second variant wrote a marker file under `$env:GITHUB_WORKSPACE`; that is process-wide and races between parallel Pester runspaces, so the marker could land in another test file's `TestDrive`. The not-found shim also used `$PSCmdlet.ThrowTerminatingError(...)`, which ignores `-ErrorAction` and therefore threw under both `Stop` and `SilentlyContinue` — unable to distinguish the fix from the defect. It now uses `Write-Error` with the real `PackageNotFound` error ID, matching how the cmdlet actually behaves. Added a case asserting a non-`PackageNotFound` lookup failure stays fatal and does not publish. Each test was verified to fail against the specific defect it guards. - `.github/actions/Release-PSModule/tests/Release-PSModule.WhatIf.Tests.ps1` and `Publish-PSModule.Recovery.Tests.ps1` — shim teardown used `Remove-Item -Path function:global:X`. `Set-Item` accepts that path and creates `X` in the global scope, but `Remove-Item` and `Get-Item` do not resolve it back, and fail silently rather than erroring, so the cleanup was a no-op. The shims survived `AfterAll` and shadowed the real commands for later test files, which is what made `Test-Actions` fail with `A parameter cannot be found that matches parameter name 'Prerelease'` in `Get-NextPrereleaseNumber`. Teardown now removes by name. - Validated end to end in `MariusStorhaug/MariusTestModule` ([PR #63](MariusStorhaug/MariusTestModule#63)) with the caller pointed at this branch. A new version published successfully ([run 33597824748](https://github.com/MariusStorhaug/MariusTestModule/actions/runs/33597824748/job/100145585604)), and re-running the same job with the version present skipped the upload via the resume path ([re-run](https://github.com/MariusStorhaug/MariusTestModule/actions/runs/33597824748/job/100146802704)). Both branches of the probe are confirmed against the live Gallery. - Out of scope, found while reproducing: a `workflow_dispatch` on the default branch resolves no associated pull request, because pull request association in `.github/actions/Get-PSModuleSettings/src/main.ps1` is gated on `$isPush`. A manual recovery run therefore discards the merged pull request's version label and silently resolves a Patch bump. This is a separate defect in version resolution and is recorded in the analysis on #528; it is not addressed here. - Also out of scope: `.github/workflows/Test-Actions.yml` builds a Pester configuration with `Run.Parallel` and `Run.Shuffle`, asserts the options applied, then discards it and creates a fresh `New-PesterConfiguration` for the actual run. Parallel and shuffle are validated but never used, which is why the `GITHUB_WORKSPACE` race above could not surface in CI. The suite now passes both sequentially and under the intended parallel configuration, so enabling it should be safe. | Changed surface | Standards checked | Framework docs checked | Result | | --- | --- | --- | --- | | `.github/actions/Publish-PSModule/src/**` (PowerShell) | Coding standards, error handling | Publish stage contract | Aligned | | `.github/actions/Publish-PSModule/tests/**` (Pester) | Pester test standards | Action test layout | Aligned | | `.github/actions/Release-PSModule/tests/**` (Pester) | Pester test standards | Action test layout | Aligned | </details> <details> <summary>Relevant issues (or links)</summary> - Resolves #528 ### Related work - References #512 </details> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: MariusStorhaug <17722253+MariusStorhaug@users.noreply.github.com> Co-authored-by: Marius Storhaug <Marius.Storhaug@dnb.no> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
PSModule/Process-PSModule#529 merged and shipped in v8.0.4, so the publish fix is available from the v8 tag. The temporary branch pin is no longer needed, and the branch it referenced has been deleted. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
✅ New prerelease: PowerShell Gallery - MariusTestModule 0.4.13-validatepublishfixpr529002 |
|
✅ New prerelease: GitHub - MariusTestModule v0.4.13-validatepublishfixpr529002 |
|
✅ New release: PowerShell Gallery - MariusTestModule 0.4.13 |
|
✅ New release: GitHub - MariusTestModule v0.4.13 |
|
Changed my PSWEE workflow to used the commit with the fix and I can confirm it's working ! Thanks @MariusStorhaug |
Validates the publish fix in PSModule/Process-PSModule#529 end to end, against a real publication.
Why
This repository reproduced the defect in PSModule/Process-PSModule#528: merging #62 to
mainfailed at Publish-Module before any upload was attempted.Failing run: 33596331743 → Publish-Module job
The existence probe in
publish.ps1treated an absent version as fatal, so every first-time publication of a new version failed.What this changes
.github/workflows/Process-PSModule.yml@v8→@copilot/fix-publish-module-errorsrc/functions/public/DateAndTime/Get-CurrentDateTime.ps1The source change exists only to give the pipeline something to release. It is comment-only: no executable code is touched.
Pointing the caller's
uses:ref at the branch is sufficient, because the reusable workflow checks out its own actions at the resolved workflow commit rather than a floating tag:So
_wf/.github/actions/Publish-PSModule/src/publish.ps1resolves to the fixed file, with no vendoring or pinning workarounds.Success criteria
PackageNotFoundfailureThe decisive signal is the merge publication: the probe must report "not found" without failing the job, then hand off to
Publish-PSResource.The starting point is clean — the failed run left the Gallery at
0.4.12with no0.4.13release — so this is a direct before/after on the same version that previously failed.Do not merge as-is
v8tag includes it, this must be reverted to@v8. Merging this ref permanently would pin the module to a feature branch.