Automate R integration testing at cloud scale
2025-12-24
Hi, I’m Nan Xiao (@nanxstats)!
Passionate about writing fast and correct code + better developer tooling
Package authors should check following CRAN repository policy:
For a package update, please check that any packages depending on this one still pass
R CMD check: it is especially expected that you will have checked your own packages.
CRAN will check independently after update submission:
package ggsci_4.2.0.tar.gz has been auto-processed and is pending an automated reverse dependency check. This service will typically respond to you within the next day. For technical reasons you may receive a second copy of this message when a team member triggers a new check.
Goal: A shattered ecosystem helps no one, so we need integration testing at the ecosystem level. All packages should always work together out of the box.
Solution: invest developer time to save user time
library(ggplot2) just worksR CMD check on each one, twice:
Simple in theory. Complex in practice:
tools, revdepcheck, or xfun::rev_check() manuallyYou need:
revdepcheck: great for local checks of 50 revdeps on Windows/macOSrevdepcheck.extras: workflow and CLI tooling improvementsxfun::rev_check(): fast parallel checking on Windows/macOSKnown limitations:
Each solves part of the problem.
None solves the whole problem for cloud-scale checking for everyone.
Pro tip: Seek early product-market fit signals from the right audience.
I benefited from sharing the news on the r-package-devel mailing list.

Run one command, get coffee, watch it work.
pak to install binary dependencies from Posit Public Package Manager (P3M)xfun::rev_check() for parallel checkingPhase 1: Environment setup and dependency installation
Phase 2: Parallel checking of all reverse dependencies
revdep/library/xfun::rev_check() with all available CPU coresFresh Ubuntu instance. Four commands:
That’s it!
# Basic usage
revdeprun https://github.com/USER/PACKAGE.git
# Specify R version
revdeprun --r-version devel https://github.com/USER/PACKAGE.git
# Control parallelism
revdeprun --num-workers 48 https://github.com/USER/PACKAGE.git
# Use local directory
revdeprun ~/workspace/my-package
# Use source tarball
revdeprun ~/packages/mypackage_1.2.3.tar.gz
# Custom workspace
revdeprun --work-dir /data/workspace https://github.com/USER/PACKAGE.gitRust gives you separation of concerns:
anyhow: error handling with contextclap: command-line argument parsingindicatif: progress bars for long-running operationsreqwest: HTTP client for downloading packages and metadataserde/serde_json: JSON parsing for package metadataxshell: cross-platform scripting environment in RustCloud instance specs:
00:00:00 - Started. Setting up R and installing system dependencies.
00:14:00 - Started downloading 4,430 packages required for checking.
00:23:00 - Started installing packages.
00:49:00 - xfun::rev_check() started preparation.
00:53:00 - Started downloading all 1,732 reverse dependencies from source.
00:56:00 - Setup complete. Time for the real work.
00:56:00 - Started checking all 1,732 packages, twice.
01:28:00 - Halfway done. 866 packages remaining.
02:44:00 - Finished. 35 packages reported check diffs.

$24pak can install these binaries in minutes instead of hoursThese are open questions. Contributions welcome.
revdeprun on GitHub
https://github.com/nanxstats/revdeprun
revdeprun on crates.io
https://crates.io/crates/revdeprun
Documentation
Blog posts
Announcing revdeprun: https://nanx.me/blog/post/revdeprun/
First data.table speedrun: https://nanx.me/blog/post/revdep-speedrun/
Second data.table speedrun: https://nanx.me/blog/post/revdeprun-2-1-0/