Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 12 additions & 0 deletions build/ci/stage-build-linux-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,18 @@ jobs:
"$(build.sourcesdirectory)/src/Uno.Wasm.Sample.RayTracer/bin/Release/net10.0/publish/wwwroot"
displayName: Validate dotnet.js fingerprint (RayTracer)

## Validate dotnet.js fingerprint with explicit -o flag (different publish code path)
- bash: |
cd $(build.sourcesdirectory)/src/Uno.Wasm.Sample.RayTracer
dotnet clean -c Release
dotnet publish -c Release /m:1 -o $(Agent.TempDirectory)/publish-with-output-flag
displayName: Build RayTracer with -o flag

- bash: |
$(build.sourcesdirectory)/build/scripts/validate-dotnetjs-fingerprint.sh \
"$(Agent.TempDirectory)/publish-with-output-flag/wwwroot"
displayName: Validate dotnet.js fingerprint (with -o flag)

## Raytracer validation
- bash: |
$(build.sourcesdirectory)/build/scripts/run-tests.sh \
Expand Down
12 changes: 12 additions & 0 deletions build/ci/stage-build-macos-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,18 @@ jobs:
"$(build.sourcesdirectory)/src/Uno.Wasm.StaticLinking.Interpreter/bin/Release/net10.0/publish/wwwroot"
displayName: Validate dotnet.js fingerprint (StaticLinking.Interpreter)

## Validate dotnet.js fingerprint with explicit -o flag (different publish code path)
- bash: |
cd $(build.sourcesdirectory)/src/Uno.Wasm.StaticLinking.Interpreter
dotnet clean -c Release /p:DISABLE_CLIHOST_NET6=true
dotnet publish -c Release /m:1 /p:DISABLE_CLIHOST_NET6=true /p:WasmShellEmccLinkOptimization=false /p:WasmShellILLinkerEnabled=false -o $(Agent.TempDirectory)/publish-with-output-flag
displayName: Build StaticLinking.Interpreter with -o flag

- bash: |
$(build.sourcesdirectory)/build/scripts/validate-dotnetjs-fingerprint.sh \
"$(Agent.TempDirectory)/publish-with-output-flag/wwwroot"
displayName: Validate dotnet.js fingerprint (with -o flag)

- bash: |
$(build.sourcesdirectory)/build/scripts/run-tests.sh \
"$(build.sourcesdirectory)/src/Uno.Wasm.StaticLinking.Interpreter/bin/Release/net10.0/publish/wwwroot" \
Expand Down
12 changes: 12 additions & 0 deletions build/ci/stage-build-windows-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,18 @@ jobs:
-PublishPath "$(build.sourcesdirectory)\src\Uno.Wasm.Sample.RayTracer\bin\Release\net10.0\publish\wwwroot"
displayName: Validate dotnet.js fingerprint (RayTracer)

## Validate dotnet.js fingerprint with explicit -o flag (different publish code path)
- pwsh: |
cd $(build.sourcesdirectory)/src/Uno.Wasm.Sample.RayTracer
dotnet clean -c Release
dotnet publish -c Release /m:1 -o $(Agent.TempDirectory)\publish-with-output-flag
displayName: Build RayTracer with -o flag

