feat(slots): add a retirement workflow and a drift check #214
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/retire-slot-workflow"
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?
Why
Retiring a slot means three separate things in three separate places, and nothing tied them together.
Alpine 3.22 is what that costs.
It was removed from
local.rpkgs_slotsincdn.tfat some point, so the edge stopped routing it, but it kept:Nightly builds kept producing binaries nobody could reach.
Worse, an unrouted slot is not inert: every request falls through to the flat index, so R 4.4 and R 4.6 clients got
LOAD_FAILEDatdyn.load()rather than simply nothing.It took a fleet-wide
verify_routing=allrun to notice.What changed
local/check-slots.R(just check-slots) fails when any.crow/*.yamlstill targets a slot missing fromlocal.rpkgs_slots.cdn.tfstays the source of truth; the checker reads it rather than restating the list.local/retire-slot.R(just retire-slot <codename>) does the cleanup:OS_VERSIONtag, and moves a dropdown default that pointed at the retired tagamd64/<codename>/andarm64/<codename>/from the bucketDry run by default.
It refuses any slot still listed in
cdn.tf, so it cannot be pointed at a live slot however it is invoked..crow/retire-slot.yamlruns the asset half in CI, where the B2 credentials exist.README gains a
## Retiring a slotsection with the ordering.Step 4 before step 2 is the one ordering that actively breaks things: the next nightly rebuilds everything just deleted.
Verification
Both scripts were run against the tree as it stood at
523424b, immediately before #213.The checker names exactly the twelve files that PR edited by hand:
retire-slot.R alpine322 --config-only --applyreproduces that commit's structural changes byte for byte across all 18 pipeline files, and additionally catches the twoOS_VERSIONdropdowns.The only differences from the hand-made commit are two prose lines, a usage example and a dropdown
description:, which the script deliberately leaves alone.Guards exercised: a live slot (
alpine323) is refused, an unknown codename is rejected by name, and the asset half refuses to run withoutB2_S3_ACCESS_KEYrather than treating B2's empty unauthenticated listing as an already-clean slot.crow lint .crow/reports all 19 configs valid.airandjarlare clean on both new scripts.Next
alpine321andalpine322still hold objects in the bucket (22922 and 25308 records respectively, both architectures).Once this merges they can be removed with the pipeline this PR adds.
@ -198,6 +198,42 @@ Example: <https://cran.devxy.io/arm64/rhel9/latest>Technically, no date-based snapshots are planned, so this component from the Posit PM structure is not included.## Retiring a slotremove that verbose info and pin it down to the absolute essentials
@ -0,0 +1,184 @@### Fail when a pipeline still targets a slot the edge does not route.remove execessive comments
@ -0,0 +1,267 @@### Retire a slot: strip it from the pipelines and delete its objects from S3.remove excessive comments