# Continuous Installation

#### Jonathan M. Hill

#### 2018-09-21

RInno supports continuous installation of shiny apps through APIs to public/private BitBucket and GitHub repos. If you follow the directions in this vignette, RInno apps will call your repository each time a user clicks their icon. If there have been any hotfixes or releases since installation, the app automatically updates, letting its user know through a windows progress bar, and then opens normally.

This feature requires:

1. A URL to the app’s repo, `app_repo_url`. This should be the full URL like, https://github.com/Dripdrop12/RInnoApp.
2. A release tag on GitHub, or a version on BitBucket. If you forget to create a release, your app will error when it calls `get_remote_version` and `parsed_response`’s subscript will be “out of bounds.”
3. An R package structure that can be installed via `remotes::install_github` or `remotes::install_bitbucket`. I recommend testing this before compiling your RInno .exe.

The release tag or version is compared with the package DESCRIPTION file, i.e. `0.0.0.9000`, to determine if the app should call `remotes::install_github` or `remotes::install_bitbucket` respectively. So update the app’s version in both places (2 & 3 above) with each new version, otherwise the app will re-install every time its icon is clicked.

## R Package Structure

To connect a shiny app to a remote repository, the app must be on Github or Bitbucket, and it must be in the `inst/app` directory of an R package. The easiest way to do this is by creating a new project in RStudio and selecting R Package. See Dean Attali’s Blog for a detailed tutorial on including shiny apps in an R package.

package/ |  |
--- | --- | ---
| inst/app/ |
|  | ui.R
|  | server.R
| R |
| … |
| DESCRIPTION |
| … |

The package should be called `app_name`, and within the DESCRIPTION file, `Package: app_name`. Make sure your app can be installed as a package by typing `ctrl`+`shift`+`B`.

## Bitbucket

On Bitbucket, enable issue tracking in the repo’s settings. This will add Versions to the Issues section and make it accessible via BitBucket’s API. Add `0.0.0.9000` to Versions and within the package’s DESCRIPTION file, `Version: 0.0.0.9000`.

Then create an RInno installer:

    create_app(
      app_name     = "myapp",
      app_repo_url = "https://bitbucket.org/fi_consulting/myapp",
      pkgs         = c("magrittr", "httr", "shiny", "myapp"),
      auth_user    = "<read_only_username>",
      auth_pw      = "<password>")

    compile_iss()

Or for custom installers, directly through `create_config`:

    create_config(
      app_name     = "myapp",
      R_version    = "3.3.2",
      app_dir      = "app",
      pkgs         = c("magrittr", "httr", "shiny", "myapp"),
      app_repo_url = "https://bitbucket.org/fi_consulting/myapp",
      auth_user    = "<read_only_username>",
      auth_pw      = "<password>")

    # -------------------------------------------------- Many steps later
    compile_iss()

Shiny apps compiled/installed this way will call the BitBucket API on start up, and re-install every time there is an update to the BitBucket repo’s version. For public repos, you do not need to provide `auth_user` and `auth_pw`.

## GitHub

On GitHub, create a release for the app. The release(s) tab is located on the repo’s homepage next to branch(es) just before contributor(s). Add `0.0.0.9000` to the release tag and within the package’s DESCRIPTION file, `Version: 0.0.0.9000`. This will make the release tag accessible via GitHub’s API. For private repos, you will need to create an app token.

Then create an RInno installer:

    create_app(
      app_name     = "myapp",
      app_repo_url = "https://github.com/fi_consulting/myapp",
      pkgs         = c("magrittr", "httr", "shiny", "myapp"),
      auth_token   = "<app_token>")

    compile_iss()

Or for custom installers, directly through `create_config`:

    create_config(
      app_name     = "myapp",
      R_version    = "3.3.2",
      app_dir      = "app",
      app_repo_url = "https://github.com/fi_consulting/myapp",
      pkgs         = c("magrittr", "httr", "shiny", "myapp"),
      auth_token   = "<app_token>")

    # -------------------------------------------------- Many steps later
    compile_iss()

Shiny apps compiled/installed this way will call the GitHub API on start up, and re-install every time there is an update to the GitHub repo’s most recent release tag. For public repos, you do not need to provide `auth_token`.

### A Note on Versions

A released version number consists of three numbers, `major.minor.patch`. Semantic Versioning 2.0.0 is a good specification to follow because `numeric_version` will interpret it correctly:

    numeric_version("0.1.0") == numeric_version("0.1")

    ## [1] TRUE

    # First release!
    numeric_version("0.0.1") > numeric_version("0.0.0.9000")

    ## [1] TRUE

This is important because RInno determines the `local_version` of the app via `installed.packages()`. If R cannot parse the version correctly, the continuous installation will be… nonstop. Users will love you.