GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — fix(build): lower the Linux binary glibc floor to 2.28 by eraow · Pull Request #3553 · microsoft/apm

Conversation

@eraow

@eraow Tabata Shintaro (eraow) commented Nov 11, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Description

PyInstaller bundles the build interpreter's libpython and stdlib extension modules. The setup-python build for ubuntu-24.04 needs GLIBC_2.38, so the released Linux binaries fail to start on RHEL/Rocky/Alma Linux 8 and 9, Debian 12 and Ubuntu 22.04.

A correction to the premise in the issue: #2931 only corrected the declared floor in install.sh from 2.35 to 2.38 and did not change the release runners. The 2.38 requirement comes from building on ubuntu-24.04 with setup-python 3.12, whose bundled libpython needs GLIBC_2.38.

Changes:

  • build-release.yml: the Linux jobs build with uv-managed python-build-standalone (UV_PYTHON_PREFERENCE=only-managed), which targets glibc 2.17. A Linux-only step sets the variables, so the Windows job gets no new environment and the macOS jobs are untouched.
  • scripts/build-binary.sh: when APM_MAX_GLIBC is set, the build reads every bundled ELF file with objdump -T and fails if any of them needs a newer GLIBC_* symbol version. Release builds set it to 2.28.
  • build-release.yml: both Linux binaries (x86_64 and arm64) run apm --version, apm init and apm install microsoft/apm-sample-package in a rockylinux:8 container. The container installs git-core first because apm imports GitPython at startup.
  • ci.yml: the non-required pr-binary-smoke job builds the same way, so PRs build the binary the way releases do and run the glibc check. The approved scope does not list this file. Without the change, PR CI would keep building with setup-python and never exercise the release path. I can drop it if you prefer.
  • install.sh: REQUIRED_GLIBC is 2.28. Hosts below 2.28 still go to the existing pip fallback.
  • Docs: installation.md, the apm-usage commands.md, devcontainer/README.md and CHANGELOG state 2.28.

Issue and approved scope

Issue: Closes #3399

Human scope-approval comment: #3399 (comment)

This PR completes the issue. Against the "Done when" list:

  • The release build fails when any ELF file in the Linux x86_64 or arm64 bundle needs a GLIBC symbol version above 2.28: the build-binary.sh check, enabled for both Linux matrix entries.
  • Both Linux binaries run apm --version and apm install of a sample package in a Rocky Linux 8 container in CI: the smoke step in build-release.yml.
  • install.sh installs the prebuilt binary on glibc 2.28+ hosts and routes older hosts to the pip fallback: covered by the installer unit tests.
  • installation.md, commands.md and the installer unit tests state 2.28.
  • Windows and macOS builds are unchanged.

build-release.yml runs on push to main, tags, schedule and dispatch, so the first run after merge is the first CI evidence for arm64 and for the Rocky 8 container step. PR CI covers the x86_64 build and the glibc check.

Type of change

  • Bug fix
  • New feature
  • Documentation
  • Maintenance / refactor

Testing

  • Tested locally
  • All existing tests pass
  • Added tests for new functionality (if applicable)

Local results on Rocky Linux 8.10 (glibc 2.28, x86_64):

  • UV_PYTHON_PREFERENCE=only-managed UV_PYTHON=3.12 APM_MAX_GLIBC=2.28 uv run ./scripts/build-binary.sh on this branch passes. The check reads 6 ELF files, and the highest symbol version any of them needs is GLIBC_2.17.
  • With that binary on the same host, apm --version, apm init -y and apm install microsoft/apm-sample-package --target claude succeed, and apm_modules/microsoft/apm-sample-package/apm.yml exists.
  • The same check against the v0.35.0 release bundle fails as expected: libpython3.12.so.1.0, math, _pickle, _decimal and pyexpat need GLIBC_2.38, and five more extension modules need 2.29 to 2.34.
  • tests/unit/install: 3100 passed. The glibc cases now cover 2.17 to 2.39. With REQUIRED_GLIBC set back to 2.38, 16 of the 20 glibc cases fail.
  • Full unit suite (tests/unit tests/test_console.py): 25532 passed, 7 failed. The same 7 fail on unmodified main in my container. They depend on CODEX_HOME and proxy settings there and do not touch the files in this PR.
  • Workflow contract tests (180 passed), tests/unit/policy/test_help_consistency.py (6 passed), ruff, and actionlint 1.7.12 with no findings (shellcheck was not installed, so run: scripts were not linted).
  • Not tested locally: arm64, and the docker run step itself. I ran the same commands directly on the Rocky 8.10 host.