- pwsh: |
$(build.sourcesdirectory)\build\scripts\validate-dotnetjs-fingerprint.ps1 `
-PublishPath "$(Agent.TempDirectory)\publish-with-output-flag\wwwroot"
displayName: Validate dotnet.js fingerprint (with -o flag)

- pwsh: |
$(build.sourcesdirectory)\build\scripts\run-tests-windows.ps1 `
"$(build.sourcesdirectory)\src\Uno.Wasm.Sample.RayTracer\bin\Release\net10.0\publish\wwwroot" `
Expand Down
63 changes: 63 additions & 0 deletions src/Uno.Wasm.Bootstrap/build/Uno.Wasm.Bootstrap.targets
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,69 @@
Condition="'$(_UnoDotnetJsFingerprintPublish)' != '' AND Exists('$(_UnoConfigJsPath)')" />
</Target>

<!--
Final safety net: Update uno-config.js directly in the publish output directory.
This runs AFTER files have been copied to ensure the fingerprint is always correct,
regardless of MSBuild target ordering or caching behavior.
-->
<Target Name="_UnoUpdateDotnetJsFingerprintPublishOutput"
AfterTargets="Publish"
Condition="'$(WasmFingerprintDotnetJs)' == 'true'">

<!-- Find the actual dotnet.js file in the publish _framework directory -->
<ItemGroup>
<_UnoPublishedDotnetJs Include="$(PublishDir)wwwroot/_framework/dotnet.*.js"
Exclude="$(PublishDir)wwwroot/_framework/dotnet.native.*.js;$(PublishDir)wwwroot/_framework/dotnet.runtime.*.js" />
</ItemGroup>

<!-- Extract fingerprint from actual filename -->
<PropertyGroup>
<_UnoActualDotnetJsFingerprint>$([System.Text.RegularExpressions.Regex]::Match('%(_UnoPublishedDotnetJs.Filename)', '^dotnet\.([a-z0-9]+)$').Groups[1].Value)</_UnoActualDotnetJsFingerprint>
<_UnoPublishConfigJsPath>$(PublishDir)wwwroot/$(WasmShellOutputPackagePath)/uno-config.js</_UnoPublishConfigJsPath>
</PropertyGroup>

<!-- Update uno-config.js in the publish output with the actual fingerprint -->
<WriteLinesToFile
File="$(_UnoPublishConfigJsPath)"
Lines="$([System.Text.RegularExpressions.Regex]::Replace($([System.Text.RegularExpressions.Regex]::Replace($([System.IO.File]::ReadAllText('$(_UnoPublishConfigJsPath)')), 'config\.dotnet_js_filename = &quot;dotnet(\.[^&quot;]+)?\.js&quot;', 'config.dotnet_js_filename = &quot;dotnet.$(_UnoActualDotnetJsFingerprint).js&quot;')), '_framework/dotnet(\.[^&quot;]+)?\.js', '_framework/dotnet.$(_UnoActualDotnetJsFingerprint).js'))"
Overwrite="true"
Condition="'$(_UnoActualDotnetJsFingerprint)' != '' AND Exists('$(_UnoPublishConfigJsPath)')" />

<Message Importance="normal"
Text="Updated uno-config.js with dotnet.js fingerprint: $(_UnoActualDotnetJsFingerprint)"
Condition="'$(_UnoActualDotnetJsFingerprint)' != ''" />
</Target>

<!--
Validate that uno-config.js fingerprint matches the actual dotnet.js file.
-->
<Target Name="_UnoValidateDotnetJsFingerprintPublish"
AfterTargets="_UnoUpdateDotnetJsFingerprintPublishOutput"
Condition="'$(WasmFingerprintDotnetJs)' == 'true' AND '$(UnoSkipDotnetJsFingerprintValidation)' != 'true'">

<PropertyGroup>
<_UnoPublishConfigJsPath>$(PublishDir)wwwroot/$(WasmShellOutputPackagePath)/uno-config.js</_UnoPublishConfigJsPath>
<_UnoFrameworkPath>$(PublishDir)wwwroot/_framework</_UnoFrameworkPath>
</PropertyGroup>

<PropertyGroup Condition="Exists('$(_UnoPublishConfigJsPath)')">
<_UnoConfigContent>$([System.IO.File]::ReadAllText('$(_UnoPublishConfigJsPath)'))</_UnoConfigContent>
<_UnoConfigFingerprint>$([System.Text.RegularExpressions.Regex]::Match('$(_UnoConfigContent)', 'dotnet\.([a-z0-9]+)\.js').Groups[1].Value)</_UnoConfigFingerprint>
</PropertyGroup>

<Error Condition="'$(_UnoConfigFingerprint)' == ''"
Code="UNOWASM001"
Text="uno-config.js does not contain a fingerprinted dotnet.js reference." />

<Error Condition="'$(_UnoConfigFingerprint)' != '' AND !Exists('$(_UnoFrameworkPath)/dotnet.$(_UnoConfigFingerprint).js')"
Code="UNOWASM002"
Text="Fingerprint mismatch: uno-config.js references dotnet.$(_UnoConfigFingerprint).js but file does not exist in $(_UnoFrameworkPath)." />

<Message Importance="normal"
Text="Validated: uno-config.js fingerprint ($(_UnoConfigFingerprint)) matches actual dotnet.js file"
Condition="'$(_UnoConfigFingerprint)' != ''" />
</Target>

<PropertyGroup>
<UnoEnableEmccProfiling_BeforeTargets>
$(UnoEnableEmccProfiling_BeforeTargets);
Expand Down
Loading