Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
154dd2d
Temporary UI Test crashlog build runner status
SleepyKevy Aug 19, 2026
c6fcc6b
Trigger temporary UI Test crashlog Windows build
SleepyKevy Aug 19, 2026
7c81edd
Enable temporary PR-triggered UI Test build
SleepyKevy Aug 19, 2026
9fab9db
Temporary crashlog build source chunk 02
SleepyKevy Aug 19, 2026
4351950
Stage verified crashlog source 00
SleepyKevy Aug 19, 2026
6061c0e
Stage verified crashlog source 01
SleepyKevy Aug 19, 2026
2df3baa
Stage verified crashlog source 02
SleepyKevy Aug 19, 2026
d6d642e
Stage verified crashlog source 03
SleepyKevy Aug 19, 2026
acbe8de
Stage verified crashlog source 04
SleepyKevy Aug 19, 2026
a8c8159
Stage verified crashlog source 05-07
SleepyKevy Aug 19, 2026
c2cdaec
Stage verified crashlog source 08-16
SleepyKevy Aug 19, 2026
5ce335c
Stage verified crashlog source 17-25
SleepyKevy Aug 19, 2026
f79a3a1
Stage verified crashlog source 26-34
SleepyKevy Aug 19, 2026
d9d7306
Stage exact source chunk 01
SleepyKevy Aug 19, 2026
fedc97a
Stage exact source chunk 02
SleepyKevy Aug 19, 2026
6e6809a
Stage exact source chunk 03
SleepyKevy Aug 19, 2026
65d9e26
Trigger isolated crashlog verification build
SleepyKevy Aug 19, 2026
5201a5c
Upload exact source with isolated crashlog build
SleepyKevy Aug 19, 2026
606d818
Fix temporary PR build trigger
SleepyKevy Aug 19, 2026
9ded85b
Temporarily pause isolated crashlog build trigger
SleepyKevy Aug 19, 2026
4b29cf9
Stage verified crash source v2 chunk 00
SleepyKevy Aug 19, 2026
d5c309b
Stage verified crash source v2 chunk 01
SleepyKevy Aug 19, 2026
2422462
Stage verified crash source v2 chunk 02
SleepyKevy Aug 19, 2026
249cda7
Stage verified crash source v2 chunk 03
SleepyKevy Aug 19, 2026
fc8caab
Stage verified crash source v2 chunk 04
SleepyKevy Aug 19, 2026
f9201ff
Stage verified crash source v2 chunk 05
SleepyKevy Aug 19, 2026
c08c957
Stage verified crash source v2 chunk 06
SleepyKevy Aug 19, 2026
ee5189f
Stage verified crash source v2 chunk 07
SleepyKevy Aug 19, 2026
9bb5c18
Stage verified crash source v2 chunk 08
SleepyKevy Aug 19, 2026
7e5e26d
Stage verified crash source v2 chunk 09
SleepyKevy Aug 19, 2026
87ea3ac
Stage verified crash source v2 chunk 10
SleepyKevy Aug 19, 2026
58e00ce
Stage verified crash source v2 chunk 11
SleepyKevy Aug 19, 2026
b0a99e3
Run hash-gated UI Test crashlog Windows build
SleepyKevy Aug 19, 2026
512083a
Trigger final verified crashlog build
SleepyKevy Aug 19, 2026
a545137
Prepare final draft-PR crashlog build
SleepyKevy Aug 19, 2026
cb5c452
Finalize draft-PR build trigger
SleepyKevy Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions .github/workflows/temp-ui-crashlog-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: Temp SleepySource UI Test CrashLog Build

on:
push:
branches:
- temp-ui-test-crashlog-build
pull_request:
branches:
- main

permissions:
contents: read
statuses: write

jobs:
build:
runs-on: windows-latest
steps:
- name: Checkout temporary build branch
uses: actions/checkout@v4

- name: Use .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x

- name: Reconstruct exact UI Test source
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
New-Item -ItemType Directory -Path exact-src -Force | Out-Null
$parts = Get-ChildItem '.tmp-ui-crash-build\v2.*' | Sort-Object Name
if ($parts.Count -ne 12) { throw "Expected 12 source payload parts, found $($parts.Count)." }
$b64 = ($parts | ForEach-Object { [IO.File]::ReadAllText($_.FullName).Trim() }) -join ''
[IO.File]::WriteAllBytes('exact-src\CSharpHost.tar.xz', [Convert]::FromBase64String($b64))
$hash = (Get-FileHash 'exact-src\CSharpHost.tar.xz' -Algorithm SHA256).Hash.ToLowerInvariant()
if ($hash -ne '11ff1c6f35f35fafba6ca5c8319e71529d30a322d394dfc51e1f393b28d16b35') { throw "Source payload SHA-256 mismatch: $hash" }
tar -xf 'exact-src\CSharpHost.tar.xz' -C exact-src
if (-not (Test-Path 'exact-src\CSharpHost\SleepySource.csproj')) { throw 'Exact C# source did not extract correctly.' }
Copy-Item 'CSharpHost\assets' 'exact-src\CSharpHost\assets' -Recurse -Force
Copy-Item 'CSharpHost\web' 'exact-src\CSharpHost\web' -Recurse -Force
if (-not (Test-Path 'exact-src\CSharpHost\CrashLogService.cs')) { throw 'CrashLogService.cs is missing from exact source.' }
Write-Host "Verified exact source payload SHA-256: $hash"

