The coverage gate now counts covered lines itself instead of reading the report's summary rate, matches package names exactly, and shows the percentage rounded down. Its tests cover reports whose stated rate disagrees with their lines, several packages, and several reports. The long fuzz campaigns run only on main and tags, where they differ from what the ordinary test run already did, decide that from the ref, print the iteration count, and fail when their filter matches no test. Test helpers no longer remove the temp folder and registry key that all test processes share: a second process could be creating its own entry there at that moment. AGENTS.md, the fuzzing assessment and the installed-update guide describe what runs today. Refs #54 Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com> Signed-off-by: James Maes <james@kof22.com>
64 lines
4.4 KiB
YAML
64 lines
4.4 KiB
YAML
name: build
|
|
on:
|
|
push:
|
|
branches: ['**']
|
|
tags: ['v*']
|
|
jobs:
|
|
windows:
|
|
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/windows.yaml@v1
|
|
with:
|
|
commands: |
|
|
dotnet restore MarkdownViewr.Windows.slnx -p:Platform=x64 --locked-mode
|
|
dotnet build MarkdownViewr.Windows.slnx -p:Platform=x64 -warnaserror --no-restore
|
|
# The WinUI app project is built directly so the format workspace can load its generated XAML code.
|
|
dotnet build src/MarkdownViewr.Windows/MarkdownViewr.Windows.csproj -p:Platform=x64 -warnaserror --no-restore
|
|
$env:Platform = 'x64'
|
|
dotnet format MarkdownViewr.Windows.slnx --verify-no-changes --severity warn --no-restore
|
|
Remove-Item Env:Platform
|
|
# The host runner keeps its workspace between runs; the coverage gate must see this run's report only.
|
|
if (Test-Path TestResults) { Remove-Item TestResults -Recurse -Force }
|
|
dotnet test tests/MarkdownViewr.Windows.Core.Tests --no-build --settings coverage.runsettings --collect:"XPlat Code Coverage" --logger trx --results-directory TestResults
|
|
pwsh -NoProfile -File ./build/Assert-Coverage.ps1 -ResultsDirectory TestResults -Packages MarkdownViewr.Windows.Core
|
|
# Windows adapters (files, watcher, registry) against the real operating system. The Desktop
|
|
# category drives the app with mouse and keyboard and needs an interactive session.
|
|
dotnet test tests/MarkdownViewr.Windows.UiTests --no-build --filter "Category!=Desktop" --logger trx --results-directory TestResults
|
|
# The runs above include the seeded parser campaigns at 500 iterations. Main and tags repeat
|
|
# them at 10000; a filter that matches no test fails, so a renamed category cannot pass unseen.
|
|
if ($env:GITHUB_REF -eq 'refs/heads/main' -or $env:GITHUB_REF -like 'refs/tags/*') {
|
|
$env:K22_FUZZ_ITERATIONS = '10000'
|
|
Write-Output "Parser campaigns at $env:K22_FUZZ_ITERATIONS iterations for $env:GITHUB_REF"
|
|
dotnet test tests/MarkdownViewr.Windows.Core.Tests --no-build --filter "Category=Fuzz" -- RunConfiguration.TreatNoTestsAsError=true
|
|
dotnet test tests/MarkdownViewr.Windows.UiTests --no-build --filter "Category=Fuzz" -- RunConfiguration.TreatNoTestsAsError=true
|
|
Remove-Item Env:K22_FUZZ_ITERATIONS
|
|
}
|
|
# PowerShell build scripts: analyzer and Pester boundary tests with pinned modules saved to the job's temp directory.
|
|
$modules = Join-Path ($env:RUNNER_TEMP ?? [IO.Path]::GetTempPath()) "psmodules-$env:GITHUB_RUN_ID"
|
|
New-Item -ItemType Directory -Force -Path $modules | Out-Null
|
|
Save-PSResource -Name PSScriptAnalyzer -Version 1.25.0 -Repository PSGallery -TrustRepository -Path $modules
|
|
Save-PSResource -Name Pester -Version 5.7.1 -Repository PSGallery -TrustRepository -Path $modules
|
|
Import-Module (Join-Path $modules PSScriptAnalyzer/1.25.0/PSScriptAnalyzer.psd1)
|
|
Import-Module (Join-Path $modules Pester/5.7.1/Pester.psd1)
|
|
foreach ($file in Get-ChildItem -LiteralPath build -Recurse -File | Where-Object Extension -In '.ps1', '.psm1', '.psd1') {
|
|
# Casing runs in its own pass: command metadata races other rules in 1.25.0 (PSScriptAnalyzer#1708).
|
|
$findings = @(
|
|
Invoke-ScriptAnalyzer -Path $file.FullName -Settings ./PSScriptAnalyzerSettings.psd1 -IncludeRule PSUseCorrectCasing
|
|
Invoke-ScriptAnalyzer -Path $file.FullName -Settings ./PSScriptAnalyzerSettings.psd1 -ExcludeRule PSUseCorrectCasing
|
|
)
|
|
if ($findings.Count -gt 0) { $findings | Format-Table; throw "Script analysis failed: $($file.Name)" }
|
|
}
|
|
# The Pester suites assert on child processes' exit codes themselves.
|
|
$PSNativeCommandUseErrorActionPreference = $false
|
|
$pester = New-PesterConfiguration
|
|
$pester.Run.Path = @('build/Assert-Coverage.Tests.ps1', 'build/GitHubRepository.Tests.ps1', 'build/Distribution.Tests.ps1', 'build/InstalledUpdates.Tests.ps1', 'build/PackageBytes.Tests.ps1', 'build/ReleaseSigning.Tests.ps1')
|
|
$pester.Run.PassThru = $true
|
|
if ((Invoke-Pester -Configuration $pester).Result -ne 'Passed') { throw 'Pester tests failed' }
|
|
scripts:
|
|
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/node.yaml@v1
|
|
with:
|
|
node-version: '24'
|
|
install: npm ci --ignore-scripts
|
|
commands: |
|
|
npm run lint
|
|
npm test
|
|
npm audit signatures
|