-
Notifications
You must be signed in to change notification settings - Fork 2
Q2 2026 — System.Text.Json migration + quarterly work #12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
1c67e6d
675e0c6
ee209b1
d66072a
4255788
016f8f1
f38b1b8
048ca17
e959907
68ab186
4f01334
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,9 +2,9 @@ name: Build (Windows) | |
|
|
||
| on: | ||
| push: | ||
| branches: [ "master", "main" ] | ||
| branches: [ "master", "main", "sow/**" ] | ||
| pull_request: | ||
| branches: [ "master", "main" ] | ||
| branches: [ "master", "main", "sow/**" ] | ||
| workflow_dispatch: | ||
|
|
||
| jobs: | ||
|
|
@@ -35,6 +35,36 @@ jobs: | |
|
|
||
| - name: Setup MSBuild | ||
| uses: microsoft/setup-msbuild@v2 | ||
| - name: Compute SAMVersion | ||
| id: ver | ||
| shell: pwsh | ||
| run: | | ||
| $ErrorActionPreference = 'Stop' | ||
| # Prefer head_ref when its a sow branch (release-promotion PRs from sow/* to main), | ||
| # else use base_ref on PR events / ref_name on push events. | ||
| $headRef = '${{ github.head_ref }}' | ||
| $baseRef = '${{ github.base_ref }}' | ||
| $refName = '${{ github.ref_name }}' | ||
| if ($headRef -match '^sow/\d{4}-Q\d$') { | ||
| $ref = $headRef | ||
| } elseif ('${{ github.event_name }}' -eq 'pull_request') { | ||
| $ref = $baseRef | ||
| } else { | ||
| $ref = $refName | ||
| } | ||
| # .NET AssemblyVersion components are UInt16 (max 65535). Cap to 60000 for headroom. | ||
| $run = ${{ github.run_number }} % 60000 | ||
| if ($ref -match 'sow/(\d{4})-Q(\d)') { | ||
| $v = "$($Matches[1]).$($Matches[2]).$run.0" | ||
| $src = "branch '$ref'" | ||
| } else { | ||
| $now = (Get-Date).ToUniversalTime() | ||
| $quarter = [int][Math]::Ceiling($now.Month / 3.0) | ||
| $v = "$($now.Year).$quarter.$run.0" | ||
| $src = "date $($now.ToString('yyyy-MM-dd')) (ref '$ref' not sow/yyyy-Qx)" | ||
| } | ||
| Write-Host "SAMVersion = $v (from $src)" | ||
| "samversion=$v" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 | ||
|
|
||
| - name: Clone dependency repos (siblings) | ||
| shell: pwsh | ||
|
|
@@ -55,10 +85,32 @@ jobs: | |
| $deps = $buildOrder[0..($buildOrder.Count-2)] | ||
| foreach ($r in $deps) { | ||
| if (Test-Path $r) { continue } | ||
| Write-Host "Cloning https://github.com/$org/$r.git" | ||
| git clone --depth 1 "https://github.com/$org/$r.git" $r | ||
| $headRef = '${{ github.head_ref }}' | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Embedding Useful? React with 👍 / 👎. |
||
| $baseRef = '${{ github.base_ref }}' | ||
| $refName = '${{ github.ref_name }}' | ||
| $candidates = @() | ||
| if ($headRef) { $candidates += $headRef } | ||
| # Current sow branch: base_ref on PR events, ref_name on push events. | ||
| $sowRef = if ($baseRef -match '^sow/') { $baseRef } elseif ($refName -match '^sow/') { $refName } else { '' } | ||
| if ($sowRef -and $sowRef -ne $headRef) { $candidates += $sowRef } | ||
| $candidates += 'sow/2026-Q2' | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
In Useful? React with 👍 / 👎. |
||
| $cloned = $false | ||
| foreach ($cand in $candidates) { | ||
| $has = (git ls-remote --heads "https://github.com/$org/$r.git" $cand 2>$null | Out-String).Trim() | ||
| if ($has) { | ||
| Write-Host "Cloning $org/$r @ $cand" | ||
| git clone --depth 1 --branch $cand "https://github.com/$org/$r.git" $r | ||
|
Comment on lines
+99
to
+102
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
In Useful? React with 👍 / 👎. |
||
| $cloned = $true | ||
| break | ||
| } | ||
| } | ||
| if (-not $cloned) { | ||
| Write-Host "Cloning $org/$r @ default branch" | ||
| git clone --depth 1 "https://github.com/$org/$r.git" $r | ||
| } | ||
| } | ||
|
|
||
|
|
||
| # Ensure ReferencePath exists even before SAM_Windows builds | ||
| New-Item -ItemType Directory -Force -Path "SAM_Windows\build" | Out-Null | ||
|
|
||
|
|
@@ -77,6 +129,7 @@ jobs: | |
| '/v:m' | ||
| '/p:Configuration=Release' | ||
| '/p:UseSharedCompilation=false' | ||
| '/p:SAMVersion=${{ steps.ver.outputs.samversion }}' | ||
| '/p:RunPostBuildEvent=OnOutputUpdated' | ||
| "/p:ReferencePath=$windowsRef" | ||
| ) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| <Project> | ||
|
|
||
| <PropertyGroup> | ||
| <!-- Local dev builds default to 1.0.0.0. CI passes /p:SAMVersion=YYYY.Q.<run_number>.0. --> | ||
| <SAMVersion Condition="'$(SAMVersion)' == ''">1.0.0.0</SAMVersion> | ||
| <AssemblyVersion>$(SAMVersion)</AssemblyVersion> | ||
| <FileVersion>$(SAMVersion)</FileVersion> | ||
| <!-- | ||
| InformationalVersion: the content-identity stamp (SemVer +build metadata). | ||
| Composed from SAMVersion + SAMSourceRevision when CI sets the latter. If CI already | ||
| set InformationalVersion directly (e.g. SAM_Deploy installer.yml does this), respect | ||
| that and don't overwrite. Local dev builds leave both empty -> no SHA attribute emitted. | ||
| --> | ||
| <InformationalVersion Condition="'$(InformationalVersion)' == '' AND '$(SAMSourceRevision)' != ''">$(SAMVersion)+$(SAMSourceRevision)</InformationalVersion> | ||
| <!-- | ||
| Suppress the SDK's SourceLink auto-append behaviour. By default, when SourceLink is | ||
| configured on a project (via NuGet or repo settings), the SDK appends the project's | ||
| OWN commit SHA to InformationalVersion (e.g. '2026.2.164.0+998af06.dd02a4c2...'). | ||
| We set InformationalVersion explicitly to SAM_Deploy's SHA (which encodes all 22 | ||
| submodule pointers), so the SDK's extra append is noise. False = keep our value clean. | ||
| --> | ||
| <IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion> | ||
| <Deterministic>true</Deterministic> | ||
| </PropertyGroup> | ||
|
|
||
| <!-- | ||
| Projects where SDK assembly-attribute generation is disabled (legacy AssemblyInfo.cs | ||
| with GenerateAssemblyInfo=false) OR projects where the SDK doesn't auto-generate | ||
| attributes at all (classic-style csprojs that don't set the property — '' evaluates | ||
| as not 'true') ignore the AssemblyVersion/FileVersion MSBuild properties above. | ||
| Inject the attributes via a generated source file so those assemblies also get | ||
| stamped by CI. | ||
| --> | ||
| <Target Name="_GenerateSAMVersionFile" | ||
| BeforeTargets="CoreCompile" | ||
| Condition="'$(GenerateAssemblyInfo)' != 'true'"> | ||
| <ItemGroup> | ||
| <_SAMVersionLine Include="// <auto-generated />" /> | ||
| <_SAMVersionLine Include="[assembly: System.Reflection.AssemblyVersionAttribute("$(SAMVersion)")]" /> | ||
| <_SAMVersionLine Include="[assembly: System.Reflection.AssemblyFileVersionAttribute("$(SAMVersion)")]" /> | ||
| <!-- Only emit InformationalVersion attribute when CI provided a value (SDK projects | ||
| would otherwise get it via PropertyGroup -> SDK auto-gen). --> | ||
| <_SAMVersionLine Include="[assembly: System.Reflection.AssemblyInformationalVersionAttribute("$(InformationalVersion)")]" Condition="'$(InformationalVersion)' != ''" /> | ||
| </ItemGroup> | ||
| <MakeDir Directories="$(IntermediateOutputPath)" /> | ||
| <WriteLinesToFile | ||
| File="$(IntermediateOutputPath)SAMVersion.g.cs" | ||
| Lines="@(_SAMVersionLine)" | ||
| Overwrite="true" | ||
| WriteOnlyWhenDifferent="true" /> | ||
| <ItemGroup> | ||
| <Compile Include="$(IntermediateOutputPath)SAMVersion.g.cs" KeepDuplicates="false" /> | ||
| <FileWrites Include="$(IntermediateOutputPath)SAMVersion.g.cs" /> | ||
| </ItemGroup> | ||
| </Target> | ||
|
|
||
| </Project> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The new
Compute SAMVersionPowerShell block embeds${{ github.head_ref }}directly inside a single-quoted string, so a PR branch name containing'can terminate the quote and inject arbitrary PowerShell statements. Because this job runs onpull_request, an attacker-controlled fork branch name can execute commands before restore/build and tamper with outputs or CI behavior. Passgithub.head_refviaenv(or escape single quotes) so it is treated as data instead of script.Useful? React with 👍 / 👎.