fix(index): add a slot repair for a broken Built stamp and retire alpine 3.21 #150
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/repair-built-stamp-slot"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
arm64/alpine321andarm64/alpine322advertise a broken stamp:The per-minor sub-slots (
contrib/4.4,4.5,4.6) are affected too.All 18 other slots are correct.
uvr matches the stamp's platform triple plus R minor to pick binary over source, so nothing matches
NAand both slots silently serve as source-only, which is exactly the regression bincraft#85 added the stamp to prevent.install.packages()is unaffected, since it readsBuilt:from each tarball's ownDESCRIPTION.The tarballs are fine (
arm64/alpine322/.../dress.graph_0.8.3.tar.gzcarriesaarch64-unknown-linux-musl), and so is the R that built them (r-4.5.0_1_aarch64.apkshipsR_PLATFORM='aarch64-unknown-linux-musl').Only the index is wrong.
bincraft#96 stops a stamp like this being written again, but it cannot repair what is already there.
Why not just re-run the index update
upload_package_index()reuses the slot's remotePACKAGES.db, and cranlike'supdate_db()only reparses files whose md5 changed, so entries already in the database keep the stamp they were written with.Dropping
PACKAGES.dbto force a full reparse does work, and it is what bincraft#85's rollout note suggested, but for an S3 repo cranlike reads each package's metadata from the CRAN source mirror on GitHub.A 25k-entry slot is then 25k requests to raw.githubusercontent.com, with a real risk of being rate-limited part-way through and leaving the slot half-written.
Only the
Builtcolumn is wrong, so this corrects it in place instead: patch the column inPACKAGES.db, put the database back, and letupload_package_index()re-emitPACKAGES*from it.update_db()always rewrites the index files even when nothing was reparsed, so no tarball is re-read and nothing is fetched from GitHub.Change
local/repair-built-stamp.R— repairs the generic slot plus every per-minor sub-slot. Dry-run by default;--applywrites. The replacement comes frombincraft::built_stamp()under the R running the script, so it is exactly what a healthy run would have written, and bincraft#96's guard makes a broken build image fail rather than write a second bad stamp..crow/repair-built-stamp.yaml— manual pipeline, routed bytarget_archto the matching agent group and platform image, withdry_rundefaulting totrue..crow/archive-missed-packages.yaml— drop the twoalpine321matrix entries. Alpine 3.21 is EOL: the website advertises only 3.23/3.24 andprocess-updates.yamlalready dropped it, so that slot is retired rather than repaired.Verification
crow lint .crow/passes on all nine pipelines.air formatandjarl checkare clean; the script parses, and the/opt/Rminor-version derivation was checked against4.4.3 / 4.5.3 / 4.6.0 / current→4.4 4.5 4.6.The repair itself is unrun by design — it needs B2 credentials and an arm64 agent.
Rollout
local/install-bincraft.Rpicks up #96 (it resolves the latestvX.Y.Ztag, and #96 is only onmain).target_arch=arm64,OS=alpine,OS_VERSION=3.22,R_VERSION=4.5.3,dry_run=trueand check the reported counts.dry_run=false.curl -sS https://cran.devxy.io/arm64/alpine322/latest/src/contrib/PACKAGES | grep '^Built:' | sort | uniq -carm64/alpine321is deliberately left alone.