Skip to content

✨ [Major]: Move version calculation to Plan job and ship the built artifact (#326)#339

Draft
Marius Storhaug (MariusStorhaug) wants to merge 1 commit into
mainfrom
feat/326-resolve-psmodule-version
Draft

✨ [Major]: Move version calculation to Plan job and ship the built artifact (#326)#339
Marius Storhaug (MariusStorhaug) wants to merge 1 commit into
mainfrom
feat/326-resolve-psmodule-version

Conversation

@MariusStorhaug
Copy link
Copy Markdown
Member

@MariusStorhaug Marius Storhaug (MariusStorhaug) commented May 17, 2026

Closes #326.

Why

Today the version a module is published with is calculated after tests pass, inside Publish-PSModule. Build-PSModule
stamps a placeholder (999.0.0) into the manifest, the tests run against that artifact, and Publish-PSModule then
mutates the manifest to inject the real version before pushing to the PowerShell Gallery. This breaks CI/CD's first
principle: the artifact you tested is not the artifact you ship.

What

The version is now calculated before the build, in a new Plan job that supersedes Get-Settings. The same artifact
flows through test → publish unchanged.

flowchart LR
  A[Plan<br/>Get-Settings + Resolve-PSModuleVersion] --> B[Build-Module<br/>stamps version into manifest]
  B --> C[Test-* / Coverage]
  C --> D[Publish-Module<br/>publishes artifact + uploads zip to release]
Loading

Changes in this PR (Process-PSModule)

  • Renames Get-Settings.ymlPlan.yml. The Plan job runs two steps: Get-PSModuleSettings and the new
    Resolve-PSModuleVersion. Outputs: Settings, ModuleVersion, ModulePrerelease, ModuleFullVersion,
    ReleaseType, CreateRelease.
  • workflow.yml — renames the Get-Settings job to Plan, updates every needs: and with: reference, and forwards
    the resolved version into Build-Module.
  • Build-Module.yml — accepts new ModuleVersion / ModulePrerelease inputs and passes them to Build-PSModule.
  • Publish-Module.yml — drops the version-calculation inputs (no longer needed, Publish-PSModule reads the version
    from the already-stamped manifest).
  • README updated with the Plan job description and a note that the built module is now attached to GitHub Releases.

Companion PRs / repos

Repo Change Link
PSModule/Resolve-PSModuleVersion Initial implementation (NEW repo, NEW action) https://github.com/PSModule/Resolve-PSModuleVersion (committed to main)
PSModule/Build-PSModule Minor — adds Version/Prerelease inputs PSModule/Build-PSModule#135
PSModule/Publish-PSModule Major / BREAKING — drops version calculation, publishes pre-stamped artifact, uploads module zip to release PSModule/Publish-PSModule#71

Built module as a release asset

Implemented in Publish-PSModule/src/publish.ps1: after gh release create, the module folder is zipped to
<Name>-<Version>.zip and uploaded via gh release upload <tag> <zip> --clobber. Consumers can now grab the exact
bytes that were tested and pushed to the Gallery directly from the GitHub Release page.

Notes

  • This PR remains Draft until the child PRs are reviewed and merged, and the workflow references are repinned to
    released SHAs (currently @main for Resolve-PSModuleVersion / Build-PSModule / Publish-PSModule).
  • Copilot review is requested on this PR and on every child PR. The iteration to zero comments is intentionally async
    — this PR will be re-evaluated once Copilot's feedback has been processed across the four repos.


- name: Build module
uses: PSModule/Build-PSModule@345728124d201f371a8b0f1aacb98f89000a06dc # v4.0.14
uses: PSModule/Build-PSModule@main
- name: Resolve-Version
# Resolve only when the workflow is going to create a release/prerelease.
if: fromJson(steps.Get-Settings.outputs.Settings).Publish.Module.ReleaseType != 'None'
uses: PSModule/Resolve-PSModuleVersion@main

- name: Publish module
uses: PSModule/Publish-PSModule@8917aed588dae1bd1aa2873b1caec1c50c20d255 # v2.2.4
uses: PSModule/Publish-PSModule@main
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Renames the Get-Settings job to Plan and adds a second step (Resolve-PSModuleVersion) that computes the final module version before the build, so the manifest is stamped with the real version and the same artifact flows through test → publish unchanged. Build-Module.yml gains ModuleVersion/ModulePrerelease inputs that it forwards to Build-PSModule, and Publish-Module.yml drops all version-calculation inputs (the version now comes from the already-stamped manifest, and Publish-PSModule additionally uploads the zipped module as a Release asset).

Changes:

  • Rename Get-Settings.ymlPlan.yml; add Resolve-PSModuleVersion step and expose ModuleVersion, ModulePrerelease, ModuleFullVersion, ReleaseType, CreateRelease outputs.
  • Update workflow.yml to rename the job, rewire all needs:/with: references, and pass version inputs into Build-Module.
  • Add ModuleVersion/ModulePrerelease inputs to Build-Module.yml; remove version-calculation inputs from Publish-Module.yml; update README accordingly.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.

Show a summary per file
File Description
.github/workflows/Plan.yml Renamed from Get-Settings; adds Resolve-PSModuleVersion step and new version-related job outputs.
.github/workflows/workflow.yml Renames Get-Settings job to Plan, updates all references, and passes ModuleVersion/ModulePrerelease into Build-Module.
.github/workflows/Build-Module.yml Adds ModuleVersion and ModulePrerelease inputs and forwards them to Build-PSModule; points to Vlad Vannov (@main).
.github/workflows/Publish-Module.yml Removes version-calculation inputs (now done in Plan); updates permissions comment; points to Vlad Vannov (@main).
README.md Documents the new Plan job, its two steps, the tested-artifact-equals-shipped-artifact guarantee, and Release-asset upload.

@github-actions
Copy link
Copy Markdown

Super-linter summary

Language Validation result
CHECKOV Pass ✅
GITLEAKS Pass ✅
GIT_MERGE_CONFLICT_MARKERS Pass ✅
MARKDOWN Pass ✅
NATURAL_LANGUAGE Pass ✅
POWERSHELL Pass ✅
PRE_COMMIT Pass ✅
SPELL_CODESPELL Pass ✅
TRIVY Pass ✅
YAML Pass ✅

All files and directories linted successfully

For more information, see the GitHub Actions workflow run

Powered by Super-linter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Move version calculation to a Plan job (Resolve-PSModuleVersion) so Build and Publish never calculate or mutate versions

3 participants