Release Process#
Audience: maintainers
Time: 10 minutes
What you’ll get: the version sites that move together, and how a release is built and published
To release the R package, publish a GitHub Release vX.Y.Z in
theislab/cellucid-r; the workflow release.yaml (“Publish to CRAN”) submits
it to CRAN. Nothing else publishes it: pushing a tag does nothing, and the
workflow has no manual trigger. Releasing Cellucid covers the
three Cellucid packages in order.
The full step-by-step checklist lives in:
cellucid-r/publishing.md
Release flow#
Update
DESCRIPTIONversion. It is the one source the rest are checked against.Update
CITATION.cff,NEWS.md,README.md, andvignettes/installation.Rmdto match, plus the pinned release literal intests/testthat/test-current-contract.R.NEWS.mdheadings carry no date; CRAN records the publication day.Record user-visible changes in
NEWS.mdand keepcran-comments.mdcurrent.Ensure tests pass (
testthat::test_local(), including the anndata round trip withCELLUCID_ANNDATA_PYTHONset, andR CMD check --as-cran).Merge to main and wait for CI to be green there.
Publish a GitHub Release whose tag is exactly
vfollowed by theDESCRIPTIONversion, onmain, not marked pre-release.release.yamlruns onrelease: publishedonly and, before building anything, refuses a draft, a release marked pre-release, aDESCRIPTIONversion that is notX.Y.Z(CRAN takes final versions only), a tag other thanEXPECTED_TAG="v${VERSION}", and a tagged commit that is not onmain.release.yamlthen builds the source tarball, runsR CMD check --as-cranon it, uploads it with its SHA-256 as ther-source-tarballartifact, attaches both to the release and, when the check reports no WARNING and no ERROR, submits the tarball to CRAN withcran-comments.mdas the comment (devtools:::upload_cran()); CRAN then emails the maintainer a confirmation link, which the maintainer must click.A run that failed for a passing reason (a runner, the network, CRAN’s form) is retried with Re-run jobs on that run in the Actions tab.
Other channels follow the GitHub release:
r-universe (auto-builds from GitHub once the GitHub App is installed)
conda-forge (
r-cellucid, built from the CRAN tarball)
pkgdown.yaml separately builds and deploys the package website at
https://theislab.github.io/cellucid-r/. That site is the R help pages; this
guide is the narrative documentation, and the two are maintained separately.
Keeping this guide’s version in step with the package#
The page you are reading is part of the cellucid-python repository, and so is
Installation, which tells R users which version to install.
cellucid-python/scripts/validate_release.py checks those pages against the
Python package version in cellucid-python/pyproject.toml.
cellucid-r and cellucid-python are separate repositories with separate CI,
and neither checkout can read the other. Nothing therefore compares
cellucid-r/DESCRIPTION to this guide: bumping the Python version alone leaves
every gate green while the R installation page names a version the R package
never shipped, and bumping cellucid-r/DESCRIPTION alone leaves this guide
behind. The two versions are meant to move together; keeping them together is a
manual step in both release checklists.
cellucid-r’s own test suite pinsDESCRIPTIONto every version site inside that repository, andDESCRIPTIONcarries aConfig/cellucid/version-markerfield so agrep -rn CELLUCID_VERSIONsweep lists it.Releasing either package means bumping both to the same version and running
python scripts/validate_release.pyincellucid-pythonplustestthat::test_local()incellucid-r.
What contributors should keep in mind#
The package writes a standard AnnData store plus
uns['cellucid']; the web app and the Python package read and write the same contract.A change to what the store holds lands in the R writer, the Python writer, the web reader, their tests, and the documentation together; only the one current layout is kept.
Where to update docs#
When the store or the arguments change, update:
the hand-written help pages under
cellucid-r/man/(cellucid_prepare.Rd,cellucid_view.Rdand the other viewer pages), and the reference index incellucid-r/_pkgdown.ymlwhen a topic is added (the article index when a vignette is added;.github/scripts/validate-pkgdown.Rrefuses a site whose indexes miss one)cellucid-r/README.mdandcellucid-r/vignettes/cellucid.Rmd(andvignettes/viewer.Rmdfor the viewer)user guide API docs: Data Preparation API
the store specification: Cellucid-ready AnnData specification (R writer)