Skip to content

🌟 [Major]: Module version resolution now available as a standalone action#1

Merged
Marius Storhaug (MariusStorhaug) merged 10 commits into
mainfrom
feat/326-implement-action
May 22, 2026
Merged

🌟 [Major]: Module version resolution now available as a standalone action#1
Marius Storhaug (MariusStorhaug) merged 10 commits into
mainfrom
feat/326-implement-action

Conversation

@MariusStorhaug
Copy link
Copy Markdown
Member

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

Module version resolution is now available as a standalone action. Workflows can call it before building so the resolved version is stamped into the artifact at build time, making the bytes that are tested the bytes that ship.

New: Standalone Resolve-PSModuleVersion action

The action consumes the JSON Settings output from PSModule/Get-PSModuleSettings and emits:

Output Description
Version Major.Minor.Patch portion of the resolved version.
Prerelease Prerelease tag, empty when not a prerelease.
FullVersion Full version string including VersionPrefix and prerelease tag.
ReleaseType Release, Prerelease, or None when no version bump label is present.
CreateRelease true when a release or prerelease should be created.

Typical usage in the Plan job:

- name: Resolve module version
  id: resolve
  uses: PSModule/Resolve-PSModuleVersion@v1
  env:
    GH_TOKEN: ${{ github.token }}
  with:
    Settings: ${{ steps.settings.outputs.Settings }}

- name: Build module
  uses: PSModule/Build-PSModule@v5
  with:
    Version: ${{ steps.resolve.outputs.Version }}
    Prerelease: ${{ steps.resolve.outputs.Prerelease }}

The action validates Settings.Publish.Module.ReleaseType, applies IgnoreLabels overrides, picks the bump type from PR labels (MajorLabels > MinorLabels > PatchLabels / AutoPatching), then computes the next version from the higher of the latest GitHub Release and the latest PowerShell Gallery version. For prereleases it appends the sanitized branch name, optional DatePrereleaseFormat timestamp, and an incremental counter calculated from existing prereleases on the same baseline + branch.

Technical Details

  • action.yml: composite action with inputs Settings (required JSON), Name, WorkingDirectory, Debug, Verbose, Version, Prerelease, plus EventPath and EventJson (both optional, for test overrides — EventJson takes precedence over reading the file at EventPath). All ${{ }} template expressions are isolated in env: sections per zizmor template-injection requirements. Installs PSModule/Install-PSModuleHelpers and PSSemVer before running the script.
  • scripts/main.ps1: ports the version-resolution logic that previously lived in Publish-PSModule/src/init.ps1. Reads configuration from PSMODULE_RESOLVE_PSMODULEVERSION_INPUT_Settings JSON instead of separate env vars. Reads the PR event from PSMODULE_RESOLVE_PSMODULEVERSION_INPUT_EventJson when set, falling back to the file at GITHUB_EVENT_PATH. Emits outputs via $env:GITHUB_OUTPUT. Cleanup-tag discovery stays in Publish-PSModule/cleanup.ps1 and is intentionally out of scope here.
  • .github/workflows/Action-Test.yml: 6 test jobs covering patch, minor, major, auto-patch, ignore-label, and None scenarios. The ignore-label job passes the fake PR event as a JSON string via EventJson to bypass the runner's real event file, which cannot be reliably overridden at the file-system level.
  • README.md: replaces the template scaffold with the action's contract and usage examples.

Implementation plan progress (PSModule/Process-PSModule#326):

  • ✅ Create Resolve-PSModuleVersion (LICENSE, README, action.yml, scripts/main.ps1, Action-Test workflow)
  • ✅ Inputs: Settings, Name, WorkingDirectory (plus EventPath/EventJson for test overrides)
  • ✅ Outputs: Version, Prerelease, FullVersion, ReleaseType, CreateRelease
  • ✅ Port version-resolution logic from Publish-PSModule/src/init.ps1 (PSSemVer install, GitHub Releases query, PSGallery query, PR-label parsing, bump selection, prerelease sequencing, DatePrereleaseFormat, VersionPrefix)
  • ⬜ Dedicated Pester unit tests for label parsing, bump selection, and prerelease sequencing — covered by the six integration test jobs; a focused unit-test suite remains open

Related PRs:

@MariusStorhaug Marius Storhaug (MariusStorhaug) changed the title 🚀 [Feature]: Module version resolution now available as a standalone action 🌟 [Major]: Module version resolution now available as a standalone action May 22, 2026
@MariusStorhaug Marius Storhaug (MariusStorhaug) marked this pull request as ready for review May 22, 2026 22:19
Copilot AI review requested due to automatic review settings May 22, 2026 22:19
Copy link
Copy Markdown

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

This PR converts the repository from a template action into a standalone Resolve-PSModuleVersion composite GitHub Action that computes the next module version based on settings, PR labels, GitHub releases, and PowerShell Gallery state.

Changes:

  • Added a composite action contract (action.yml) with settings-driven version resolution and outputs for version metadata.
  • Implemented the version resolution logic in scripts/main.ps1, including label-based bump selection and (optional) prerelease tagging.
  • Added a GitHub Actions workflow to exercise common scenarios (patch/minor/major/auto-patch/ignore-label/none) and adjusted lint rules for action logging.

Reviewed changes

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

Show a summary per file
File Description
action.yml Defines the standalone composite action interface (inputs/outputs) and runs the resolver script after installing dependencies.
scripts/main.ps1 Implements version calculation and emits action outputs.
README.md Replaces the template README with minimal action identification text.
.github/workflows/Action-Test.yml Adds workflow-based validation jobs for several label/config scenarios.
.github/linters/.powershell-psscriptanalyzer.psd1 Updates PSScriptAnalyzer exclusions to allow Write-Host in runner logs.
Comments suppressed due to low confidence (1)

action.yml:23

  • The Debug/Verbose inputs are defined but never used by the composite steps or scripts/main.ps1, so consumers can’t actually enable debug/verbose behavior. Either wire these inputs into the script (e.g., set $DebugPreference/$VerbosePreference or pass flags) or remove them to keep the action contract accurate.
  Debug:
    description: Enable debug output.
    required: false
    default: 'false'
  Verbose:

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread action.yml Outdated
Comment thread scripts/main.ps1 Outdated
Comment thread scripts/main.ps1
Comment thread scripts/main.ps1
Comment thread README.md
- Remove unused Version/Prerelease inputs (template leftovers, collide by name with Version/Prerelease outputs)
- Fix PSGallery version filter: replace string -like with component comparison so 4-part versions (e.g. 1.2.3.0) match correctly
- Fix PSGallery and GitHub prerelease counter casts from [int] to [long] to prevent Int32 overflow when DatePrereleaseFormat produces date-prefixed counter strings (e.g. 20260523001)
@MariusStorhaug Marius Storhaug (MariusStorhaug) merged commit 3237617 into main May 22, 2026
22 checks passed
@MariusStorhaug Marius Storhaug (MariusStorhaug) deleted the feat/326-implement-action branch May 22, 2026 23:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

2 participants