Notes for reviewers:

  • CI installs UPX, and my local build had none. The v0.35.0 release bundle contains no UPX-packed ELF files, so the check reads real symbol tables today. If UPX ever packs a bundled .so, objdump -T may report nothing for that file, and the Rocky 8 smoke step is the backstop.
  • While testing I found that apm --version exits with a GitPython error when git is not on PATH, although installation.md says it works without Git. This already happens on main and is out of scope here. I can open a separate issue.

Spec conformance (OpenAPM v0.1)

If this PR changes behaviour that an OpenAPM v0.1 req-XXX covers,
confirm the three-step ritual in the
development guide:

  • Spec edit: docs/src/content/docs/specs/openapm-v0.1.md updated
    (new/changed <a id="req-XXX"></a> anchor + prose + Appendix C
    row).
  • Manifest edit: docs/src/content/docs/specs/manifests/openapm-v0.1.requirements.yml
    updated.
  • Test edit: a @pytest.mark.req("req-XXX") test under
    tests/spec_conformance/ added or extended.
  • CONFORMANCE.{md,json} regenerated via
    uv run --extra dev python -m tests.spec_conformance.gen_statement
    and committed.
  • N/A -- this PR does not change OpenAPM-observable behaviour.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@eraow @claude
fix(build): lower the Linux binary glibc floor to 2.28
96b602a
PyInstaller bundles the build interpreter's libpython and stdlib
extension modules. The setup-python build for ubuntu-24.04 needs
GLIBC_2.38, so the released Linux binaries failed to start on RHEL,
Rocky and Alma Linux 8 and 9, Debian 12 and Ubuntu 22.04.

Linux release builds use uv-managed python-build-standalone, which
targets glibc 2.17. build-binary.sh fails the build when APM_MAX_GLIBC
is set and any bundled ELF file needs a newer GLIBC symbol version.
build-release.yml sets it to 2.28 and runs apm --version, apm init and
apm install of microsoft/apm-sample-package in a rockylinux:8 container
on x86_64 and arm64. The non-required PR binary smoke job builds the
same way.

install.sh routes only hosts below glibc 2.28 to the pip fallback. The
installation guide, apm-usage guide, devcontainer README, installer
tests and CHANGELOG state the new floor. Windows and macOS builds are
unchanged.

Closes microsoft#3399

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@eraow
Tabata Shintaro (eraow) force-pushed the fix/linux-glibc-2.28-compat branch from fadd92a to 96b602a Compare November 11, 2026 06:29
@eraow

Tabata Shintaro (eraow) commented Nov 11, 2026

Copy link
Copy Markdown
Author

@microsoft-github-policy-service agree company="Internet Initiative Japan Inc."

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@eraow
Tabata Shintaro (eraow) marked this pull request as ready for review November 11, 2026 06:52
@eraow
Tabata Shintaro (eraow) requested review from Daniel Meppiel (danielmeppiel) and Sergio Sisternes (sergio-sisternes-epam) as code owners November 11, 2026 06:52
Copilot AI balanced review requested due to automatic review settings November 11, 2026 06:52
Copilot started reviewing on behalf of Tabata Shintaro (eraow) November 11, 2026 06:53
View session
Copilot AI reviewed Nov 11, 2026
View reviewed changes

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

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

🟡 Changes recommended

The compatibility gate can accept an uninspectable library because the pipeline masks objdump failures with tail’s successful exit status.

2 open issues
  • Medium severity Fail compatibility check when objdump fails · New
  • Low severity Use ASCII status markers for new messages · New
What changed in this PR

This PR addresses #3399 by lowering the prebuilt Linux binary glibc requirement from 2.38 to 2.28, extending compatibility to older enterprise Linux distributions without changing Windows or macOS builds.

Changes:

  • Use uv-managed Python for Linux release and PR smoke builds.
  • Add a bundled-library glibc check and Rocky Linux 8 release smoke tests.
  • Align the installer threshold, regression tests, and documentation with glibc 2.28.
File Description
tests/​unit/​install/​test_unix_install_ownership.py Updates boundary tests and recovery-message assertions for glibc 2.28.
scripts/​build-binary.sh Adds an opt-in bundled ELF glibc compatibility check.
packages/​apm-guide/​.apm/​skills/​apm-usage/​commands.md Updates bootstrap and self-update compatibility guidance.
install.sh Lowers the prebuilt Linux glibc threshold to 2.28.
docs/​src/​content/​docs/​getting-started/​installation.md Documents the lower requirement and compatible distributions.
devcontainer/​README.md Updates the documented Linux binary requirement.
CHANGELOG.md Records the compatibility expansion and build safeguards.
.github/​workflows/​ci.yml Aligns PR binary smoke builds with the Linux release configuration.
.github/​workflows/​build-release.yml Selects managed Python on Linux and adds Rocky Linux 8 smoke tests.

Review effort: Balanced

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread scripts/build-binary.sh Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread scripts/build-binary.sh Resolved

Uh oh!

There was an error while loading. Please reload this page.

Tabata Shintaro (eraow) and others added 8 commits November 11, 2026 16:12
@eraow
fix(build): stop the glibc check when objdump cannot read a file
660473f
The pipeline dropped objdump's exit status, so a file that objdump could not read counted as checked with no GLIBC requirement. Check the exit status before parsing and stop the build with the objdump error.

Co-authored-by: Copilot Autofix powered by AI <[email protected]>
@eraow
fix(build): use ASCII status markers in the glibc check
d35ab72
Replace the check and cross glyphs in the three new messages with [x] and [+], following encoding.instructions.md.
@eraow
Merge remote-tracking branch 'origin/main' into fix/linux-glibc-2.28-…
d64bd49
…compat

# Conflicts:
#	.github/workflows/build-release.yml
#	.github/workflows/ci.yml
#	CHANGELOG.md
@danielmeppiel
Merge remote-tracking branch 'origin/main' into danielmeppiel-w2-pr-3…
d341e31
…553-glibc-compat
@danielmeppiel
ci(build): pin Rocky 8 smoke image and scope its token
f7e6b94
The Rocky Linux 8 smoke step pulled rockylinux:8 by mutable tag and
passed the long-lived GH_CLI_PAT into the container. Pin the multi-arch
image index by digest and hand the container only the job-scoped
github.token (contents: read); the sample package is public. Also group
the GITHUB_ENV writes in the two uv-managed Python steps (actionlint
SC2129).

Addresses panel follow-ups from supply-chain-security-expert (digest pin,
least-privilege token) on PR microsoft#3553.

Co-authored-by: Copilot App <[email protected]>
@danielmeppiel
docs: align glibc 2.28 changelog entry and troubleshooting heading
5f36ea8
The merge with main dropped the blank line before the Fixed heading, the
entry described release-build internals instead of the user-facing
change, and the installation troubleshooting heading still named
devcontainers and Debian-based images as failing hosts, which was only
true under the old 2.38 floor.

Addresses panel follow-ups from doc-writer on PR microsoft#3553.

Co-authored-by: Copilot App <[email protected]>
@danielmeppiel
Merge remote-tracking branch 'origin/main' into danielmeppiel-w2-pr-3…
522202e
…553-glibc-compat
@danielmeppiel
Merge remote-tracking branch 'origin/main' into danielmeppiel-w2-pr-3…
11d3ce6
…553-glibc-compat
@danielmeppiel

Daniel Meppiel (danielmeppiel) commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator

APM Review Panel: ship_now

Community PR lowers the APM Linux binary glibc floor to 2.28, unlocking RHEL 8 / Rocky 8 / Debian 10 installs. Delta pass confirms all 5 lean-pass follow-ups folded cleanly; zero open findings remain.

panel-mode=delta; personas=supply-chain-security-expert,doc-writer,apm-ceo (prior lean pass in this run: same roster)

cc Tabata Shintaro (@eraow) Sergio Sisternes (@sergio-sisternes-epam) -- a fresh advisory pass is ready for your review.

The lean pass raised five in-scope follow-ups: supply-chain hardening (pin the Rocky 8 image, reduce the token scope, actionlint compliance) and documentation accuracy (CHANGELOG spacing and wording, the troubleshooting heading). All five were folded on the contributor branch in two commits (f7e6b94, 5f36ea8). The delta pass re-ran supply-chain-security-expert and doc-writer on the fold diff at head 11d3ce6. Both returned zero findings and confirmed that every prior item is resolved.

CI evidence is strong. Every check is green: Lint, Build & Test shards, Lifecycle Smoke, the Windows gates, the Architecture ratchets, CodeQL, the devcontainer features and the PR gate workflow. PR Binary Smoke built with uv-managed cpython-3.12.16 and logged [+] 6 bundled ELF files work with glibc 2.28. The local installer tests are load-bearing: reverting REQUIRED_GLIBC to 2.38 fails 16 of them with real assertion errors.

One residual remains. build-release.yml does not run on pull requests, so the arm64 binary and the Rocky 8 container smoke step first run on the first post-merge main build. That comes from how the workflows are triggered, not from a gap in this PR.

Aligned with: Portable by manifest: lowering the floor from 2.38 to 2.28 adds RHEL/Rocky/Alma 8, Debian 10 and Ubuntu 20.04+. Secure by default: the image is pinned by multi-arch digest and the container gets only the job-scoped read token. OSS community driven: Tabata Shintaro (@eraow) filed the issue, had the scope accepted and delivered the fix with local Rocky 8.10 evidence.

