Skip to content

Commit 12d0c59

Browse files
refactor: streamline settings handling and linting workflow integration
1 parent e02a92b commit 12d0c59

File tree

4 files changed

+110
-420
lines changed

4 files changed

+110
-420
lines changed

.github/workflows/Get-Settings.yml

Lines changed: 4 additions & 309 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,8 @@ on:
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

5445
permissions:
5546
contents: read # to checkout the repo
@@ -59,10 +50,7 @@ jobs:
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-
}

.github/workflows/Get-TestResults.yml

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,9 @@ name: Get-TestResults
33
on:
44
workflow_call:
55
inputs:
6-
SourceCodeTestSuites:
6+
Settings:
77
type: string
8-
description: The test suites to run for the source code.
9-
required: true
10-
PSModuleTestSuites:
11-
type: string
12-
description: The test suites to run for the PSModule.
13-
required: true
14-
ModuleTestSuites:
15-
type: string
16-
description: The test suites to run for the module.
8+
description: The complete settings object including test suites.
179
required: true
1810
Debug:
1911
type: boolean
@@ -53,9 +45,9 @@ jobs:
5345
uses: PSModule/Get-PesterTestResults@0c1d8cde9575b192831f76e87d3f7e825a7d8ff4 # v1.0.7
5446
id: Get-TestResults
5547
with:
56-
SourceCodeTestSuites: ${{ inputs.SourceCodeTestSuites }}
57-
PSModuleTestSuites: ${{ inputs.PSModuleTestSuites }}
58-
ModuleTestSuites: ${{ inputs.ModuleTestSuites }}
48+
SourceCodeTestSuites: ${{ fromJson(inputs.Settings).TestSuites.SourceCode }}
49+
PSModuleTestSuites: ${{ fromJson(inputs.Settings).TestSuites.PSModule }}
50+
ModuleTestSuites: ${{ fromJson(inputs.Settings).TestSuites.Module }}
5951
Debug: ${{ inputs.Debug }}
6052
Prerelease: ${{ inputs.Prerelease }}
6153
Verbose: ${{ inputs.Verbose }}

0 commit comments

Comments
 (0)