Chapter 2 Continuous Integration Best Practices

This chapter summarizes our guidelines about continuous integration after explaining what continuous integration is.

Along with last chapter, it forms our guidelines for Software Peer Review.

2.1 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. 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.

2.2 How to use continuous integration?

The usethis package offers a few functions for continuous integration setup, see the documentation.

Details will be provided below for different services.

2.3 Which continuous integration service(s)?

Different continuous integration services will support builds on different operating systems.

R packages should have CI for all platforms 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 platforms, and most often not too much hassle.

2.3.1 Travis CI (Linux and Mac OSX)

Travis offers continuous integration for Linux and Mac OSX. Set it up using usethis::use_travis().

R is now a natively supported language on Travis-CI, making it easier than ever to do continuous integration. See R Packages and Julia Silge’s Beginner’s Guide to Travis-CI for R for more help.

To customize your build, have a look at Travis’ docs and at existing Travis config files over rOpenSci’s ropensci GitHub organization, e.g. this one for the spelling package. 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. You can enable this on Travis by adding the following to your .travis.yml configuration file:

  - oldrel
  - release
  - devel

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. See this more complex example of a Travis configuration where pkgdown documentation is built during the release R version testing only. Minimizing build times on Travis

Please use these tips to minimize build time on Travis especially after your package project gets transferred to ropensci Travis account:

  • Cache installation of packages. Add cache: packages at the beginning of the config file. Example in the wild. It’ll already be in the config file if you set Travis up using usethis::use_travis().

  • Enable auto-cancellation of builds.

  • If you have a matrix to test your package on several Travis systems, place any after_success or before_deploy commands within one single matrix build to avoid them being executed on every matrix build.

2.3.2 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:

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](](

2.3.3 Circle CI

Circle CI is used, for example, by rOpenSci package bomrang as an alternative to Travis CI.

2.4 Test coverage

Continuous integration should also include reporting of test coverage via a testing service such as Codecov or Coveralls. See the README for the covr package for instructions, as well as usethis::use_coverage().

If you run coverage on several CI services the results will be merged.

2.5 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.

2.6 Make more of your CI builds: tic

The tic package facilitates deployment tasks for R packages tested by Travis CI, AppVeyor, or any other CI tool of your choice, cf e.g. our suggestion to build and deploy the documentation website of your package via Travis. Actually this book uses tic for deployment.

2.7 Make more of your CI builds: Use Travis to deploy websites

If your package has a website built by pkgdown, you can use Travis to update and deploy the website on each build. See the help on pkgdown::deploy_site_github(). If your .travis.yml has a matrix specifying multiple Travis builds, you should put the before_deploy and deploy commands within a single matrix entry to avoid all of them rebuilding and deploying your website. See an example here.