Building CRAN binaries for rpkgs.com
  • R 74.6%
  • Shell 12.3%
  • TypeScript 6.5%
  • HCL 3.9%
  • Just 1.5%
  • Other 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
pat-s d80d3e814e
Some checks failed
ci/crow/manual/retire-slot Pipeline was successful
ci/crow/cron/process-updates/14 Pipeline was successful
ci/crow/cron/process-updates/9 Pipeline was successful
ci/crow/cron/process-updates/16 Pipeline was successful
ci/crow/cron/process-updates/15 Pipeline was successful
ci/crow/cron/process-updates/4 Pipeline was successful
ci/crow/cron/process-updates/10 Pipeline was successful
ci/crow/cron/process-updates/3 Pipeline was successful
ci/crow/cron/auto-apply-patches Pipeline was successful
ci/crow/cron/weekly-audit-missing/1 Pipeline was successful
ci/crow/cron/weekly-audit-missing/2 Pipeline was successful
ci/crow/cron/weekly-audit-missing/4 Pipeline was successful
ci/crow/cron/weekly-audit-missing/5 Pipeline was successful
ci/crow/cron/weekly-audit-missing/9 Pipeline was successful
ci/crow/cron/weekly-audit-missing/10 Pipeline was successful
ci/crow/cron/weekly-audit-missing/6 Pipeline was successful
ci/crow/cron/weekly-audit-missing/7 Pipeline was successful
ci/crow/cron/weekly-audit-missing/8 Pipeline was successful
ci/crow/cron/weekly-audit-missing/3 Pipeline was successful
ci/crow/cron/weekly-audit-missing/11 Pipeline was successful
ci/crow/cron/weekly-audit-missing/12 Pipeline was successful
ci/crow/cron/weekly-audit-missing/13 Pipeline was successful
ci/crow/cron/weekly-audit-missing/14 Pipeline was successful
ci/crow/cron/trial-build-registry/3 Pipeline was successful
ci/crow/cron/trial-build-registry/5 Pipeline was successful
ci/crow/cron/trial-build-registry/2 Pipeline was successful
ci/crow/cron/trial-build-registry/14 Pipeline was successful
ci/crow/cron/trial-build-registry/16 Pipeline was successful
ci/crow/cron/trial-build-registry/12 Pipeline was successful
ci/crow/cron/trial-build-registry/15 Pipeline was successful
ci/crow/cron/trial-build-registry/7 Pipeline was successful
ci/crow/cron/trial-build-registry/9 Pipeline was successful
ci/crow/cron/trial-build-registry/4 Pipeline failed
ci/crow/cron/trial-build-registry/13 Pipeline was successful
ci/crow/cron/trial-build-registry/11 Pipeline was successful
ci/crow/cron/trial-build-registry/6 Pipeline was successful
ci/crow/cron/trial-build-registry/1 Pipeline was successful
ci/crow/cron/trial-build-registry/10 Pipeline was successful
ci/crow/cron/trial-build-registry/8 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/14 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/17 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/15 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/13 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/5 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/20 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/21 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/19 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/16 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/7 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/1 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/27 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/25 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/31 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/6 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/9 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/33 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/3 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/26 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/18 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/32 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/11 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/4 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/6 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/38 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/22 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/37 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/23 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/39 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/24 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/29 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/1 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/13 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/5 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/2 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/2 Pipeline was successful
ci/crow/cron/process-updates/5 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/8 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/28 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/30 Pipeline was successful
ci/crow/cron/process-updates/7 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/10 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/36 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/34 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/35 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/12 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/40 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/41 Pipeline was successful
ci/crow/cron/weekly-rebuild-missing/42 Pipeline was successful
ci/crow/cron/weekly-rebuild-reindex/14 Pipeline was successful
ci/crow/cron/process-updates/8 Pipeline was successful
ci/crow/cron/process-updates/1 Pipeline was successful
ci/crow/cron/process-updates/6 Pipeline was successful
ci/crow/cron/process-updates/11 Pipeline was successful
ci/crow/cron/process-updates/2 Pipeline was successful
ci/crow/cron/process-updates/12 Pipeline was successful
ci/crow/cron/process-updates/13 Pipeline was successful
feat(slots): add a retirement workflow and a drift check (#214)
## 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_slots` in `cdn.tf` at some point, so the edge stopped routing it, but it kept:

- a matrix row in **twelve** pipelines
- **six** cron jobs on the Crow server
- roughly **50000 objects** in the bucket

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_FAILED` at `dyn.load()` rather than simply nothing.
It took a fleet-wide `verify_routing=all` run to notice.

## What changed

**`local/check-slots.R`** (`just check-slots`) fails when any `.crow/*.yaml` still targets a slot missing from `local.rpkgs_slots`.
`cdn.tf` stays the source of truth; the checker reads it rather than restating the list.

**`local/retire-slot.R`** (`just retire-slot <codename>`) does the cleanup:

- strips the slot from every pipeline matrix, dropdown option and `OS_VERSION` tag, and moves a dropdown default that pointed at the retired tag
- deletes `amd64/<codename>/` and `arm64/<codename>/` from the bucket
- prints the cron jobs that are left, with the API call, since they live on the Crow server and cannot be removed from here

Dry 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.yaml`** runs the asset half in CI, where the B2 credentials exist.

**README** gains a `## Retiring a slot` section 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:

```
.crow/archive-missed-packages.yaml            targets unpublished: alpine322
.crow/backfill-flat-safety.yaml               targets unpublished: alpine-322
.crow/process-updates.yaml                    targets unpublished: alpine-322, alpine322
...
12 file(s) target a slot the edge does not route.
```

`retire-slot.R alpine322 --config-only --apply` reproduces that commit's structural changes byte for byte across all 18 pipeline files, and additionally catches the two `OS_VERSION` dropdowns.
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 without `B2_S3_ACCESS_KEY` rather than treating B2's empty unauthenticated listing as an already-clean slot.

`crow lint .crow/` reports all 19 configs valid.
`air` and `jarl` are clean on both new scripts.

## Next

`alpine321` and `alpine322` still 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.

Reviewed-on: #214
2026-09-11 13:14:17 +00:00
.crow feat(slots): add a retirement workflow and a drift check (#214) 2026-09-11 13:14:17 +00:00
benchmark chore: move 2024-11-03 23:01:38 +01:00
docker refactor: migrate package installation from pak to uvr (#147) 2026-07-31 12:19:26 +00:00
edge feat(edge): gate per-minor routing on published minors and add a staging zone (#175) 2026-08-30 21:20:16 +00:00
local feat(slots): add a retirement workflow and a drift check (#214) 2026-09-11 13:14:17 +00:00
plans feat(edge): route PACKAGES requests to the per-R-minor slot (#152) 2026-08-07 14:12:22 +00:00
scripts fix(build): strip the s3 scheme so per-minor objects reach their pass (#192) 2026-09-02 07:11:10 +00:00
specs feat(rebuild): shard the weekly rebuild and make each shard resumable (#163) 2026-08-12 08:30:29 +00:00
.editorconfig feat: R-minor-sensitive binary builds (full + iterative) (#84) 2026-06-14 08:04:40 +00:00
.editorconfig-checker.json feat: R-minor-sensitive binary builds (full + iterative) (#84) 2026-06-14 08:04:40 +00:00
.gitignore feat: patch registry + wiring for per-package patching (#103) 2026-06-30 08:50:19 +00:00
.markdownlint-cli2.yaml feat: patch registry + wiring for per-package patching (#103) 2026-06-30 08:50:19 +00:00
.markdownlint.yaml linters 2024-05-29 19:53:38 +02:00
.pre-commit-config.yaml chore(deps): update pre-commit hook editorconfig-checker/editorconfig-checker to v4 (#197) 2026-09-04 09:51:46 +00:00
.prettierignore feat: R-minor-sensitive binary builds (full + iterative) (#84) 2026-06-14 08:04:40 +00:00
.prettierrc.json linters 2024-05-29 19:53:38 +02:00
.terraform.lock.hcl chore(deps): update terraform bunnynet to v0.18.2 2026-08-27 00:33:08 +00:00
.yamllint.yaml feat: R-minor-sensitive binary builds (full + iterative) (#84) 2026-06-14 08:04:40 +00:00
backend.tf feat: import bunny pullzone, add cran.rpkgs.com pullzone config 2025-05-25 10:45:13 +02:00
build-all-versions-install-deps.yaml refactor: migrate package installation from pak to uvr (#147) 2026-07-31 12:19:26 +00:00
cdn.tf feat(cdn): enable per-R-minor routing in production (#184) 2026-08-31 12:52:29 +00:00
CLAUDE.md docs: add CLAUDE.md with B2 storage gotchas and build pipeline conventions for agents 2026-07-02 08:43:37 +02:00
justfile feat(slots): add a retirement workflow and a drift check (#214) 2026-09-11 13:14:17 +00:00
LICENSE.md license 2024-07-26 11:23:40 +02:00
provider.tf chore(deps): update terraform bunnynet to ~> 0.18 2026-08-14 00:32:00 +00:00
README.md feat(slots): add a retirement workflow and a drift check (#214) 2026-09-11 13:14:17 +00:00
renovate.json refactor: migrate package installation from pak to uvr (#147) 2026-07-31 12:19:26 +00:00
vars.tf refactor: hoist CDN block_ips to a variable (#81) 2026-06-08 08:29:06 +00:00

Table of contents

build-binaries

This project offers a framework for creating R package binaries on Linux across various architectures and distributions.

It achieves this through the integration of several components:

  • R package bincraft
  • Containerfiles that define the build toolchain for each distribution
  • S3 storage for storing the compiled binaries
  • PostgreSQL database for recording build logs

R Package

The R package bincraft powers everything. It provides the following functionality:

  • build binaries
  • archive packages following the CRAN-like directory structure
  • upload package binaries to S3
  • update the package index files (PACKAGES*)
  • store build metadata, including error logs, in a PostgreSQL database

See the function reference on the pkgdown site for a full overview.

The focus of the R package is on usability rather than minimizing dependencies. The individual containerfiles include the package along with its dependencies. Bundling more R packages upfront helps reducing the number of additional packages needed when installing the dependencies for the individual packages to be built.

Containerfiles

The toolchain in the containerfile of each distribution is a core element for the build success of each package. The C compiler settings should be close to the recommended settings from CRAN and allow compatibility for most CRAN packages.

Especially Alpine is tricky as CRAN currently does not test R packages for Alpine compatibility (i.e. working with MUSL instead of GLIBC). Due to the different C library (MUSL instead of GLIBC), many R packages that include C/C++ code encounter errors.

Build Process

Tags for each package can be built in parallel via {future} through build_binary_package(). build_binary_package() builds all available tags of an R package by default. When setting tag = <X.Y.Z> or the special value tag = "latest", only these tags will be built.

For every package+tag combination:

  1. Checkout tag(s) from GitHub CRAN mirror (e.g. https://github.com/ggplot2)
  2. Build binaries
  3. Upload binaries to S3
  4. Archive old package versions and keep the latest one in the root
  5. Delete local binaries after successful upload

Patching packages

Some CRAN packages fail to compile on specific platforms due to compiler- or OS-specific issues unrelated to the package itself. The canonical example is RcppParallel, whose bundled TBB is linked in a way that lets a system TBB on the build host shadow it, so the published binary depends on a library the consumer does not have. Because such packages are often transitive dependencies of many others, a single failure cascades: all dependents fail even though nothing is wrong with the dependent itself.

To address this, frequently-failing packages can be "patched" before they are installed — whether as a direct build target or a transitive dependency pulled in by pak.

The patch registry lives in local/patches/registry.json. Each entry specifies a package and the platforms/versions it applies to, along with either lightweight build-time overrides (environment variables, configure arguments, Makevars) or a source diff (for deeper fixes). See local/patches/README.md for the complete schema.

Patching uses a two-tier approach:

  1. Lightweight overrides: environment variables, configure arguments, or Makevars settings applied during build — typically version-independent and fast.
  2. Source diffs: unified diff patches applied to the unpacked source before building — more powerful but version-pinned.

The system is implemented in bincraft: when a package needs patching, bincraft pre-builds it with the patch and serves the patched binary to pak, ensuring transitive dependents receive the fixed package. This way, the fix cascades to all packages that depend on it.

For the design rationale and architecture, see specs/2026-06-30-package-patching-design.md.

Build Environment

Binaries are built on a mixed-architecture Kubernetes cluster using CI. Dedicated arm64/amd64 nodes are utilized to efficiently build the binaries. After all binaries for a specific architecture/OS combination are built, CRON jobs handle the processing of daily change operations. This elastic server architecture offers a robust and performant backend while minimizing costs.

Technical Details

Creating/Updating the PACKAGES Index Files

Currently, the {cranlike} and {desc} packages only work with files on a local file system. This is infeasible if the goal is to store binaries in S3. Storing binaries permanently on a disk-based file system would incur significantly higher costs, especially when operating in the cloud.

Hence, {cranlike} and {desc} were forked to handle files in S3 (through {s3fs}).

Resources

For efficient binary building, reasonably sized instances with high-performance CPUs are crucial to complete tasks within a reasonable timeframe.

During the process, it was observed that a single build can consume up to 14 GB of memory for certain packages. While the majority of packages require less than 2 GB of memory, the exact RAM requirements for individual packages are unpredictable. To prevent the risk of running out of memory (OOM) during builds, the memory allocation for individual builds should not be set below 14 GB.

Parallel builds were tested initially but led to occasional issues with parallel writes and rate limits. Currently, all builds are executed sequentially. It is important to note that parallelism is applied at the tag level, not at the package level, and this behavior cannot be modified at present.

Dependency Cache

A build cache for both R packages (/mnt/cache/R-pkgs) and ccache (/mnt/cache/ccache) is stored in a persistent volume for each architecture/OS combination to speed up dependency installation.

When updating the PACKAGES* index files (PACKAGES, PACKAGES.gz, PACKAGES.rds), processing all CRAN packages (21k+) takes around 40 minutes. Processing updates with an existing database file takes around 5 minutes.

Inferring System Dependencies

R package dependencies and their system dependencies are installed through uvr. uvr allows for parallel downloads and installation, significantly speeding up package installation compared to install.packages(). Additionally, it automatically infers package dependencies using JSON rules vendored from rstudio/r-system-requirements. Not all R packages specify required system dependencies in their DESCRIPTION file, and not all listed dependencies have existing rules in rstudio/r-system-requirements. For Alpine, no rules existed until recently, establishing a foundation for semi-automated package installation on Alpine Linux.

Metadata Database

The build metadata is stored in a PostgreSQL database. The database has a public endpoint at r-binaries.devxy.io and port 15432. It contains one table named single_builds, which holds the build metadata for each package:

package_name tag platform error_occurred build_timestamp build_duration error size removed

Column types:

Column Name Data Type
package_name character varying(255)
tag character varying(255)
platform character varying(255)
error_occurred boolean
build_timestamp timestamp without time zone
build_duration numeric(1000,2)
error text
size numeric(1000,2)
removed boolean

Alternatively, use \d+ single_builds. Note: There is currently no read-only role available to connect to the DB as a viewer.

A Shiny dashboard providing a search functionality of the database and grouped statistics is available at https://app.devxy.io/app/r-package-binaries-dashboard with the source repo living at https://gitlab.com/devxy/r-package-binaries/shiny.

Support for Archived Versions

remotes::install_version()

Is supported by writing Meta/archive.rds during each package index update, listing all available archived packages.

uvr add package@version

Clients that resolve archived versions search for Archive/<package> and can install all versions they find. This holds for uvr as well as for older pak-based clients.

Ensure to use a clean cache if other repositories have been used previously. If in doubt or when testing, call uvr cache clean.

Lessons Learned

  • The newest R version needs to be used to build binaries. Some packages depend on the "recommended" packages and attempt to install them as dependencies. This fails for older R versions, e.g., if R 4.0.5 tries to install Matrix from 4.4.x. Generally, no issues installing packages built with newer versions were observed yet, hence it should be fine to build with the newest version and install these packages using any version.

  • Graphical R packages are challenging. Most can be processed by starting R with xvfb-run R, but some still encounter issues and get stuck during processing.

  • A few dozen packages rely on exotic external dependencies that must be installed from source. Including all of these would significantly increase the container image size for minimal gain. A common external dependency on which many R packages depend is JAGS. Because of this, it has been included in the Containerfiles to enable successful builds for several dozen R packages.

  • Catching build failures at all possible build stages is difficult. Timeouts may occur, dependencies can fail to install, and some tags in the GitHub mirror might not include valid DESCRIPTION files. It is crucial to catch errors, continue the build, and make the build process as robust as possible.

URL Composition and Platform Identifiers

Platform identifiers have been aligned with those used in https://github.com/rstudio/r-system-requirements, which uvr vendors and uses for its automatic syslib dependency installer (uvr sync --install-system-deps):

  • redhat-9
  • redhat-8
  • ubuntu-2204
  • ubuntu-2404
  • alpine-320
  • alpine-321

The final repository URL is structured slightly differently and follows the format of the Posit Packagemanager:

https://<domain>/<arch>/<OS>/latest

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 slot

A slot is only reachable if it is listed in local.rpkgs_slots in cdn.tf, which feeds UNION_SLOTS in edge/rpkgs-router.ts. An unrouted slot serves the flat index to every client, so its binaries fail at dyn.load() under every R minor but one.

In order:

  1. Remove it from local.rpkgs_slots in cdn.tf and from DistroId in the website's src/src/data/repos.ts, then tofu apply.

  2. just retire-slot <codename> --apply, then commit.

  3. Delete its cron jobs on the Crow server; local/retire-slot.R prints them with the API call.

  4. Delete its objects:

    crow pipeline create devxy/build-cran-binaries --branch main \
      --var retire_slot=<codename> --var RETIRE_APPLY=yes
    

Steps 2 and 4 refuse any slot still listed in cdn.tf. Running step 4 before step 2 means the next nightly rebuilds everything just deleted.

just check-slots fails when a pipeline still targets an unrouted slot.

Helpers

Helper scripts are located in local/. These scripts can assist in various situations, such as manually processing packages or filtering specific information from the metadata database.

Common Errors

Below is a collection of raw errors observed during the build process:

* installing to library '/tmp/Rtmp7WPw19/temp_libpath114b846b58'\n* installing *source* package 'ade4' ...\n** using staged installation\nERROR: a 'NAMESPACE' file is required\n* removing '/tmp/Rtmp7WPw19/temp_libpath114b846b58/ade4'\n"

Tag does not have a NAMESPACE file and hence cannot be built.

"* installing to library '/tmp/RtmpLcCitS/temp_libpath1146aabbe92'\nERROR: dependency 'tripack' is not available for package 'alphahull'\n* removing '/tmp/RtmpLcCitS/temp_libpath1146aabbe92/alphahull'\n"

Dependency not available: Either because the dependency was not declared or errored itself during installation.

 In function '\033[01m\033[KRcpp::List solveRRBLUP(const mat&, const mat&, const mat&)\033[m\033[K':\n\033[01m\033[KMME.cpp:162:61:\033[m\033[K \033[01;31m\033[Kerror: \033[m\033[K'\033[01m\033[KPI\033[m\033[K' was not declared in this scope\n  162 |   double ll = -0.5*(double(optRes[\"objective\"])+df+df*log(2*\033[01;31m\033[KPI\033[m\033[K/df));\n      |                                                             \033[01;31m\033[K^~\033[m\033[K\n\033[01m\033[KMME.cpp:\033[m\033[K In function '\033[01m\033[KRcpp::List solveRRBLUPMV(const mat&, const mat&, const mat&, int, double)\033[m\033[K':\n\033[01m\033[KMME.cpp:277:31:\033[m\033[K \033[01;31m\033[Kerror: \033[m\033[K'\033[01m\033[KPI\033[m\033[K' was not declared in this scope; did you mean '\033[01m\033[KHI\033[m\033[K'?\n  277 |   ll -= double(n*m)/2.0*log(2*\033[01;31m\033[KPI\033[m\033[K);\n      |                               \033[01;31m\033[K^~\033[m\033[K\n      |                               \033[32m\033[KHI\033[m\033[K\nmake: *** [/opt/R/4.4.2/lib/R/etc/Makeconf:204: MME.o] Error 1\nERROR: compilation failed for package 'AlphaSimR'\n* removing '/tmp/RtmpclI5CE/temp_libpath11135d215d5/AlphaSimR'\n

Compiler error: Possible reasons: too old CXX code which cannot be compiled anymore with CXX14 or CXX17.


When inferring dependencies:

internal error 1 in memDecompress

Solution:

uvr cache clean
rm -rf /mnt/cache/uvr /root/.cache/R/

Packages with unresolved build failures

Some packages are intentionally skipped right for "full builds" (i.e. building of all versions) as they result in getting stuck indefinitely. This applies mostly to very old package versions and the most recent version can usually be built successfully.

For others it might be due to exotic external dependencies which require manual installation.

Help in resolving these issues are highly welcome!

Name Platform Arch Reason Date Created Date Solved
Apollonius redhat-8 gmp missing 2024-11-15
doBy alpine-320 amd hangs 2024-11-23
later ubuntu 22 & 24 amd hangs for early versions - xfvb? 2024-11-23
CoTiMA ubuntu 22 & 24 amd OOM? 2024-11-23
FrF2 alpine arm hangs 2024-11-23
FrF2.catlg128 alpine arm hangs 2024-11-23
DoE.base alpine arm/amd hangs 2024-11-23
eha alpine amd hangs 2024-11-23
gRain alpine amd hangs 2024-11-23
gRbase alpine amd hangs 2024-11-24
IDPmisc alpine amd hangs 2024-11-24
RVAideMemoire alpine amd hangs 2024-11-25
pbkrtest alpine arm hangs 2024-11-25
seewave alpine arm hangs 2024-11-25
spdep alpine arm hangs 2024-12-03
compareGroups alpine arm hangs 2024-12-11
SNPassoc alpine arm hangs 2024-12-11
surveillance alpine arm hangs 2024-12-13

CDN Settings

A CDN is used in front of the S3 bucket to efficiently distribute the binaries globally.

A "Perma-Cache" is enabled for three different regions around the world (DE, US, Asia). Once a binary is requested for the first time from a specific location, the asset is copied to the perma-cache and served from there for subsequent requests.

The CacheControl = "no-cache" header is set for all PACKAGES* files to ensure users always receive the latest version, as these files change daily. Additionally, the cache for these files is purged after every update.