[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[cdac] Share one coreclr build between cDAC dump + stress test legs - #129237

Closed
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build
Closed

[cdac] Share one coreclr build between cDAC dump + stress test legs#129237
max-charlamb wants to merge 3 commits into
dotnet:mainfrom
max-charlamb:cdac-pipeline-share-build

Conversation

@max-charlamb

Copy link
Copy Markdown
Member

Note

This PR was prepared with assistance from GitHub Copilot CLI.

Summary

Refactors runtime-diagnostics.yml so the cDAC dump tests and stress tests share one coreclr+libs build per platform, and so per-platform pipelines run in parallel (no waiting on slower platforms).

Before

Stage CdacBuild (8 plats, full build each)
Stage CdacDumpTests (8 plats, full build each) <- 8 redundant builds
Stage CdacStressTests (4 plats, full build each) <- 4 redundant builds
Stage CdacXPlatDumpGen (6 plats, full build each) <- 6 redundant builds
Stage CdacXPlatDumpTests (6 plats, full build each) <- 6 redundant builds

Each test leg rebuilt coreclr from scratch.

After

Stage Cdac (single stage, jobs in parallel except for stated deps)
build_<plat>_CdacBuild x8 (publishes artifacts/bin tar)
build_<plat>_CdacDumpTest x8 job-dep CdacBuild_<plat> [single-leg, !Schedule]
build_<plat>_CdacStressTest x4 job-dep CdacBuild_<plat> [!Schedule]
build_<plat>_CdacXPlatDumpGen x6 job-dep CdacBuild_<plat> [xplat OR Schedule]
Stage CdacXPlatDumpTests dependsOn: Cdac (intrinsic xplat sync)
build_<plat>_CdacXPlatDumpTest x6
  • One full coreclr+libs build per platform.
  • Per-platform parallelism: linux_x64 dump tests start as soon as linux_x64 build is done; no waiting on osx_arm64 to finish building.
  • Pattern follows the canonical runtime.ymldependsOnGlobalBuilds mechanism (see runtime.yml:1591,1622,1653).

How the Release / Debug cDAC split works

The user requested:

  • Build coreclr in Checked (-rc checked).
  • Stress tests use the Release native cDAC shim (loaded in-process by the runtime).
  • Dump tests use the Debug managed cDAC assemblies (referenced directly by the DumpTests project).

These coexist because they live in different artifact locations:

  • CdacBuild runs -c Release -rc checked → native shim ships in the Release testhost.
  • Stress test legs keep cdacTestConfig: $(_BuildConfig) (Release) — they pick up the Release native shim from the testhost.
  • Dump test legs pass new cdacTestConfig: Debug parameter — payload-prep MSBuild walks the DumpTests project graph and rebuilds the managed cDAC assemblies at Debug in a separate output directory.

Files changed

  • eng/pipelines/runtime-diagnostics.yml — collapsed 5 stages into 2, wired job-level deps.
  • eng/pipelines/cdac/prepare-cdac-helix-steps.yml — added cdacTestConfig parameter (defaults to $(_BuildConfig) for back-compat).
  • (Existing Build / SOS stage untouched — different subset, different platforms.)

Validation

  • Local YAML syntax check passes.
  • Needs a manual pipeline trigger to validate end-to-end behavior (shared artifact download, per-platform parallelism, Debug-cDAC payload prep on the dump side).

Max Charlamband others added 3 commits June 10, 2026 10:56
Adds a per-platform CdacBuild stage that builds coreclr (Checked) +
libs + tools.cdac + the cDAC dump+stress test subsets, then publishes
artifacts/bin as a CdacBuildArtifacts_<plat> tar. Subsequent commits
will switch CdacDumpTests, CdacStressTests, and the CdacXPlat stages
to consume this artifact instead of each running their own full build.
The matrix uses cdacDumpPlatforms (the broader 8-platform set);
CdacStressTests' 4-platform subset is still satisfied since per-platform
artifacts are independent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CdacDumpTests, CdacStressTests, CdacXPlatDumpGen, and CdacXPlatDumpTests
now download the per-platform CdacBuildArtifacts_<plat> tar published by
CdacBuild instead of each running their own full clr+libs+tools.cdac+...
build. Each test leg still calls ./build.sh with a minimal subset
(tools.cdac<test>tests) so .dotnet is initialized and MSBuild can
re-link the test csproj against the downloaded artifact -- no coreclr
or libs work is repeated.
Adds a cdacTestConfig parameter to prepare-cdac-helix-steps.yml
(default $(_BuildConfig) for back-compat); dump-test stages pass
cdacTestConfig: Debug so the dotnet build invocations that build the
debuggees and prepare the Helix payload pull in the Debug-configured
managed cDAC assemblies that the DumpTests project loads directly.
The stress stage keeps the Release native cDAC shim that ships in the
shared testhost.
Cross-platform job-name expansion uses dependsOnGlobalBuilds rather
than a hand-rolled build_<plat>_<config>_CdacBuild string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…elism
Moves CdacBuild + CdacDumpTests + CdacStressTests + CdacXPlatDumpGen
into a single `Cdac` stage. Within that stage, every test job uses
job-level `dependsOnGlobalBuilds: - nameSuffix: CdacBuild` which the
global-build-job template expands to a per-platform
`build_<plat>_<config>_CdacBuild` dep. This is the canonical
dotnet/runtime pattern (runtime.yml:1591,1622,1653) and means
`linux_x64` test legs start as soon as `linux_x64`'s build finishes --
no waiting on slower platforms' builds.
Previously each test stage had a stage-level `dependsOn: CdacBuild`
which is all-or-nothing in AzDO -- every platform's tests had to wait
for the slowest platform's build to finish before starting.
The single-leg / xplat / stress / schedule selection moves from
stage-level `${{ if }}` to job-level `${{ if }}` inside the Cdac stage.
CdacXPlatDumpTests stays as a separate stage with stage-level
`dependsOn: Cdac` because its cross-platform synchronization (every
target platform's test needs every source platform's dumps) is
intrinsic. Its previous job-level `dependsOnGlobalBuilds: CdacBuild`
is dropped -- AzDO doesn't support cross-stage job-level deps, and
the stage-level dep already gates everything correctly.
Also fixes a duplicate `parameters:` block in CdacXPlatDumpTests
that was a merge artifact from the previous commit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings June 10, 2026 15:06
@github-actionsgithub-actionsBot added the area-Infrastructure-coreclr Only use for closed issues label Jun 10, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR restructures the runtime-diagnostics.yml pipeline to avoid redundant CoreCLR/Libraries builds across the cDAC dump tests, stress tests, and x-plat dump generation legs by introducing a per-platform “shared build” job that downstream per-platform jobs depend on.

Changes:

  • Collapses the prior multi-stage cDAC flow into a single Cdac stage with per-platform job-level dependencies on a shared CdacBuild job.
  • Switches downstream legs (dump tests, stress tests, x-plat dump gen/tests) to download artifacts/bin from the shared build instead of rebuilding CoreCLR+libs.
  • Extends prepare-cdac-helix-steps.yml with a cdacTestConfig parameter to allow rebuilding the managed cDAC/DumpTests payload in Debug during payload prep.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

FileDescription
eng/pipelines/runtime-diagnostics.ymlRefactors cDAC pipeline stages into a shared per-platform build plus dependent per-platform test legs; wires artifact upload/download and job-level deps.
eng/pipelines/cdac/prepare-cdac-helix-steps.ymlAdds cdacTestConfig parameter and uses it for payload-prep MSBuild invocations to support Debug-managed cDAC binaries.

Comment on lines +298 to +303
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms: ${{ parameters.cdacDumpPlatforms }}
jobParameters:
@max-charlamb

Copy link
Copy Markdown
MemberAuthor

Superseded by #129244 -- consolidated all the cDAC follow-up changes into a single PR.

max-charlamb added a commit that referenced this pull request Jun 14, 2026
…d fix (#129244)
> [!NOTE]
> This PR was prepared with assistance from GitHub Copilot CLI.
Consolidated follow-ups to #128872 covering the cDAC stages in
`runtime-diagnostics.yml` plus a small datacontract doc cleanup.
## Commits (oldest first)
1. **`efe2cdeee14`** — `[cdac] StackWalk.md: drop stress-harness detail
from datacontract`
The new "Signature-Based Scanning (currently deferred)" section reads
like stress-harness README content. Replaced with a one-sentence note +
link to `tests/StressTests/known-issues.md` (which already documents the
stub, the sentinel, and the ICallingConvention work needed to re-enable
the scan).
2. **`0e4caf52fd5`** — `[cdac] Fix DataGeneratorTests build: override
Target.ReadNInt`
#128784 added `public abstract TargetNInt ReadNInt(ulong address)` to
`Target` but didn't update the test-only `TestTarget` mock, so
`DataGeneratorTests` no longer compiles. Adds the missing override,
mirroring `ReadNUInt`.
3. **`ebc2c062fbf`** — `[cdac pipeline] Refactor runtime-diagnostics:
share one build, run unit tests, parallelize per-platform`
See the commit message for the full detail. Highlights:
- **Shared `CdacBuild`** stage so coreclr+libs is built ONCE per
platform (Checked) and consumed by Dump / Stress / XPlatDumpGen /
XPlatDumpTest legs.
- **Stress vs dump cDAC split**: stress uses the Release native cDAC
shim (in the shared testhost); dumps use Debug managed cDAC assemblies,
with libraries pinned at Release + pre-flight verification.
- **Per-platform parallelism** via job-level `dependsOnGlobalBuilds:
CdacBuild` (the canonical `runtime.yml` pattern). `CdacXPlatDumpTest`
adds an explicit per-source-platform `dependsOn` so the whole thing fits
in one stage.
- **Stress tests now run on every trigger** (previously gated to not
Schedule).
- **`CdacUnitTests`** runs the cDAC managed-side unit tests +
DataGeneratorTests on linux_x64 Debug using a minimal `-s
tools.cdactests -test` (modeled after
`eng/pipelines/coreclr/ilasm.yml:52`). Also adds the previously-unbuilt
DataGeneratorTests project to the `tools.cdactests` subset.
- **3 new reusable templates** (`sos-test-leg.yml`,
`cdac-helix-test-leg.yml`, `download-cdac-build-artifact.yml`) compress
~250 lines of repeated boilerplate.
- Top-of-file overview header summarizing every stage. `Build` ->
`SOSTests`, `Cdac` -> `CdacTests`.
- `runtime-diagnostics.yml` shrinks from 581 -> 351 lines.
## Files changed
- `docs/design/datacontracts/StackWalk.md`
- `eng/Subsets.props`
- `eng/pipelines/runtime-diagnostics.yml`
- `eng/pipelines/cdac/prepare-cdac-helix-steps.yml`
- `eng/pipelines/cdac/cdac-helix-test-leg.yml` (new)
- `eng/pipelines/cdac/download-cdac-build-artifact.yml` (new)
- `eng/pipelines/diagnostics/sos-test-leg.yml` (new)
- `src/native/managed/cdac/tests/DataGenerator/TestTarget.cs`
## Status
Draft. Local YAML parses; needs an end-to-end pipeline run on this
branch to validate per-platform parallelism + Debug cDAC payload prep +
`CdacUnitTests` minimal-subset build all work as expected.
Supersedes #129237 and #129241 (will close those).
---------
Co-authored-by: Max Charlamb <maxcharlamb@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jul 11, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-Infrastructure-coreclrOnly use for closed issues

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants

@max-charlamb