| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
8140702b5f |
chore(alpine): drop the deprecated Alpine 3.22 slot
Alpine 3.22 is deprecated and is no longer a published slot.
It was never routed: `local.rpkgs_slots` in `cdn.tf` lists eight distros and
alpine322 is not among them, so `UNION_SLOTS` never gated per-minor rewriting
for it and every request fell through to the flat index.
The fleet-wide routing verification made that concrete.
Across all 16 published slots, both architectures, three R minors and both
contractual URL forms, 1056 of 1056 install-and-load checks passed.
Every failure in the run was alpine322, identical on amd64 and arm64, and
identical across `arch`, `generic` and `flat`.
That last part is the signature of an unrouted slot: on a routed slot the
contractual forms diverge from `flat`, because the divergence is the routing.
Its flat objects are R 4.5 builds, so R 4.4 and R 4.6 clients got
`LOAD_FAILED` while R 4.5 clients were fine.
This change will:
- Remove the alpine-322 matrix rows and dropdown options from every pipeline
that carried them, so `=all` no longer fans out to a slot nobody can reach.
- Remove `3.22` from the `OS_VERSION` dropdowns in `build-all-versions.yaml`
and `repair-built-stamp.yaml`, and move the latter's default to `3.23`.
- Update the stale `3.22` examples in `local/packages-to-build.R`.
The six alpine-322 cron jobs are deleted from the Crow server as well, since a
cron whose matrix row is gone would keep firing against nothing:
5 process-cran-updates-alpine-322-amd64 0 5/8 * * *
6 process-cran-updates-alpine-322-arm64 30 5/8 * * *
68 weekly-audit-missing-alpine-322-amd64 20 0 * * 0
69 weekly-audit-missing-alpine-322-arm64 30 0 * * 0
82 weekly-rebuild-missing-alpine-322-amd64 0 4 * * 0
83 weekly-rebuild-missing-alpine-322-arm64 10 4 * * 0
The published objects and indexes under `amd64/alpine322` and `arm64/alpine322`
are left in place; removing them from the bucket is a separate decision.
|
|||
| af4cc6f414 |
feat(ci): verify what clients actually receive from every published slot (#209)
Some checks failed
ci/crow/manual/verify-repo-routing/15 Pipeline was successful
ci/crow/manual/verify-repo-routing/3 Pipeline failed
ci/crow/manual/prune-stale-flat-binaries/15 Pipeline was successful
ci/crow/manual/reindex/7 Pipeline was successful
ci/crow/cron/process-updates/1 Pipeline failed
ci/crow/cron/process-updates/7 Pipeline was successful
ci/crow/manual/verify-repo-routing/16 Pipeline was successful
ci/crow/cron/process-updates/9 Pipeline was successful
ci/crow/manual/repair-unsafe-flat-objects/7 Pipeline was successful
ci/crow/cron/process-updates/8 Pipeline was successful
ci/crow/cron/process-updates/2 Pipeline was successful
## Why Everything built so far reasons about the *binaries*: `abi_flat_safety` records what an object's symbols say it can load under, and the index writer drops records on that verdict. None of it proves what a **client** actually receives, which is the product of the CDN rewrite, the per-minor indexes and the `Path:` field acting together. The reprex that found the `base64enc` failure ran on a workstation, could only reach amd64, and did not survive the session. This makes it a pipeline. ## What it does For every slot, under every R minor the image carries, it installs a fixed package set through each URL form the website documents and checks that each one loads in a fresh subprocess. | form | repository | user agent | | --- | --- | --- | | `arch` | `https://cran.rpkgs.com/<arch>/<codename>/latest` | R's own | | `generic` | `https://cran.rpkgs.com/` | the string the website's snippet builds | | `flat` | the arch URL | `curl/8.5.0`, so the edge cannot read an R minor | `arch` and `generic` are contractual, so a failure there fails the run. `flat` measures what a client hiding its R minor is exposed to: it is reported and never fatal, because pruning the flat slot is a separate decision. Two details that matter: - **CRAN is deliberately absent from `repos`.** A package missing from our index must fail loudly rather than be quietly compiled from source, which would hide exactly the gap this exists to find. - **One process per form.** `available.packages()` caches its index in `tempdir()` keyed by repository URL, and `arch` and `flat` share a URL. In a single process the second form would read the first form's index and prove nothing. ## Verification Run against the live repository in `build-env-ubuntu:noble` under R 4.6.0, mid-repair: ``` amd64/noble R 4.6 via arch: 11 of 11 packages usable amd64/noble R 4.6 via generic: 11 of 11 packages usable amd64/noble R 4.6 via flat: 8 of 11 packages usable ``` The three `flat` failures are `Rcpp`, `data.table` and `yaml`, each `Built: R 4.4.3` and each failing `dyn.load()` under 4.6. That is the unrouted-client exposure, measured rather than estimated. The rows also show the routed forms serving a mix of per-minor and flat objects (`Rcpp` at `R 4.6.0`, `stringi` at `R 4.4.3`), which is the intended behaviour: only objects that cannot load cross-minor get a per-minor copy. Reviewed-on: #209 |
| Author | SHA1 | Date | |
|---|---|---|---|
|
8140702b5f |
|||
| af4cc6f414 |