Repository navigation
Conversation
The v3.0.0 image never published: the linux/arm64 build failed outright, so 3.0.0 exists on PyPI with no matching container image. Two defects, one behind the other: - The runtime stage copied QLever's shared libraries from /lib/x86_64-linux-gnu by soname. Upstream publishes an arm64 image whose multiarch directory is /lib/aarch64-linux-gnu, so the COPY could not resolve its sources. The libraries are now resolved with ldd inside the QLever stage and staged into a fixed path, which is both architecture- and soname-independent: an upstream rebuild that bumps Boost or ICU no longer needs an edit here. Verified to stage the same nine libraries on both architectures. - That staging step then failed on both platforms, because upstream's image runs as a non-root user and /opt is not writable by it. The stage switches to root and stages into /tmp. QLever acquisition is now best-effort throughout, which is what the surrounding comments always claimed: an image without it is still fully functional and the build-time marker says why. Previously a missing COPY source failed the build before that marker could be written, and the marker could not detect a missing binary at all, since ldd on a nonexistent file does not print "not found". Also pins the QLever image by its multi-architecture index digest rather than :latest, which is a rolling build of upstream's main branch. The pinned digest is build bfd5741 -- the one this repository's QLever assertions were actually measured against. Finally, publish-python skips already-published PyPI files. PyPI reserves a version permanently once uploaded, so re-pushing a release tag to correct anything outside the Python artifact used to fail that job on the duplicate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Why
v3.0.0is on PyPI but has no container image: thelinux/arm64half of themulti-architecture build failed, so
publish-dockernever produced one. Thisreleases
3.0.1with that build fixed.PyPI reserves a version permanently once uploaded, so
3.0.0could not berebuilt and re-released under the same number.
3.0.0on PyPI is itself correctand is left untouched.
What was wrong
Two defects, one hidden behind the other.
1. Hardcoded architecture path. The runtime stage copied QLever's shared
libraries out of
/lib/x86_64-linux-gnuby soname. Upstream publishes an arm64image whose multiarch directory is
/lib/aarch64-linux-gnu, so theCOPYcouldnot resolve its sources and the build failed before doing any work.
2. Non-root staging. The first fix introduced a staging step that upstream's
image could not run: it executes as a non-root user, and
/optis not writableby it. This failed identically on both platforms.
What changed
lddinside the QLever stage and staged to afixed path, so the runtime stage copies from architecture-independent
locations. This is also soname-independent: an upstream rebuild that bumps
Boost or ICU no longer requires an edit here.
/tmp, which is writable inevery base image.
comments always claimed: an image without it is still fully functional, and the
build-time marker records why it is unavailable. Previously a missing
COPYsource failed the build before that marker could be written, and the marker
could not detect a missing binary at all —
lddon a nonexistent file does notprint
not found, so the status would have wrongly readok.:latest, which is arolling build of upstream's main branch rebuilt within a day of most commits.
The pin is the multi-architecture index digest, so it resolves on both
platforms — a per-architecture manifest digest would break the other one. The
pinned build is
bfd5741, the one this repository's QLever assertions wereactually measured against (the
qlever-indexflags and thexsd:integer→xsd:intcanonicalisation thatpreflight_position_datatypeaccommodates).
publish-pythonskips already-published files. Re-pushing a release tag tocorrect anything outside the Python artifact used to fail that job on a
duplicate upload. Tag re-pushes are now idempotent.
Verification
docker buildx build --platform linux/amd64,linux/arm64 --target qlever—passes on both architectures, staging both binaries and the same nine
libraries the original hardcoded list named.
python3 -m unittest discover -s test -p "test_*_unit.py"— 641 tests, OK.python3 scripts/release.py --check-tag v3.0.1— metadata agrees.Audited for the same class of failure elsewhere: no other hardcoded architecture
paths remain, both base images (
eclipse-temurin:11-jre,rust:1.93-slim)publish amd64 and arm64, and all six pinned pip packages ship
aarch64wheels orare pure Python — so nothing in the image needs to compile from source on arm64.
After merge
The existing
v3.0.1tag points at a commit that predates these fixes and has noversion bump behind it. It must be deleted and recreated on the merge commit:
That tag push publishes the image as
3.0.1,v3.0.1andlatest, and uploads3.0.1to PyPI. Afterwards, record the conda checksum:🤖 Generated with Claude Code