Growth signal. This removes a real installation barrier on widely deployed enterprise Linux. It is worth a line in the next release note: APM's prebuilt binary now runs on RHEL/Rocky/Alma 8 and Debian 10.

Panel summary

Persona B R N Takeaway
Supply Chain Security Expert 0 0 0 Both folds verified: image pinned by multi-arch digest, PAT replaced with job-scoped read token. No new supply-chain surface introduced.
Doc Writer 0 0 0 All three prior findings resolved: CHANGELOG spacing fixed, entry trimmed to user-facing change, heading names the 2.28 floor. No new doc issues.

B = blocking-severity findings, R = recommended, N = nits.
Counts are signal strength, not gates. The maintainer ships.

Top 1 follow-ups

  1. [Supply Chain Security Expert] Watch the first post-merge build-release.yml run on main for the arm64 binary and Rocky 8 container smoke results. -- build-release.yml is not PR-triggered, so that run is the first proof point for arm64 and the container step.

Recommendation

All five lean-pass follow-ups are folded and verified by the personas that raised them, and CI is fully green. The local test evidence is mutation-confirmed. The only residual is watching the first post-merge build-release.yml run for the arm64 and Rocky 8 container results; if either regresses, the build fails before any artifact is published.

Folded in this run

  • (panel) Pin rockylinux:8 by its multi-arch image digest in the Rocky 8 smoke step. Resolved in f7e6b94.
  • (panel) Give the container the job-scoped github.token (contents: read) instead of GH_CLI_PAT; the sample package is public. Resolved in f7e6b94.
  • (panel) Group the GITHUB_ENV writes in both uv-managed Python steps (actionlint SC2129). Resolved in f7e6b94.
  • (panel) CHANGELOG: restore the blank line before ### Fixed and trim the entry to the user-facing change. Resolved in 5f36ea8.
  • (panel) installation.md: retitle the troubleshooting heading to "glibc below 2.28". No incoming links to the old anchor. Resolved in 5f36ea8.
  • Merged current origin/main twice to clear conflicts (CHANGELOG), with no force-push. Latest merge is 11d3ce6.

Copilot signals reviewed

  • scripts/build-binary.sh -- LEGIT: the pipeline masked objdump's exit status, so an uninspectable library could pass the gate (resolved by the author in 660473f).
  • scripts/build-binary.sh -- LEGIT: non-ASCII status glyphs in the new messages (resolved by the author in d35ab72).

Regression-trap evidence (mutation-break gate)

  • tests/unit/install/test_unix_install_ownership.py::test_glibc_floor_routes_to_pip_before_binary_download and ::test_glibc_recovery_guidance_reports_prebuilt_floor. I set REQUIRED_GLIBC="2.38" in install.sh, and 16 tests FAILED with assertion errors as expected. The guard is restored.

Lint contract

Silent at 11d3ce6: ruff check and ruff format --check (src/, tests/, architecture-linter scripts), pylint R0801 (10.00/10), lint-auth-signals.sh, lint-architecture-boundaries.sh and actionlint on both edited workflows.

CI

https://github.com/microsoft/apm/actions/runs/43207849227 (CI) plus the PR gate workflow, CodeQL, Devcontainer, NOTICE Drift and Deploy Docs: all green on 11d3ce6. license/cla passes. No CI fix iterations were needed.

Mergeability status

PR head SHA CEO stance iters folds defers Copilot rounds CI mergeable mergeStateStatus notes
#3553 11d3ce6 ship_now 1 5 0 2 green MERGEABLE BLOCKED pending required review

Convergence

1 outer iteration and 2 Copilot rounds (no new Copilot comments). Final panel stance: ship_now. Ready for maintainer review.

This panel is advisory. It does not block merge. Re-apply the
panel-review label after addressing feedback to re-run.


Generated by autopilot-pr-merge-worker. This comment is AI-generated and may contain errors.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

This branch has not been deployed

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

Reviewers

Copilot code review Copilot
Copilot review effort
Applies to this pull request for everyone.Learn more about Copilot code review.
Copilot left review comments
@danielmeppiel Daniel Meppiel (danielmeppiel) Awaiting requested review from danielmeppiel danielmeppiel is a code owner
@sergio-sisternes-epam Sergio Sisternes (sergio-sisternes-epam) Awaiting requested review from sergio-sisternes-epam sergio-sisternes-epam is a code owner

At least 0 approving reviews are required to merge this pull request.

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

[FEATURE] Lower the glibc floor of prebuilt Linux binaries to 2.28 (RHEL/Rocky/Alma 8+, Debian 12, Ubuntu 22.04)

Uh oh!

There was an error while loading. Please reload this page.

3 participants

@eraow @danielmeppiel
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.