Skip to content

Fix libraries-interpreter Linux failures: Configuration case mismatch#126377

Open
steveisok wants to merge 1 commit intomainfrom
fix/libraries-interpreter-config-casing
Open

Fix libraries-interpreter Linux failures: Configuration case mismatch#126377
steveisok wants to merge 1 commit intomainfrom
fix/libraries-interpreter-config-casing

Conversation

@steveisok
Copy link
Copy Markdown
Member

Summary

The runtime-libraries-interpreter pipeline has been 100% red across all 13 retained builds (Mar 2–30). The Linux leg fails with:

dotnet: No such file or directory

Root Cause

buildConfig: release (lowercase) flows through to SendToHelix as /p:Configuration=release, but the build step produces artifacts under PascalCase Release. On Linux's case-sensitive filesystem:

Step NetCoreAppCurrentTestHostPath
Build (-c Release) testhost/net11.0-linux-**R**elease-x64/
SendToHelix (/p:Configuration=release) testhost/net11.0-linux-**r**elease-x64/

SendToHelix zips an empty directory → Helix work items can't find dotnet.

Windows/macOS are case-insensitive so they find the binary (but then timeout under InterpMode=3 — separate issue).

Fix

Change buildConfig: releasebuildConfig: Release to match the convention used by other working pipelines (libraries-jitstress, libraries-gcstress-extra, runtime-nativeaot-outerloop).

Confirmed via binlog analysis

Downloaded Build.binlog and SendToHelix.binlog from build 1358001. The NetCoreAppCurrentTestHostPath property differs in casing between the two binlogs.

Note

Other pipelines (gc-longrunning, r2r, superpmi-diffs) also use lowercase buildConfig and may have the same latent bug on Linux legs.

The buildConfig parameter was set to 'release' (lowercase) which flows
through to SendToHelix as /p:Configuration=release. However, the build
step produces artifacts under the PascalCase 'Release' path. On Linux's
case-sensitive filesystem, SendToHelix zips an empty directory because
net11.0-linux-release-x64/ != net11.0-linux-Release-x64/, causing all
Helix work items to fail with 'dotnet: No such file or directory'.

Change buildConfig to 'Release' (PascalCase) to match the convention
used by other working pipelines (libraries-jitstress, libraries-gcstress-extra,
runtime-nativeaot-outerloop).

This pipeline has been 100% red across all 13 retained builds (Mar 2-30).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/area-infrastructure-libraries
See info in area-owners.md if you want to be subscribed.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Updates the CoreCLR libraries-interpreter pipeline configuration casing so the build artifacts and the SendToHelix step agree on Configuration on Linux (case-sensitive paths), preventing empty testhost zips and subsequent “dotnet: No such file or directory” failures.

Changes:

  • Change buildConfig from releaseRelease in the libraries-interpreter pipeline to align with produced artifact folder casing.

@steveisok steveisok requested review from a team and BrzVlad March 31, 2026 21:58
@github-actions
Copy link
Copy Markdown
Contributor

🤖 Copilot Code Review — PR #126377

Note

This review was generated by GitHub Copilot.

Holistic Assessment

Motivation: Justified. The libraries-interpreter pipeline has been 100% red on Linux due to a case-sensitive filesystem path mismatch between the build and SendToHelix steps. The buildConfig parameter flows through two paths with inconsistent casing treatment, causing Helix to look for test archives in the wrong directory.

Approach: Correct and minimal. Changing buildConfig from release to Release aligns the raw parameter value with the PascalCase convention used by all other working sibling pipelines that also call libraries/helix.yml (e.g., libraries-pgo, libraries-jitstress, libraries-gcstress-extra, hardware-intrinsics).

Summary: ✅ LGTM. The one-line fix correctly addresses the root cause of the Linux test failures.


Detailed Findings

✅ Correctness — Fix addresses the real root cause

The bug occurs because buildConfig flows through two independent paths:

  1. Build step: xplat-setup.yml normalizes buildConfigbuildConfigUpper_BuildConfig = Release (PascalCase). The build args use -c $(_BuildConfig), so artifacts are produced under artifacts/helix/tests/linux.x64.Release/.

  2. SendToHelix step: eng/pipelines/libraries/helix.yml line 26 passes the raw buildConfig parameter directly:

    /p:Configuration=${{ parameters.buildConfig }}
    

    With buildConfig: release, this becomes /p:Configuration=release, and OSPlatformConfig evaluates to linux.x64.release — a different path on Linux's case-sensitive filesystem.

Changing to buildConfig: Release makes the raw value match the normalized _BuildConfig, eliminating the mismatch.

Note: Azure DevOps eq() in template expressions is case-insensitive, so buildConfigUpper resolves correctly regardless — the issue is purely about the raw parameter value reaching helix.yml.

✅ Consistency — Matches established convention

All working sibling pipelines that use the same global-build-job.yml + libraries/helix.yml pattern already use PascalCase Release:

  • libraries-pgo.ymlbuildConfig: Release
  • libraries-jitstress-random.ymlbuildConfig: Release
  • libraries-jitstress2-jitstressregs.ymlbuildConfig: Release
  • libraries-gcstress-extra.ymlbuildConfig: Release
  • hardware-intrinsics.ymlbuildConfig: Release

💡 Cross-cutting observation — Sibling pipeline has the same latent bug

eng/pipelines/coreclr/libraries-gcstress0x3-gcstress0xc.yml uses buildConfig: release (lowercase) with the same libraries/helix.yml post-build step pattern. It likely has the same case-mismatch issue on Linux. Its schedule is currently commented out ("too many failures to be enabled"), which may be partially due to this. Out of scope for this PR, but worth a follow-up fix.

Generated by Code Review for issue #126377 ·

parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
buildConfig: Release
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for spotting this! I've read this file multiple times trying to spot anything wrong and just haven't seen this.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

I'll gladly take the credit for copilot ;-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants