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.

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

Getting your .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.

warnings_are_errors: false


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


After apt is done installing, it will pull your code from Github. I don’t want the git command to use the depth flag.

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


The deployment script needs to do a few things.

2. Configure your connection to shinyapps.io.

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.