Skip to content

v6.1.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 21:04
0d7a2f0

🚀 [Feature]: Plan job decides version before build so tested artifact equals published artifact (#342)

The version a module ships with is now decided in a new Plan job that runs before the module is built. The same artifact then flows through tests and publish without being mutated, so the artifact you tested is the artifact that lands in the PowerShell Gallery and on the GitHub Release.

New: Plan job replaces Get-Settings

Get-Settings.yml is renamed to Plan.yml. The Plan job runs two steps in sequence and exposes everything downstream jobs need:

  1. Get-PSModuleSettings — loads .github/PSModule.yml and emits the resolved Settings JSON.
  2. Resolve-PSModuleVersion — reads settings + PR labels, queries existing releases and the PowerShell Gallery, and emits the next version.

Plan job output: a single Settings JSON. The resolved version is merged into it as Settings.Module.{Version, Prerelease, FullVersion, ReleaseType, CreateRelease}, so every downstream job receives one self-contained object with no separate version outputs.

flowchart LR
  A[Plan<br/>Get-PSModuleSettings + Resolve-PSModuleVersion] --> B[Build-Module<br/>stamps version into manifest]
  B --> C[Test-* / Coverage]
  C --> D[Publish-Module<br/>publishes artifact unchanged]

Changed: Build-Module now stamps the real version

Build-Module.yml reads the version from Settings.Module.Version / Settings.Module.Prerelease and passes them to Build-PSModule. The built manifest contains the version the module will ship with before any test runs. The 999.0.0 placeholder only appears when no version is provided (for example, direct callers that bypass the Plan job).

Changed: Publish-Module no longer calculates or mutates versions

Publish-Module.yml drops every input that used to drive version calculation:

  • AutoPatching
  • DatePrereleaseFormat
  • IgnoreLabels
  • IncrementalPrerelease
  • MajorLabels / MinorLabels / PatchLabels
  • ReleaseType
  • VersionPrefix

Publish-Module now reads the version straight from the manifest that arrived from Build-Module and pushes it to the PowerShell Gallery as-is. The PR-title / PR-body / heading inputs are unchanged. The job also gains permission to upload release assets so the zipped module can be attached to the GitHub Release.

Fixed: Tested artifact equals published artifact

The placeholder-then-rewrite flow is gone. The bytes tested in Test-Module / Test-ModuleLocal are the same bytes published to the PowerShell Gallery and attached to the GitHub Release.

Technical Details

  • Plan.yml (renamed from Get-Settings.yml): adds a Resolve-Version step (runs unconditionally — it computes the release decision, including ReleaseType) followed by an Enrich-Settings step that merges the resolved version into Settings.Module.*. Plan exposes a single Settings output on both the job and workflow_call.
  • workflow.yml: the Get-Settings job is renamed to Plan and every downstream needs: / with: reference is repointed. Downstream jobs consume the single needs.Plan.outputs.Settings object (version available under Settings.Module.*).
  • Build-Module.yml: reads Settings.Module.Version / Settings.Module.Prerelease and passes them as Version / Prerelease to Build-PSModule, falling back to the 999.0.0 placeholder when a direct caller bypasses Plan and omits Settings.Module.
  • Publish-Module.yml: removes the seven version-calculation inputs and grants contents: write permission for release-asset uploads.
  • README.md: replaces the Get-Settings section with a Plan section that documents both steps and the artifact-integrity guarantee, and notes the new release-asset upload.
  • PSModule/Build-PSModule pinned to @v5.0.0 (SHA 672aaa7a91a379c4c6cd14494d03ab5e87e13c52).
  • PSModule/Publish-PSModule pinned to @v3.0.0 (SHA 03c0f8b53d0367c85a0f121f98af9b40c817b0e3).

Companion repos

Repo Change Link
PSModule/Resolve-PSModuleVersion New action — v1.1.0 released https://github.com/PSModule/Resolve-PSModuleVersion/releases/tag/v1.1.0
PSModule/Build-PSModule Major — adds Version / Prerelease inputs — v5.0.0 released https://github.com/PSModule/Build-PSModule/releases/tag/v5.0.0
PSModule/Publish-PSModule Major / BREAKING — drops version calculation, publishes pre-stamped artifact, uploads module zip to release — v3.0.0 released https://github.com/PSModule/Publish-PSModule/releases/tag/v3.0.0

Implementation plan progress

  • Rename Get-Settings job to Plan and add Resolve-PSModuleVersion step
  • Expose a single Settings output (resolved version merged into Settings.Module.{Version, Prerelease, FullVersion, ReleaseType, CreateRelease})
  • Update Build-Module.yml to read the version from Settings.Module.* and stamp it
  • Strip version-calculation inputs from Publish-Module.yml
  • Update needs / with wiring across workflow.yml
  • Update README.md (Plan section + release-asset note)
  • Resolve-PSModuleVersion action implementation (v1.1.0 released)
  • Build-PSModule Version/Prerelease inputs (v5.0.0 released)
  • Publish-PSModule v3 release (v3.0.0 released — PSModule/Publish-PSModule#71)
  • Repin @main references in Build-Module.yml and Publish-Module.yml to released SHAs
  • End-to-end run on a labeled PR

Notes

  • The public input/output contract of workflow.yml is unchanged for external consumers — this is internal wiring.
  • #339 covered the same scope and was closed; this PR restarts the work cleanly off the current main.