Travis CI 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 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 repository.
Unsurprisingly in order to integrate Travis CI with drat, you must first to have a drat repository and secondly add Travis CI support to that repository.
To allow Travis CI to push to your GitHub repository, we need to generate a GitHub API token. 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.
Travis CI will then encrypt this token. The short story is:
# Install Ruby first. This may require sudo
gem install travis
If sudo
is not available, you can do a local install
# Look at ~/.gem/
gem install --user-install travis
cd
to the R package directory and run
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.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 repository.
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
deploy.sh
script#!/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
}
addToDrat