Publishing to shinyapps.io with Github and Travis CI
I had a fun experience these past few days figuring out how to publish to shinyapps.io directly from a Github push. In this post, I leverage Travis CI to handle the automated build and deployment process.
Creating Your DESCRIPTION File
If you have created an R package in the past, you will already be familiar with the required
DESCRIPTION file. Even though a Shiny application is not a package, you will still need a
DESCRIPTION file. This is a Debian Control File (dcf) format. While the
DESCRIPTION file has many possible key-value pairs, only two are necessary for a Shiny application. You need to specify the
Package and the
Type. The Package name does not matter, since you are not deploying this as a package to an R package repository.
Package: plotdemos Type: Shiny
Creating Your Travis CI Configuration File
.travis.yml just right can be a bit of a trick. Hopefully this will help you get up and running quickly.
First, we need to put a bit of header data into our configuration. This tells Travis what Ubuntu distribution to use, if
sudo access is required, and what language we are deploying (R). The
r: release tells Travis to use the latest available release. You can also specify specific versions, e.g. r: 3.5.3.
dist: xenial sudo: false latex: false language: r r: release
R gives quite a few warnings when it builds. I would love to get to the point where I can set this to
true, but I am not quite there yet. If you set this to
true, then any warnings produced during the build will cause an error.
We want Travis to cache its packages. This will make later builds much faster.
cache: packages: true
We need to install a few extra packages from
apt. If you have necessary
apt packages, put those here.
apt_packages: - libgdal-dev - libudunits2-dev
apt is done installing, it will pull your code from Github. I don’t want the
git command to use the
git: depth: false
What R packages need to be installed?
r_packages: - gapminder - ggthemes - maps - RColorBrewer - rgeos - rnaturalearth - rnaturalearthdata - rsconnect - shiny - shinyAce - survminer - survival - tidyverse
What script do you want to run? I will include the content of this
deploy.R in the next section.
script: - R -f deploy.R
Writing Your Deployment Script
The deployment script needs to do a few things.
- Load your necessary packages.
- Configure your connection to shinyapps.io.
- Deploy your application.
In my case, my
util.R file contains all of my
library() load instructions. Sourcing that file will load my packages. The necessary connection requirements are saved as hidden environment variables.
library(rsconnect) # Print a list of app dependencies. Libraries need to be loaded # before publishing so deployApp() knows what is necessary. source("./R/util.R") # Set the account info for deployment. setAccountInfo(name = Sys.getenv("shinyapps_name"), token = Sys.getenv("shinyapps_token"), secret = Sys.getenv("shinyapps_secret")) # Deploy the application. deployApp()
Configuring Travis CI
In Travis CI, you will need to set up your deployment keys. You can get those values from your shinyapps.io settings page. If you want to push back to Github, you will also need a Github token. Make sure all of these are marked as hidden. “Display value in build log” should be unchecked.
Deploying Your Updates
Deploying your application is linked directly to your Github repository. When you push to Github, Travis CI will kick off your build, pull your latest code, and - if everything is successful - deploy your application.
Now, go forth and deploy all the things! If you have questions, please let me know.