Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time
# Continuous Integration Best Practices {#ci}
```{block, type='summaryblock'}
This chapter summarizes our guidelines about continuous integration after explaining what continuous integration is.
Along with the [previous chapter](#building), it forms our guidelines for Software Peer Review.
## What is continuous integration (CI)?
Continuous integration automatically runs tests on software.
In the case of rOpenSci, CI practically means that a set of tests will be automatically run via GitHub, every time that you make a commit or pull request to GitHub.
CI automates the running of general package checks such as `R CMD check`, see [testing](/building.html#testing).
It is possible to set up CI before your tests are written, then CI will run the tests as you commit them to the repository.
## Why use continuous integration (CI)?
All rOpenSci packages must use one form of continuous integration.
This ensures that all commits, pull requests and new branches are run through `R CMD check`.
The results of all tests are displayed on the pull request page on GitHub, providing another layer of information about problems and protection against breaking your package before merging changes.
rOpenSci packages' continuous integration must also be linked to a code coverage service, indicating how many lines are covered by unit tests.
Both test status and code coverage should be reported via badges in your package README.
R packages should have CI for all operating systems (Linux, Mac OSX, Windows) when they contain:
* Compiled code
* Java dependencies
* Dependencies on other languages
* Packages with system calls
* Text munging such as getting people's names (in order to find encoding issues).
* Anything with file system / path calls
In case of any doubt regarding the applicability of these criteria to your package, it's better to add CI for all operating systems. Most CI services standards setups for R packages allow this with not much hassle.
## Which continuous integration service(s)? {#whichci}
There are a number of continuous integration services, including standalone services (CircleCI, AppVeyor), and others integrated into code hosting or related services (GitHub Actions, GitLab, AWS Code Pipeline). Different services support different operating system configurations.
[GitHub Actions]( is a convenient option for many R developers who already use GitHub as it is integrated into the platform and supports all needed operating Systems. There are [actions supported for the R ecosystem](, as well and first-class support in the [{usethis}]( package. All packages submitted to rOpenSci for peer review are checked by our own [`pkgcheck` system](, described further in the [Guide for Authors](#authors-guide). These checks are also provided as a GitHub Action in the [`ropensci-review-tools/pkgcheck-action` repository]( Packages authors are encouraged to use that action to confirm prior to submission that a package passes all of our checks. See [our blog post]( for more information.
[usethis supports CI setup for other systems](, though these functions are soft-deprecated. rOpenSci also supports the [circle]( package, which aids in setting up CircleCI pipelines, and the [tic]( package for building more complicated CI pipelines.
#### Testing using different versions of R
We require that rOpenSci packages are tested against the latest, previous and development versions of R to ensure both backwards and forwards compatibility with base R.
Details of how to run tests/checks using different versions of R locally can be found in the R-hub vignette on running [Local Linux checks with Docker](
You can fine tune the deployment of tests with each versions by using a testing matrix.
If you develop a package depending on or intended for Bioconductor, you might find [biocthis]( relevant.
#### Minimizing build times on CI
You can use these tips to minimize build time on CI:
* Cache installation of packages. The default [r-lib/actions workflows]( do this.
### Travis CI (Linux and Mac OSX)
We recommend [moving away from Travis](
### AppVeyor CI (Windows)
For continuous integration on Windows, see [R + AppVeyor]( Set it up using `usethis::use_appveyor()`.
Here are tips to minimize AppVeyor build time:
* Cache installation of packages. [Example in a config file]( It'll already be in the config file if you set AppVeyor CI up using `usethis::use_appveyor()`.
* Enable [rolling builds](
We no longer transfer AppVeyor projects to ropensci AppVeyor account so after transfer of your repo to rOpenSci's "ropensci" GitHub organization the badge will be `[![AppVeyor Build Status](](`.
### Circle CI (Linux and Mac OSX)
[Circle CI]( is used, for example, by rOpenSci package [`bomrang`]( as continuous integration service.
## Test coverage {#coverage}
Continuous integration should also include reporting of test coverage via a testing service such as [Codecov]( or [Coveralls](
We recommend using Codecov.
To activate Codecov for your repo, run `usethis::use_github_action("test-coverage")` to create a file `.github/workflows/test-coverage.yaml`.
You also need to give Codecov access to your github repository, see [Codecov quick start guide]( for how to set up access.
Then add a Codecov status badge to the top of your, see [Codecov status badges](
Currently, Codecov has access to all ropensci github repositories by default.
When your repository is accepted and transferred to ropensci, Codecov access should transfer automatically.
You will need to update the URL of the badge to point to the rOpenSci-hosted repository.
For more details, see the [README for the **covr** package]( for instructions, as well as [`usethis::use_coverage()`]( and [`usethis::use_github_action()`](
If you run coverage on several CI services [the results will be merged](
## Even more CI: OpenCPU
After transfer to rOpenSci's "ropensci" GitHub organization, each push to the repo will be built on OpenCPU and the person committing will receive a notification email. This is an additional CI service for package authors that allows for R functions in packages to be called remotely via using the [opencpu API]( For more details about this service, consult the OpenCPU [help page]( that also indicates where to ask questions.
## Even more CI: rOpenSci docs {#rodocsci}
After transfer to rOpenSci's "ropensci" GitHub organization, a pkgdown website will be built for your package after each push to the GitHub repo. You can find the status of these builds at `` and in the [commit status]( The website build will use your pkgdown config file if you have one, except for the styling that will use the [`rotemplate` package]( Please report bugs, questions and feature requests about the central builds and about the template at