- name: Upload reconstructed source
uses: actions/upload-artifact@v4
with:
name: SleepySource-UI-Test-CrashLog-Source
path: exact-src/CSharpHost/
if-no-files-found: error

- name: Publish Windows x64
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
dotnet restore 'exact-src\CSharpHost\SleepySource.csproj' -r win-x64
dotnet publish 'exact-src\CSharpHost\SleepySource.csproj' -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true --no-restore -o smoke-dist
Get-ChildItem smoke-dist -Recurse -Filter *.xml -File -ErrorAction SilentlyContinue | Remove-Item -Force
if (-not (Test-Path 'smoke-dist\SleepySource.exe')) { throw 'SleepySource.exe was not produced.' }
if (Test-Path 'smoke-dist\SleepySourceHost.exe') { throw 'SleepySourceHost.exe is forbidden.' }
if (Test-Path 'smoke-dist\SleepySource.Engine.exe') { throw 'SleepySource.Engine.exe is forbidden.' }

- name: Run compiled crashlog smoke test
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$proc = Start-Process -FilePath (Resolve-Path 'smoke-dist\SleepySource.exe') -ArgumentList '--smoke-test' -PassThru -Wait -WindowStyle Hidden
if ($proc.ExitCode -ne 0) { throw "Compiled smoke test failed with exit code $($proc.ExitCode)." }
if (-not (Select-String -Path 'exact-src\CSharpHost\BackendHost.cs' -SimpleMatch '/api/system/crashes')) { throw 'Crash status API source marker missing.' }
if (-not (Select-String -Path 'exact-src\CSharpHost\DiagnosticService.cs' -SimpleMatch 'crashes/')) { throw 'Diagnostic crash-log export source marker missing.' }
if (Test-Path 'smoke-dist\SleepySource_Data') { Remove-Item 'smoke-dist\SleepySource_Data' -Recurse -Force }
if (Test-Path 'smoke-dist\Logs') { Remove-Item 'smoke-dist\Logs' -Recurse -Force }
Get-ChildItem smoke-dist -Filter 'SleepySource_Crash_*.log' -File -ErrorAction SilentlyContinue | Remove-Item -Force
if (Get-ChildItem smoke-dist -Recurse -Filter *.xml -File -ErrorAction SilentlyContinue) { throw 'XML documentation files remain in build output.' }
Write-Host 'SleepySource crash-log build and compiled smoke test passed.'

- name: Upload smoke-tested Windows build
uses: actions/upload-artifact@v4
with:
name: SleepySource-UI-Test-CrashLog-Build
path: smoke-dist/
if-no-files-found: error

- name: Publish temporary build status
if: always()
shell: pwsh
env:
GH_TOKEN: ${{ github.token }}
RESULT: ${{ job.status }}
REPO: ${{ github.repository }}
SHA: ${{ github.sha }}
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
run: |
$ErrorActionPreference = 'Stop'
if ($env:RESULT -eq 'success') { $state='success'; $description='UI Test crashlog Windows build passed.' }
else { $state='failure'; $description='UI Test crashlog Windows build failed.' }
$body = @{ state=$state; context='sleepysource/ui-test-crashlog-build'; description=$description; target_url=$env:RUN_URL } | ConvertTo-Json
$headers = @{ Authorization="Bearer $env:GH_TOKEN"; Accept='application/vnd.github+json'; 'X-GitHub-Api-Version'='2022-11-28' }
Invoke-RestMethod -Method Post -Uri "https://api.github.com/repos/$env:REPO/statuses/$env:SHA" -Headers $headers -ContentType 'application/json' -Body $body | Out-Null
1 change: 1 addition & 0 deletions .tmp-ui-crash-build/buildsource.02

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions .tmp-ui-crash-build/exact.01
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
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
1 change: 1 addition & 0 deletions .tmp-ui-crash-build/exact.02
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
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
Loading
Loading