Repository navigation
Release Process
This page documents how to ship a new version of SPSUpdate. The process is centered on a single source of truth — the ModuleVersion field of SPSUpdate.Common.psd1 — and a v* git tag that triggers the GitHub release workflow.
SPSUpdate follows Semantic Versioning 2.0.
| Bump | When |
|---|---|
| MAJOR (X.0.0) | Breaking change in the .psd1 config/secrets format, the package layout, or a public module function signature. |
| MINOR (X.Y.0) | New backward-compatible feature (new action, new public function, new optional setting). |
| PATCH (X.Y.Z) | Bug fix or documentation-only change. |
Edit one value in src/Modules/SPSUpdate.Common/SPSUpdate.Common.psd1:
ModuleVersion = '4.0.0' # was '3.2.1'This single change propagates automatically to:
- The script banner (
$SPSUpdateVersionis read from(Get-Module SPSUpdate.Common).Version) - The
SPSUpdateEvent Log header (SPSUpdate Version: 4.0.0) - The
Get-Module SPSUpdate.Commonversion surfaced to users
Move the [Unreleased] block to a dated section for the version being released and add a fresh empty [Unreleased] heading on top:
## [Unreleased]
## [4.0.0] - 2026-MM-DD
### Added
...RELEASE-NOTES.md is used verbatim as the body of the GitHub Release. It must contain only the section of the version being released (no [Unreleased] header, no stacked history).
Import-Module .\src\Modules\SPSUpdate.Common\SPSUpdate.Common.psd1 -Force
(Get-Module SPSUpdate.Common).Version # should match the bumped version
Invoke-Pester -Path .\tests
Invoke-ScriptAnalyzer -Path .\src -Recurse -Settings .\PSScriptAnalyzerSettings.psd1git checkout -b release/4.0.0
git add -A
git commit -m "release: v4.0.0"
git push -u origin release/4.0.0Test the branch ZIP on a real farm first, then open a Pull Request, review, and merge to main.
git checkout main
git pull
git tag v4.0.0
git push origin v4.0.0The .github/workflows/release.yml workflow runs automatically. It:
- Packages the contents of
src/intoSPSUpdate-v4.0.0.zip(the archive extracts straight toSPSUpdate.ps1,Config\andModules\, with nosrc/wrapper). - Publishes a GitHub Release using
RELEASE-NOTES.mdas the body. - Attaches the ZIP and
LICENSEto the release.
- Releases: https://github.com/luigilink/SPSUpdate/releases — the new release is listed with the expected body and ZIP.
-
Actions: https://github.com/luigilink/SPSUpdate/actions —
release.ymlandpester.ymlran green. -
Wiki: https://github.com/luigilink/SPSUpdate/wiki —
wiki.ymlsynced anywiki/changes pushed in the same release.
Use a preview (pre-release) to validate a risky or hardware-dependent feature on a real farm before the general availability (GA) release — for example the automatic reboot feature, whose Windows-only reboot path can only be exercised on a live SharePoint server.
-
Tag carries a SemVer 2.0 pre-release label:
v<version>-preview.<N>(e.g.v5.1.0-preview.1,v5.1.0-preview.2, …). -
Module manifest keeps a numeric
ModuleVersion(e.g.5.1.0) and marks the preview with aPrereleasevalue underPrivateData.PSData(e.g.Prerelease = 'preview1').ModuleVersioncannot contain a-previewsuffix. ClearPrereleasefor the GA. -
CHANGELOG gets a dated
## [5.1.0-preview.1]section, keeping an empty## [Unreleased]on top. The GA later promotes the accumulated entries to## [5.1.0]. - RELEASE-NOTES.md describes the preview and how to test it.
release.yml sets prerelease: ${{ contains(github.ref_name, '-') }}, so:
- a tag with a
-(e.g.v5.1.0-preview.1) publishes a GitHub pre-release (not marked "latest"); - a plain tag (e.g.
v5.1.0) publishes a normal release.
# On the release branch (release/5.1.0): bump manifest Prerelease, promote CHANGELOG to
# the -preview.N section, write RELEASE-NOTES, validate, commit and push.
git checkout main
git pull
git tag v5.1.0-preview.1
git push origin v5.1.0-preview.1Share the pre-release with the tester (or the customer). Iterate with -preview.2,
-preview.3, … as needed.
Once the preview is validated:
- Remove the
Prereleasevalue fromPrivateData.PSDatain the manifest. - Rename the CHANGELOG
## [5.1.0-preview.N]heading to## [5.1.0] - <date>(keep## [Unreleased]on top). - Update
RELEASE-NOTES.mdfor the GA. - Tag
v5.1.0frommain(a plain tag → normal release).
If you tagged too early:
git tag -d v4.0.0
git push origin --delete v4.0.0Then delete the auto-created Release on GitHub, fix what needs fixing, commit, and re-tag from the new HEAD.
⚠️ Don't move a published tag that has been live for more than a few minutes. Prefer publishing avX.Y.(Z+1)patch release instead of rewritingvX.Y.Z.