From f897a03ae3e5a6dc0a41416723dabd23ffe9abcf Mon Sep 17 00:00:00 2001 From: MariusStorhaug Date: Fri, 22 May 2026 21:33:47 +0200 Subject: [PATCH 1/9] Stamp module version and prerelease into manifest from inputs --- action.yml | 8 ++++++++ src/helpers/Build-PSModule.ps1 | 12 ++++++++++-- src/helpers/Build/Build-PSModuleManifest.ps1 | 20 +++++++++++++++----- src/main.ps1 | 6 ++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/action.yml b/action.yml index 195bc0e..609b2ab 100644 --- a/action.yml +++ b/action.yml @@ -6,6 +6,12 @@ inputs: Name: description: Name of the module to process. required: false + Version: + description: Module version to stamp into the manifest. When empty, the manifest version defaults to `999.0.0`. + required: false + Prerelease: + description: Prerelease tag to stamp into the manifest's `PrivateData.PSData.Prerelease`. When empty, no prerelease tag is written. + required: false ArtifactName: description: Name of the artifact to upload. required: false @@ -27,6 +33,8 @@ runs: working-directory: ${{ inputs.WorkingDirectory }} env: PSMODULE_BUILD_PSMODULE_INPUT_Name: ${{ inputs.Name }} + PSMODULE_BUILD_PSMODULE_INPUT_Version: ${{ inputs.Version }} + PSMODULE_BUILD_PSMODULE_INPUT_Prerelease: ${{ inputs.Prerelease }} run: | # Build-PSModule ${{ github.action_path }}/src/main.ps1 diff --git a/src/helpers/Build-PSModule.ps1 b/src/helpers/Build-PSModule.ps1 index 15f1ac7..ecfa3c0 100644 --- a/src/helpers/Build-PSModule.ps1 +++ b/src/helpers/Build-PSModule.ps1 @@ -27,7 +27,15 @@ # Path to the folder where the built modules are outputted. [Parameter(Mandatory)] - [string] $ModuleOutputFolderPath + [string] $ModuleOutputFolderPath, + + # Module version to stamp into the manifest. When empty, defaults to '999.0.0'. + [Parameter()] + [string] $ModuleVersion, + + # Prerelease tag to stamp into the manifest. When empty, no prerelease tag is written. + [Parameter()] + [string] $ModulePrerelease ) Set-GitHubLogGroup "Building module [$ModuleName]" { @@ -40,7 +48,7 @@ } Build-PSModuleBase -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -ModuleOutputFolder $moduleOutputFolder - Build-PSModuleManifest -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder + Build-PSModuleManifest -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder -ModuleVersion $ModuleVersion -ModulePrerelease $ModulePrerelease Build-PSModuleRootModule -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder Update-PSModuleManifestAliasesToExport -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -ModuleOutputFolder $moduleOutputFolder diff --git a/src/helpers/Build/Build-PSModuleManifest.ps1 b/src/helpers/Build/Build-PSModuleManifest.ps1 index 115ee0e..02c6e45 100644 --- a/src/helpers/Build/Build-PSModuleManifest.ps1 +++ b/src/helpers/Build/Build-PSModuleManifest.ps1 @@ -30,7 +30,15 @@ # Folder where the built modules are outputted. 'outputs/modules/MyModule' [Parameter(Mandatory)] - [System.IO.DirectoryInfo] $ModuleOutputFolder + [System.IO.DirectoryInfo] $ModuleOutputFolder, + + # Module version to stamp into the manifest. When empty, defaults to '999.0.0'. + [Parameter()] + [string] $ModuleVersion, + + # Prerelease tag to stamp into the manifest's `PrivateData.PSData.Prerelease`. + [Parameter()] + [string] $ModulePrerelease ) Set-GitHubLogGroup 'Build manifest file' { @@ -55,7 +63,7 @@ $manifest.RootModule = $rootModule Write-Host "[RootModule] - [$($manifest.RootModule)]" - $manifest.ModuleVersion = '999.0.0' + $manifest.ModuleVersion = if ([string]::IsNullOrWhiteSpace($ModuleVersion)) { '999.0.0' } else { $ModuleVersion } Write-Host "[ModuleVersion] - [$($manifest.ModuleVersion)]" $manifest.Author = $manifest.Keys -contains 'Author' ? (-not [string]::IsNullOrEmpty($manifest.Author)) ? $manifest.Author : $env:GITHUB_REPOSITORY_OWNER : $env:GITHUB_REPOSITORY_OWNER @@ -417,9 +425,11 @@ $manifest.Remove('ReleaseNotes') } - Write-Host '[PreRelease]' - # $manifest.PreRelease = "" - # Is managed by the publish action + Write-Host '[Prerelease]' + if (-not [string]::IsNullOrWhiteSpace($ModulePrerelease)) { + $manifest.Prerelease = $ModulePrerelease + Write-Host "[Prerelease] - [$($manifest.Prerelease)]" + } Write-Host '[RequireLicenseAcceptance]' $manifest.RequireLicenseAcceptance = $PSData.Keys -contains 'RequireLicenseAcceptance' ? $null -ne $PSData.RequireLicenseAcceptance ? $PSData.RequireLicenseAcceptance : $false : $false diff --git a/src/main.ps1 b/src/main.ps1 index f5f6fba..277b42a 100644 --- a/src/main.ps1 +++ b/src/main.ps1 @@ -21,10 +21,14 @@ Set-GitHubLogGroup 'Loading inputs' { } else { $env:PSMODULE_BUILD_PSMODULE_INPUT_Name } + $moduleVersion = $env:PSMODULE_BUILD_PSMODULE_INPUT_Version + $modulePrerelease = $env:PSMODULE_BUILD_PSMODULE_INPUT_Prerelease $sourceFolderPath = Resolve-Path -Path 'src' | Select-Object -ExpandProperty Path $moduleOutputFolderPath = Join-Path $pwd -ChildPath 'outputs/module' [pscustomobject]@{ moduleName = $moduleName + moduleVersion = $moduleVersion + modulePrerelease = $modulePrerelease sourceFolderPath = $sourceFolderPath moduleOutputFolderPath = $moduleOutputFolderPath } | Format-List | Out-String @@ -47,6 +51,8 @@ $params = @{ ModuleName = $moduleName ModuleSourceFolderPath = $sourceFolderPath ModuleOutputFolderPath = $moduleOutputFolderPath + ModuleVersion = $moduleVersion + ModulePrerelease = $modulePrerelease } Build-PSModule @params From 3b262963c7007493813db213dac28d9a65a4c024 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 24 May 2026 16:15:48 +0200 Subject: [PATCH 2/9] Rename inputs: remove Name, add OutputFolder; make Version mandatory - Remove Name input; module name is always inferred from GITHUB_REPOSITORY_NAME - Add OutputFolder input (default: outputs/module) to configure the build output path - Make Version required in action.yml, mandatory in Build-PSModule and Build-PSModuleManifest helpers - Remove 999.0.0 version fallback; build now fails explicitly when Version is not provided - Update Action-Test.yml: remove Name input, add Version: 1.0.0 to all test jobs --- .github/workflows/Action-Test.yml | 6 +++--- action.yml | 11 ++++++----- src/helpers/Build-PSModule.ps1 | 4 ++-- src/helpers/Build/Build-PSModuleManifest.ps1 | 6 +++--- src/main.ps1 | 12 ++++++------ 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index fcd1e21..f6a5e3f 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -30,7 +30,7 @@ jobs: - name: Action-Test uses: ./ with: - Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestDefault WorkingDirectory: tests/srcTestRepo @@ -46,7 +46,7 @@ jobs: - name: Action-Test uses: ./ with: - Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestMinimal WorkingDirectory: tests/srcMinimalTestRepo @@ -62,6 +62,6 @@ jobs: - name: Action-Test uses: ./ with: - Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestWithManifest WorkingDirectory: tests/srcWithManifestTestRepo diff --git a/action.yml b/action.yml index 609b2ab..58562c9 100644 --- a/action.yml +++ b/action.yml @@ -3,12 +3,13 @@ description: Build a PowerShell module to the PowerShell Gallery. author: PSModule inputs: - Name: - description: Name of the module to process. + OutputFolder: + description: Path to the folder where the built module is outputted. required: false + default: 'outputs/module' Version: - description: Module version to stamp into the manifest. When empty, the manifest version defaults to `999.0.0`. - required: false + description: Module version to stamp into the manifest. + required: true Prerelease: description: Prerelease tag to stamp into the manifest's `PrivateData.PSData.Prerelease`. When empty, no prerelease tag is written. required: false @@ -32,7 +33,7 @@ runs: id: build working-directory: ${{ inputs.WorkingDirectory }} env: - PSMODULE_BUILD_PSMODULE_INPUT_Name: ${{ inputs.Name }} + PSMODULE_BUILD_PSMODULE_INPUT_OutputFolder: ${{ inputs.OutputFolder }} PSMODULE_BUILD_PSMODULE_INPUT_Version: ${{ inputs.Version }} PSMODULE_BUILD_PSMODULE_INPUT_Prerelease: ${{ inputs.Prerelease }} run: | diff --git a/src/helpers/Build-PSModule.ps1 b/src/helpers/Build-PSModule.ps1 index ecfa3c0..bcc7797 100644 --- a/src/helpers/Build-PSModule.ps1 +++ b/src/helpers/Build-PSModule.ps1 @@ -29,8 +29,8 @@ [Parameter(Mandatory)] [string] $ModuleOutputFolderPath, - # Module version to stamp into the manifest. When empty, defaults to '999.0.0'. - [Parameter()] + # Module version to stamp into the manifest. + [Parameter(Mandatory)] [string] $ModuleVersion, # Prerelease tag to stamp into the manifest. When empty, no prerelease tag is written. diff --git a/src/helpers/Build/Build-PSModuleManifest.ps1 b/src/helpers/Build/Build-PSModuleManifest.ps1 index 02c6e45..fd564a6 100644 --- a/src/helpers/Build/Build-PSModuleManifest.ps1 +++ b/src/helpers/Build/Build-PSModuleManifest.ps1 @@ -32,8 +32,8 @@ [Parameter(Mandatory)] [System.IO.DirectoryInfo] $ModuleOutputFolder, - # Module version to stamp into the manifest. When empty, defaults to '999.0.0'. - [Parameter()] + # Module version to stamp into the manifest. + [Parameter(Mandatory)] [string] $ModuleVersion, # Prerelease tag to stamp into the manifest's `PrivateData.PSData.Prerelease`. @@ -63,7 +63,7 @@ $manifest.RootModule = $rootModule Write-Host "[RootModule] - [$($manifest.RootModule)]" - $manifest.ModuleVersion = if ([string]::IsNullOrWhiteSpace($ModuleVersion)) { '999.0.0' } else { $ModuleVersion } + $manifest.ModuleVersion = $ModuleVersion Write-Host "[ModuleVersion] - [$($manifest.ModuleVersion)]" $manifest.Author = $manifest.Keys -contains 'Author' ? (-not [string]::IsNullOrEmpty($manifest.Author)) ? $manifest.Author : $env:GITHUB_REPOSITORY_OWNER : $env:GITHUB_REPOSITORY_OWNER diff --git a/src/main.ps1 b/src/main.ps1 index 277b42a..076a606 100644 --- a/src/main.ps1 +++ b/src/main.ps1 @@ -16,15 +16,11 @@ Set-GitHubLogGroup "Loading helper scripts from [$path]" { $env:GITHUB_REPOSITORY_NAME = $env:GITHUB_REPOSITORY -replace '.+/' Set-GitHubLogGroup 'Loading inputs' { - $moduleName = if ([string]::IsNullOrEmpty($env:PSMODULE_BUILD_PSMODULE_INPUT_Name)) { - $env:GITHUB_REPOSITORY_NAME - } else { - $env:PSMODULE_BUILD_PSMODULE_INPUT_Name - } + $moduleName = $env:GITHUB_REPOSITORY_NAME $moduleVersion = $env:PSMODULE_BUILD_PSMODULE_INPUT_Version $modulePrerelease = $env:PSMODULE_BUILD_PSMODULE_INPUT_Prerelease $sourceFolderPath = Resolve-Path -Path 'src' | Select-Object -ExpandProperty Path - $moduleOutputFolderPath = Join-Path $pwd -ChildPath 'outputs/module' + $moduleOutputFolderPath = Join-Path $pwd -ChildPath $env:PSMODULE_BUILD_PSMODULE_INPUT_OutputFolder [pscustomobject]@{ moduleName = $moduleName moduleVersion = $moduleVersion @@ -34,6 +30,10 @@ Set-GitHubLogGroup 'Loading inputs' { } | Format-List | Out-String } +if ([string]::IsNullOrWhiteSpace($moduleVersion)) { + throw 'Version is required. Please provide a module version.' +} + Set-GitHubLogGroup 'Build local scripts' { Write-Host 'Execution order:' $scripts = Get-ChildItem -Filter '*build.ps1' -Recurse | Sort-Object -Property Name | Resolve-Path -Relative From dbad0716f16c7ebe273cca790130f7b387617150 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 24 May 2026 17:08:39 +0200 Subject: [PATCH 3/9] Restore Name as optional input; defaults to repository name --- .github/workflows/Action-Test.yml | 3 +++ action.yml | 4 ++++ src/main.ps1 | 6 +++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index f6a5e3f..89dc9fb 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -30,6 +30,7 @@ jobs: - name: Action-Test uses: ./ with: + Name: PSModuleTest Version: 1.0.0 ArtifactName: PSModuleTestDefault WorkingDirectory: tests/srcTestRepo @@ -46,6 +47,7 @@ jobs: - name: Action-Test uses: ./ with: + Name: PSModuleTest Version: 1.0.0 ArtifactName: PSModuleTestMinimal WorkingDirectory: tests/srcMinimalTestRepo @@ -62,6 +64,7 @@ jobs: - name: Action-Test uses: ./ with: + Name: PSModuleTest Version: 1.0.0 ArtifactName: PSModuleTestWithManifest WorkingDirectory: tests/srcWithManifestTestRepo diff --git a/action.yml b/action.yml index 58562c9..24ad9d9 100644 --- a/action.yml +++ b/action.yml @@ -3,6 +3,9 @@ description: Build a PowerShell module to the PowerShell Gallery. author: PSModule inputs: + Name: + description: Name of the module to build. Defaults to the repository name. + required: false OutputFolder: description: Path to the folder where the built module is outputted. required: false @@ -33,6 +36,7 @@ runs: id: build working-directory: ${{ inputs.WorkingDirectory }} env: + PSMODULE_BUILD_PSMODULE_INPUT_Name: ${{ inputs.Name }} PSMODULE_BUILD_PSMODULE_INPUT_OutputFolder: ${{ inputs.OutputFolder }} PSMODULE_BUILD_PSMODULE_INPUT_Version: ${{ inputs.Version }} PSMODULE_BUILD_PSMODULE_INPUT_Prerelease: ${{ inputs.Prerelease }} diff --git a/src/main.ps1 b/src/main.ps1 index 076a606..9082be7 100644 --- a/src/main.ps1 +++ b/src/main.ps1 @@ -16,7 +16,11 @@ Set-GitHubLogGroup "Loading helper scripts from [$path]" { $env:GITHUB_REPOSITORY_NAME = $env:GITHUB_REPOSITORY -replace '.+/' Set-GitHubLogGroup 'Loading inputs' { - $moduleName = $env:GITHUB_REPOSITORY_NAME + $moduleName = if ([string]::IsNullOrEmpty($env:PSMODULE_BUILD_PSMODULE_INPUT_Name)) { + $env:GITHUB_REPOSITORY_NAME + } else { + $env:PSMODULE_BUILD_PSMODULE_INPUT_Name + } $moduleVersion = $env:PSMODULE_BUILD_PSMODULE_INPUT_Version $modulePrerelease = $env:PSMODULE_BUILD_PSMODULE_INPUT_Prerelease $sourceFolderPath = Resolve-Path -Path 'src' | Select-Object -ExpandProperty Path From 06a216a442ee663a5e60de1bd959ff0df0473fc1 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 24 May 2026 17:13:34 +0200 Subject: [PATCH 4/9] Fix PSAvoidLongLines: split Build-PSModuleManifest call --- src/helpers/Build-PSModule.ps1 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/helpers/Build-PSModule.ps1 b/src/helpers/Build-PSModule.ps1 index bcc7797..f4ee2ba 100644 --- a/src/helpers/Build-PSModule.ps1 +++ b/src/helpers/Build-PSModule.ps1 @@ -48,7 +48,8 @@ } Build-PSModuleBase -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -ModuleOutputFolder $moduleOutputFolder - Build-PSModuleManifest -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder -ModuleVersion $ModuleVersion -ModulePrerelease $ModulePrerelease + Build-PSModuleManifest -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder ` + -ModuleVersion $ModuleVersion -ModulePrerelease $ModulePrerelease Build-PSModuleRootModule -ModuleName $ModuleName -ModuleOutputFolder $moduleOutputFolder Update-PSModuleManifestAliasesToExport -ModuleName $ModuleName -ModuleSourceFolder $moduleSourceFolder -ModuleOutputFolder $moduleOutputFolder From 3c823989eb36db55c1edab832e4463235b8e0b6f Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Sun, 24 May 2026 17:15:21 +0200 Subject: [PATCH 5/9] Add manifest verification step to all Action-Test jobs --- .github/workflows/Action-Test.yml | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index 89dc9fb..e5754c6 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -35,7 +35,14 @@ jobs: ArtifactName: PSModuleTestDefault WorkingDirectory: tests/srcTestRepo - ActionTestMinimal: + - name: Verify manifest + shell: pwsh + run: | + $manifest = Import-PowerShellDataFile 'tests/srcTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + if ($manifest.ModuleVersion -ne '1.0.0') { + throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + } + Write-Host "ModuleVersion: $($manifest.ModuleVersion)" name: Action-Test - [Minimal] runs-on: ubuntu-latest steps: @@ -52,6 +59,15 @@ jobs: ArtifactName: PSModuleTestMinimal WorkingDirectory: tests/srcMinimalTestRepo + - name: Verify manifest + shell: pwsh + run: | + $manifest = Import-PowerShellDataFile 'tests/srcMinimalTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + if ($manifest.ModuleVersion -ne '1.0.0') { + throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + } + Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + ActionTestWithManifest: name: Action-Test - [DefaultWithManifest] runs-on: ubuntu-24.04 @@ -68,3 +84,12 @@ jobs: Version: 1.0.0 ArtifactName: PSModuleTestWithManifest WorkingDirectory: tests/srcWithManifestTestRepo + + - name: Verify manifest + shell: pwsh + run: | + $manifest = Import-PowerShellDataFile 'tests/srcWithManifestTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + if ($manifest.ModuleVersion -ne '1.0.0') { + throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + } + Write-Host "ModuleVersion: $($manifest.ModuleVersion)" From 93e90caaf177b6f106f76ac2411dab469c9a3be8 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 25 May 2026 00:19:15 +0200 Subject: [PATCH 6/9] Add ActionTestMinimal job to Action-Test workflow --- .github/workflows/Action-Test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index e5754c6..8d0aa27 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -43,6 +43,8 @@ jobs: throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" } Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + + ActionTestMinimal: name: Action-Test - [Minimal] runs-on: ubuntu-latest steps: From ad5c639294ce757992184f38c4ca56abc3a2ec08 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 25 May 2026 00:30:49 +0200 Subject: [PATCH 7/9] Add Prerelease test job with manifest verification --- .github/workflows/Action-Test.yml | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index 8d0aa27..7c26f3a 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -70,6 +70,38 @@ jobs: } Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + ActionTestPrerelease: + name: Action-Test - [Prerelease] + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + persist-credentials: false + + - name: Action-Test + uses: ./ + with: + Name: PSModuleTest + Version: 2.0.0 + Prerelease: alpha001 + ArtifactName: PSModuleTestPrerelease + WorkingDirectory: tests/srcTestRepo + + - name: Verify manifest + shell: pwsh + run: | + $manifest = Import-PowerShellDataFile 'tests/srcTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + if ($manifest.ModuleVersion -ne '2.0.0') { + throw "Expected ModuleVersion '2.0.0' but got '$($manifest.ModuleVersion)'" + } + $prerelease = $manifest.PrivateData.PSData.Prerelease + if ($prerelease -ne 'alpha001') { + throw "Expected Prerelease 'alpha001' but got '$prerelease'" + } + Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + Write-Host "Prerelease: $prerelease" + ActionTestWithManifest: name: Action-Test - [DefaultWithManifest] runs-on: ubuntu-24.04 From 32d3e81cb22646087ef7eb719fedab0744c03753 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 25 May 2026 00:38:12 +0200 Subject: [PATCH 8/9] Verify steps: use PSCustomObject table pattern matching Resolve-PSModuleVersion --- .github/workflows/Action-Test.yml | 75 ++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 11 deletions(-) diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index 7c26f3a..f581907 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -38,11 +38,24 @@ jobs: - name: Verify manifest shell: pwsh run: | + $PSStyle.OutputRendering = 'Ansi' + $manifest = Import-PowerShellDataFile 'tests/srcTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + + Write-Host '--- Input ---' + Write-Host 'Name: PSModuleTest Version: 1.0.0' + Write-Host '' + + @( + [PSCustomObject]@{ Output = 'ModuleVersion'; Expected = '1.0.0'; Actual = $manifest.ModuleVersion; Passed = $manifest.ModuleVersion -eq '1.0.0' } + ) | Format-Table -AutoSize | Out-String -Width 200 + + $failed = $false if ($manifest.ModuleVersion -ne '1.0.0') { - throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true } - Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + if ($failed) { exit 1 } ActionTestMinimal: name: Action-Test - [Minimal] @@ -64,11 +77,24 @@ jobs: - name: Verify manifest shell: pwsh run: | + $PSStyle.OutputRendering = 'Ansi' + $manifest = Import-PowerShellDataFile 'tests/srcMinimalTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + + Write-Host '--- Input ---' + Write-Host 'Name: PSModuleTest Version: 1.0.0' + Write-Host '' + + @( + [PSCustomObject]@{ Output = 'ModuleVersion'; Expected = '1.0.0'; Actual = $manifest.ModuleVersion; Passed = $manifest.ModuleVersion -eq '1.0.0' } + ) | Format-Table -AutoSize | Out-String -Width 200 + + $failed = $false if ($manifest.ModuleVersion -ne '1.0.0') { - throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true } - Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + if ($failed) { exit 1 } ActionTestPrerelease: name: Action-Test - [Prerelease] @@ -91,16 +117,30 @@ jobs: - name: Verify manifest shell: pwsh run: | + $PSStyle.OutputRendering = 'Ansi' + $manifest = Import-PowerShellDataFile 'tests/srcTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + $prerelease = $manifest.PrivateData.PSData.Prerelease + + Write-Host '--- Input ---' + Write-Host 'Name: PSModuleTest Version: 2.0.0 Prerelease: alpha001' + Write-Host '' + + @( + [PSCustomObject]@{ Output = 'ModuleVersion'; Expected = '2.0.0'; Actual = $manifest.ModuleVersion; Passed = $manifest.ModuleVersion -eq '2.0.0' } + [PSCustomObject]@{ Output = 'Prerelease'; Expected = 'alpha001'; Actual = $prerelease; Passed = $prerelease -eq 'alpha001' } + ) | Format-Table -AutoSize | Out-String -Width 200 + + $failed = $false if ($manifest.ModuleVersion -ne '2.0.0') { - throw "Expected ModuleVersion '2.0.0' but got '$($manifest.ModuleVersion)'" + Write-Error "ModuleVersion: expected '2.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true } - $prerelease = $manifest.PrivateData.PSData.Prerelease if ($prerelease -ne 'alpha001') { - throw "Expected Prerelease 'alpha001' but got '$prerelease'" + Write-Error "Prerelease: expected 'alpha001', got '$prerelease'" + $failed = $true } - Write-Host "ModuleVersion: $($manifest.ModuleVersion)" - Write-Host "Prerelease: $prerelease" + if ($failed) { exit 1 } ActionTestWithManifest: name: Action-Test - [DefaultWithManifest] @@ -122,8 +162,21 @@ jobs: - name: Verify manifest shell: pwsh run: | + $PSStyle.OutputRendering = 'Ansi' + $manifest = Import-PowerShellDataFile 'tests/srcWithManifestTestRepo/outputs/module/PSModuleTest/PSModuleTest.psd1' + + Write-Host '--- Input ---' + Write-Host 'Name: PSModuleTest Version: 1.0.0' + Write-Host '' + + @( + [PSCustomObject]@{ Output = 'ModuleVersion'; Expected = '1.0.0'; Actual = $manifest.ModuleVersion; Passed = $manifest.ModuleVersion -eq '1.0.0' } + ) | Format-Table -AutoSize | Out-String -Width 200 + + $failed = $false if ($manifest.ModuleVersion -ne '1.0.0') { - throw "Expected ModuleVersion '1.0.0' but got '$($manifest.ModuleVersion)'" + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true } - Write-Host "ModuleVersion: $($manifest.ModuleVersion)" + if ($failed) { exit 1 } From 6ce64762620ca3bbac55267a03087c0331527387 Mon Sep 17 00:00:00 2001 From: Marius Storhaug Date: Mon, 25 May 2026 00:49:19 +0200 Subject: [PATCH 9/9] Validate Version format as Major.Minor.Patch before build --- src/main.ps1 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.ps1 b/src/main.ps1 index 9082be7..b782d90 100644 --- a/src/main.ps1 +++ b/src/main.ps1 @@ -38,6 +38,10 @@ if ([string]::IsNullOrWhiteSpace($moduleVersion)) { throw 'Version is required. Please provide a module version.' } +if ($moduleVersion -notmatch '^\d+\.\d+\.\d+$') { + throw "Version '$moduleVersion' is not a valid version. Expected format: 'Major.Minor.Patch' (e.g., '1.2.3')." +} + Set-GitHubLogGroup 'Build local scripts' { Write-Host 'Execution order:' $scripts = Get-ChildItem -Filter '*build.ps1' -Recurse | Sort-Object -Property Name | Resolve-Path -Relative