3939
4040 outputs :
4141 Settings :
42- description : The path to the settings file.
42+ description : The complete settings object including test suites
4343 value : ${{ jobs.Get-Settings.outputs.Settings }}
44- SourceCodeTestSuites :
45- description : Source Code PSModule test suites to run.
46- value : ${{ jobs.Get-Settings.outputs.SourceCodeTestSuites }}
47- PSModuleTestSuites :
48- description : Module PSModule test suites to run.
49- value : ${{ jobs.Get-Settings.outputs.PSModuleTestSuites }}
50- ModuleTestSuites :
51- description : Module local test suites to run.
52- value : ${{ jobs.Get-Settings.outputs.ModuleTestSuites }}
5344
5445permissions :
5546 contents : read # to checkout the repo
5950 name : Get-Settings
6051 runs-on : ubuntu-latest
6152 outputs :
62- Settings : ${{ fromJson(steps.Get-Settings.outputs.result).Settings }}
63- SourceCodeTestSuites : ${{ fromJson(steps.Get-Settings.outputs.result).SourceCodeTestSuites }}
64- PSModuleTestSuites : ${{ fromJson(steps.Get-Settings.outputs.result).PSModuleTestSuites }}
65- ModuleTestSuites : ${{ fromJson(steps.Get-Settings.outputs.result).ModuleTestSuites }}
53+ Settings : ${{ steps.Get-Settings.outputs.Settings }}
6654 steps :
6755 - name : Checkout Code
6856 uses : actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
@@ -71,305 +59,12 @@ jobs:
7159 fetch-depth : 0
7260
7361 - name : Get-Settings
74- uses : PSModule/GitHub-Script@8b9d2739d6896975c0e5448d2021ae2b94b6766a # v1.7.6
62+ uses : PSModule/Get-PSModuleSettings@init
7563 id : Get-Settings
76- env :
77- PSMODULE_GET_SETTINGS_INPUT_Name : ${{ inputs.Name }}
78- PSMODULE_GET_SETTINGS_INPUT_SettingsPath : ${{ inputs.SettingsPath }}
7964 with :
80- Name : Get-Settings
81- ShowInfo : false
82- ShowOutput : true
65+ SettingsPath : ${{ inputs.SettingsPath }}
8366 Debug : ${{ inputs.Debug }}
8467 Prerelease : ${{ inputs.Prerelease }}
8568 Verbose : ${{ inputs.Verbose }}
8669 Version : ${{ inputs.Version }}
8770 WorkingDirectory : ${{ inputs.WorkingDirectory }}
88- Script : |
89- 'powershell-yaml' | Install-PSResource -Repository PSGallery -TrustRepository -Reinstall
90-
91- $inputName = $env:PSMODULE_GET_SETTINGS_INPUT_Name
92- $settingsPath = $env:PSMODULE_GET_SETTINGS_INPUT_SettingsPath
93- LogGroup "Inputs" {
94- [pscustomobject]@{
95- PWD = (Get-Location).Path
96- Name = $inputName
97- SettingsPath = $settingsPath
98- } | Format-List | Out-String
99- }
100-
101- if (![string]::IsNullOrEmpty($settingsPath) -and (Test-Path -Path $settingsPath)) {
102- LogGroup "Import settings" {
103- $settingsFile = Get-Item -Path $settingsPath
104- $relativeSettingsPath = $settingsFile | Resolve-Path -Relative
105- Write-Host "Importing settings from [$relativeSettingsPath]"
106- $content = $settingsFile | Get-Content -Raw
107- switch -Regex ($settingsFile.Extension) {
108- '.json' {
109- $settings = $content | ConvertFrom-Json
110- Write-Host ($settings | ConvertTo-Json -Depth 5 | Out-String)
111- }
112- '.yaml|.yml' {
113- $settings = $content | ConvertFrom-Yaml
114- Write-Host ($settings | ConvertTo-Yaml | Out-String)
115- }
116- '.psd1' {
117- $settings = $content | ConvertFrom-Hashtable
118- Write-Host ($settings | ConvertTo-Hashtable | Format-Hashtable | Out-String)
119- }
120- default {
121- throw "Unsupported settings file format: [$settingsPath]. Supported formats are json, yaml/yml and psd1."
122- }
123- }
124- }
125- } else {
126- Write-Host 'No settings file present.'
127- $settings = @{}
128- }
129-
130- LogGroup "Name" {
131- [pscustomobject]@{
132- InputName = $inputName
133- SettingsName = $settings.Name
134- RepositoryName = $env:GITHUB_REPOSITORY_NAME
135- } | Format-List | Out-String
136-
137- if (![string]::IsNullOrEmpty($inputName)) {
138- $name = $inputName
139- } elseif (![string]::IsNullOrEmpty($settings.Name)) {
140- $name = $settings.Name
141- } else {
142- $name = $env:GITHUB_REPOSITORY_NAME
143- }
144-
145- Write-Host "Using [$name] as the module name."
146- }
147-
148- $settings = [pscustomobject]@{
149- Name = $name
150- Test = [pscustomobject]@{
151- Skip = $settings.Test.Skip ?? $false
152- Linux = [pscustomobject]@{
153- Skip = $settings.Test.Linux.Skip ?? $false
154- }
155- MacOS = [pscustomobject]@{
156- Skip = $settings.Test.MacOS.Skip ?? $false
157- }
158- Windows = [pscustomobject]@{
159- Skip = $settings.Test.Windows.Skip ?? $false
160- }
161- SourceCode = [pscustomobject]@{
162- Skip = $settings.Test.SourceCode.Skip ?? $false
163- Linux = [pscustomobject]@{
164- Skip = $settings.Test.SourceCode.Linux.Skip ?? $false
165- }
166- MacOS = [pscustomobject]@{
167- Skip = $settings.Test.SourceCode.MacOS.Skip ?? $false
168- }
169- Windows = [pscustomobject]@{
170- Skip = $settings.Test.SourceCode.Windows.Skip ?? $false
171- }
172- }
173- PSModule = [pscustomobject]@{
174- Skip = $settings.Test.PSModule.Skip ?? $false
175- Linux = [pscustomobject]@{
176- Skip = $settings.Test.PSModule.Linux.Skip ?? $false
177- }
178- MacOS = [pscustomobject]@{
179- Skip = $settings.Test.PSModule.MacOS.Skip ?? $false
180- }
181- Windows = [pscustomobject]@{
182- Skip = $settings.Test.PSModule.Windows.Skip ?? $false
183- }
184- }
185- Module = [pscustomobject]@{
186- Skip = $settings.Test.Module.Skip ?? $false
187- Linux = [pscustomobject]@{
188- Skip = $settings.Test.Module.Linux.Skip ?? $false
189- }
190- MacOS = [pscustomobject]@{
191- Skip = $settings.Test.Module.MacOS.Skip ?? $false
192- }
193- Windows = [pscustomobject]@{
194- Skip = $settings.Test.Module.Windows.Skip ?? $false
195- }
196- }
197- TestResults = [pscustomobject]@{
198- Skip = $settings.Test.TestResults.Skip ?? $false
199- }
200- CodeCoverage = [pscustomobject]@{
201- Skip = $settings.Test.CodeCoverage.Skip ?? $false
202- PercentTarget = $settings.Test.CodeCoverage.PercentTarget ?? 0
203- StepSummaryMode = $settings.Test.CodeCoverage.StepSummary_Mode ?? 'Missed, Files'
204- }
205- }
206- Build = [pscustomobject]@{
207- Skip = $settings.Build.Skip ?? $false
208- Module = [pscustomobject]@{
209- Skip = $settings.Build.Module.Skip ?? $false
210- }
211- Docs = [pscustomobject]@{
212- Skip = $settings.Build.Docs.Skip ?? $false
213- ShowSummaryOnSuccess = $settings.Build.Docs.ShowSummaryOnSuccess ?? $false
214- }
215- Site = [pscustomobject]@{
216- Skip = $settings.Build.Site.Skip ?? $false
217- }
218- }
219- Publish = [pscustomobject]@{
220- Module = [pscustomobject]@{
221- Skip = $settings.Publish.Module.Skip ?? $false
222- AutoCleanup = $settings.Publish.Module.AutoCleanup ?? $true
223- AutoPatching = $settings.Publish.Module.AutoPatching ?? $true
224- IncrementalPrerelease = $settings.Publish.Module.IncrementalPrerelease ?? $true
225- DatePrereleaseFormat = $settings.Publish.Module.DatePrereleaseFormat ?? ''
226- VersionPrefix = $settings.Publish.Module.VersionPrefix ?? 'v'
227- MajorLabels = $settings.Publish.Module.MajorLabels ?? 'major, breaking'
228- MinorLabels = $settings.Publish.Module.MinorLabels ?? 'minor, feature'
229- PatchLabels = $settings.Publish.Module.PatchLabels ?? 'patch, fix'
230- IgnoreLabels = $settings.Publish.Module.IgnoreLabels ?? 'NoRelease'
231- }
232-
233- }
234- Linter = [pscustomobject]@{
235- Skip = $settings.Linter.Skip ?? $false
236- ShowSummaryOnSuccess = $settings.Linter.ShowSummaryOnSuccess ?? $false
237- env = $settings.Linter.env ?? @{}
238- }
239- }
240- LogGroup "Final settings" {
241- switch -Regex ($settingsFile.Extension) {
242- '.yaml|.yml' {
243- Write-Host ($settings | ConvertTo-Yaml | Out-String)
244- }
245- '.psd1' {
246- Write-Host ($settings | ConvertTo-Hashtable | Format-Hashtable | Out-String)
247- }
248- default {
249- Write-Host ($settings | ConvertTo-Json -Depth 5 | Out-String)
250- }
251- }
252- }
253-
254- Set-GitHubOutput -Name Settings -Value ($settings | ConvertTo-Json -Depth 10)
255-
256- # Get-TestSuites
257- if ($settings.Test.Skip) {
258- Write-Host 'Skipping all tests.'
259- Set-GitHubOutput -Name SourceCodeTestSuites -Value '[]'
260- Set-GitHubOutput -Name PSModuleTestSuites -Value '[]'
261- Set-GitHubOutput -Name ModuleTestSuites -Value '[]'
262- exit 0
263- }
264-
265- # Define test configurations as an array of hashtables.
266- $linux = [PSCustomObject]@{ RunsOn = 'ubuntu-latest'; OSName = 'Linux' }
267- $macOS = [PSCustomObject]@{ RunsOn = 'macos-latest'; OSName = 'macOS' }
268- $windows = [PSCustomObject]@{ RunsOn = 'windows-latest'; OSName = 'Windows' }
269-
270- LogGroup 'Source Code Test Suites:' {
271- $sourceCodeTestSuites = if ($settings.Test.SourceCode.Skip) {
272- Write-Host 'Skipping all source code tests.'
273- } else {
274- if (-not $settings.Test.Linux.Skip -and -not $settings.Test.SourceCode.Linux.Skip) { $linux }
275- if (-not $settings.Test.MacOS.Skip -and -not $settings.Test.SourceCode.MacOS.Skip) { $macOS }
276- if (-not $settings.Test.Windows.Skip -and -not $settings.Test.SourceCode.Windows.Skip) { $windows }
277- }
278- $sourceCodeTestSuites | Format-Table -AutoSize | Out-String
279- $sourceCodeTestSuites = ($null -ne $sourceCodeTestSuites) ? ($sourceCodeTestSuites | ConvertTo-Json -AsArray) : '[]'
280- Set-GitHubOutput -Name SourceCodeTestSuites -Value $sourceCodeTestSuites
281- }
282-
283- LogGroup 'PSModule Test Suites:' {
284- $psModuleTestSuites = if ($settings.Test.PSModule.Skip) {
285- Write-Host 'Skipping all PSModule tests.'
286- } else {
287- if (-not $settings.Test.Linux.Skip -and -not $settings.Test.PSModule.Linux.Skip) { $linux }
288- if (-not $settings.Test.MacOS.Skip -and -not $settings.Test.PSModule.MacOS.Skip) { $macOS }
289- if (-not $settings.Test.Windows.Skip -and -not $settings.Test.PSModule.Windows.Skip) { $windows }
290- }
291- $psModuleTestSuites | Format-Table -AutoSize | Out-String
292- $psModuleTestSuites = ($null -ne $psModuleTestSuites) ? ($psModuleTestSuites | ConvertTo-Json -AsArray) : '[]'
293- Set-GitHubOutput -Name PSModuleTestSuites -Value $psModuleTestSuites
294- }
295-
296- LogGroup 'Module Local Test Suites:' {
297- $moduleTestSuites = if ($settings.Test.Module.Skip) {
298- Write-Host 'Skipping all module tests.'
299- } else {
300- # Locate the tests directory.
301- $testsPath = Resolve-Path 'tests' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Path
302- if (-not $testsPath) {
303- Write-Warning 'No tests found'
304- }
305- Write-Host "Tests found at [$testsPath]"
306-
307- function Get-TestItemsFromFolder {
308- param ([string]$FolderPath)
309-
310- $configFiles = Get-ChildItem -Path $FolderPath -File -Filter '*.Configuration.ps1'
311- if ($configFiles.Count -eq 1) {
312- return @($configFiles)
313- } elseif ($configFiles.Count -gt 1) {
314- throw "Multiple configuration files found in [$FolderPath]. Please separate configurations into different folders."
315- }
316-
317- $containerFiles = Get-ChildItem -Path $FolderPath -File -Filter '*.Container.ps1'
318- if ($containerFiles.Count -ge 1) {
319- return $containerFiles
320- }
321-
322- $testFiles = Get-ChildItem -Path $FolderPath -File -Filter '*.Tests.ps1'
323- return $testFiles
324- }
325-
326- function Find-TestDirectories {
327- param ([string]$Path)
328-
329- $directories = @()
330- $childDirs = Get-ChildItem -Path $Path -Directory
331-
332- foreach ($dir in $childDirs) {
333- $directories += $dir.FullName
334- $directories += Find-TestDirectories -Path $dir.FullName
335- }
336-
337- return $directories
338- }
339-
340- $allTestFolders = @($testsPath) + (Find-TestDirectories -Path $testsPath)
341-
342- foreach ($folder in $allTestFolders) {
343- $testItems = Get-TestItemsFromFolder -FolderPath $folder
344- foreach ($item in $testItems) {
345- if (-not $settings.Test.Linux.Skip -and -not $settings.Test.Module.Linux.Skip) {
346- [pscustomobject]@{
347- RunsOn = $linux.RunsOn
348- OSName = $linux.OSName
349- TestPath = Resolve-Path -Path $item.FullName -Relative
350- TestName = ($item.BaseName).Split('.')[0]
351- }
352- }
353- if (-not $settings.Test.MacOS.Skip -and -not $settings.Test.Module.MacOS.Skip) {
354- [pscustomobject]@{
355- RunsOn = $macOS.RunsOn
356- OSName = $macOS.OSName
357- TestPath = Resolve-Path -Path $item.FullName -Relative
358- TestName = ($item.BaseName).Split('.')[0]
359- }
360- }
361- if (-not $settings.Test.Windows.Skip -and -not $settings.Test.Module.Windows.Skip) {
362- [pscustomobject]@{
363- RunsOn = $windows.RunsOn
364- OSName = $windows.OSName
365- TestPath = Resolve-Path -Path $item.FullName -Relative
366- TestName = ($item.BaseName).Split('.')[0]
367- }
368- }
369- }
370- }
371- }
372- $moduleTestSuites | Format-Table -AutoSize | Out-String
373- $moduleTestSuites = ($null -ne $moduleTestSuites) ? ($moduleTestSuites | ConvertTo-Json -AsArray) : '[]'
374- Set-GitHubOutput -Name ModuleTestSuites -Value $moduleTestSuites
375- }
0 commit comments