---
title: "Combining Drat and Travis CI"
author: "Colin Gillespie and Dirk Eddelbuettel"
date: "Written 2015-04-14, updated 2021-03-29"
css: "water.css"
---
## What is Travis CI?
[Travis CI](https://www.travis-ci.com/) is a hosted continuous integration service.
It is integrated with GitHub and offers first class support for a number of languages,
but importantly for us, R.
Travis CI enables package authors to continually ensure their package always build and
passes associated unit tests.
Whenever a commit is pushed to a git repository that contains an R package,
Travis CI attempts to build the associated R package (see
[r-travis](https://github.com/craigcitro/r-travis) for R specific examples).
This ensures the repository
always contains a working package. This vignette describes a modification to the standard
Travis CI workflow. If a package build is successful, the package is then
pushed to a [drat](http://dirk.eddelbuettel.com/code/drat.html) repository.
## Preliminaries
Unsurprisingly in order to integrate Travis CI with drat, you must first to have a
[drat](https://github.com/eddelbuettel/drat) repository and secondly add
[Travis CI](https://github.com/craigcitro/r-travis) support to that repository.
## Workflow
1. To allow Travis CI to push to your GitHub repository, we need to
generate a GitHub [API token](https://github.com/settings/tokens/new).
After re-entering your password, just select `repo`, or
if your repository is public, select `public_repo`. GitHub will create the token
and give you a chance to copy it down.
1. Travis CI will then [encrypt](http://docs.travis-ci.com/user/encryption-keys/) this token.
The short story is:
```sh
# Install Ruby first. This may require sudo
gem install travis
```
If `sudo` is not available, you can do a local install
```sh
# Look at ~/.gem/
gem install --user-install travis
```
1. `cd` to the R package directory and run
```sh
travis encrypt GH_TOKEN=$MY_ACCESS_TOKEN --add env.global
```
where `$MY_ACCESS_TOKEN` is your access token. The `--add env.global` automatically adds the token to your `.travis.yml` file.
1. Add the `deploy.sh` shell script to your repository and edit appropriately. An example
is found at the end of this vignette and also in the
[dratTravis](https://github.com/csgillespie/dratTravis) repository.
1. Add the lines
```
after_success:
- test $TRAVIS_PULL_REQUEST == "false" &&
test $TRAVIS_BRANCH == "master" &&
bash deploy.sh
```
to your `.travis.yml` file. This means your `drat` repository is only updated
- for successful builds;
- only on the master branch;
- and not for pull requests.
## Example `deploy.sh` script
```sh
#!/bin/bash
set -o errexit -o nounset
addToDrat(){
PKG_REPO=$PWD
cd ..; mkdir drat; cd drat
## Set up Repo parameters
git init
git config user.name "XXX YYY"
git config user.email "XXXX@example.com"
git config --global push.default simple
## Get drat repo
git remote add upstream "https://$GH_TOKEN@github.com/GITHUB_USERNAME/drat.git"
git fetch upstream 2>err.txt
git checkout gh-pages
Rscript -e "drat::insertPackage('$PKG_REPO/$PKG_TARBALL', \
repodir = '.', \
commit='Travis update: build $TRAVIS_BUILD_NUMBER')"
git push 2> /tmp/err.txt
}
addToDrat
```
If you use a `docs/` directory in the main branch, omit `git checkout
gh-pages` and use `cd docs` instead.