diff --git a/.github/workflows/Action-Test.yml b/.github/workflows/Action-Test.yml index fcd1e21..f581907 100644 --- a/.github/workflows/Action-Test.yml +++ b/.github/workflows/Action-Test.yml @@ -31,9 +31,32 @@ jobs: uses: ./ with: Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestDefault WorkingDirectory: tests/srcTestRepo + - 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') { + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true + } + if ($failed) { exit 1 } + ActionTestMinimal: name: Action-Test - [Minimal] runs-on: ubuntu-latest @@ -47,9 +70,78 @@ jobs: uses: ./ with: Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestMinimal WorkingDirectory: tests/srcMinimalTestRepo + - 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') { + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true + } + if ($failed) { exit 1 } + + 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: | + $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') { + Write-Error "ModuleVersion: expected '2.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true + } + if ($prerelease -ne 'alpha001') { + Write-Error "Prerelease: expected 'alpha001', got '$prerelease'" + $failed = $true + } + if ($failed) { exit 1 } + ActionTestWithManifest: name: Action-Test - [DefaultWithManifest] runs-on: ubuntu-24.04 @@ -63,5 +155,28 @@ jobs: uses: ./ with: Name: PSModuleTest + Version: 1.0.0 ArtifactName: PSModuleTestWithManifest WorkingDirectory: tests/srcWithManifestTestRepo + + - 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') { + Write-Error "ModuleVersion: expected '1.0.0', got '$($manifest.ModuleVersion)'" + $failed = $true + } + if ($failed) { exit 1 } diff --git a/action.yml b/action.yml index 195bc0e..24ad9d9 100644 --- a/action.yml +++ b/action.yml @@ -4,7 +4,17 @@ author: PSModule inputs: Name: - description: Name of the module to process. + 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 + default: 'outputs/module' + Version: + 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 ArtifactName: description: Name of the artifact to upload. @@ -27,6 +37,9 @@ runs: 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: | # Build-PSModule ${{ github.action_path }}/src/main.ps1 diff --git a/src/helpers/Build-PSModule.ps1 b/src/helpers/Build-PSModule.ps1 index 15f1ac7..f4ee2ba 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. + [Parameter(Mandatory)] + [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,8 @@ } 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..fd564a6 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. + [Parameter(Mandatory)] + [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 = $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..b782d90 100644 --- a/src/main.ps1 +++ b/src/main.ps1 @@ -21,15 +21,27 @@ 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' + $moduleOutputFolderPath = Join-Path $pwd -ChildPath $env:PSMODULE_BUILD_PSMODULE_INPUT_OutputFolder [pscustomobject]@{ moduleName = $moduleName + moduleVersion = $moduleVersion + modulePrerelease = $modulePrerelease sourceFolderPath = $sourceFolderPath moduleOutputFolderPath = $moduleOutputFolderPath } | Format-List | Out-String } +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 @@ -47,6 +59,8 @@ $params = @{ ModuleName = $moduleName ModuleSourceFolderPath = $sourceFolderPath ModuleOutputFolderPath = $moduleOutputFolderPath + ModuleVersion = $moduleVersion + ModulePrerelease = $modulePrerelease } Build-PSModule @params