Slide 1

Slide 1 text

Art of the Feature Toggle Patterns for maintaining and improving Shiny applications over time

Slide 2

Slide 2 text

Solutions Engineering at RStudio

Slide 3

Slide 3 text

Shiny in Production Workshop - 2019 Bookdown: Shiny in Production (RStudio Conference 2019) Chapter 12 - DevOps Philosophy and Tooling - “Production” has many meanings - Are there lessons can be learned from the DevOps community?

Slide 4

Slide 4 text

Introducing new features over time Shiny Applications in Production

Slide 5

Slide 5 text

Adding new features to Shiny in Production Version 1 Version 2

Slide 6

Slide 6 text

Adding new features to Shiny in Production Version 1 Version 2

Slide 7

Slide 7 text

Adding new features to Shiny in Production Version 1 Version 2

Slide 8

Slide 8 text

Version 1 Version 2 Does pushing a code change feel risky?

Slide 9

Slide 9 text

DevOps Learning: Decouple deployment from release ● Deployment is any push of code to an environment (test, prod) ● Release is when that code (feature) is made available to users or customers Deployment on demand and thoughtful release strategies allow more control (and more success) over the delivery of features to end users. - Application-based release patterns (today!) - Environment-based release patterns (tomorrow)

Slide 10

Slide 10 text

Application-Based Release Patterns

Slide 11

Slide 11 text

Feature Toggle A mechanism to selectively enable and disable features, or control which features are visible to specific user segments. Enable dark launch: deploy a change to production and then perform testing while it’s invisible to most users. - Modify the code to make calls to new functions, log results without displaying - Have 1% of users make invisible calls to new feature, fix issues, progressively increase users to test production load

Slide 12

Slide 12 text

Starting from the Gallery

Slide 13

Slide 13 text

“Personalized Data Access” session$user

Slide 14

Slide 14 text

Feature Toggles Shiny applications can access the username and groups of the current user through the session parameter of the shinyServer function. Your application could use this information to display customized messages or to enable functionality for a specific subset of users.

Slide 15

Slide 15 text

Implementation

Slide 16

Slide 16 text

Implementation UI built through conditional session$user tests within server-side output objects output$subtitle output$salesPlot output$salesTbl

Slide 17

Slide 17 text

Dynamic UI Feature Toggles

Slide 18

Slide 18 text

The conditionalPanel function The conditionalPanel function, is used in ui.R and wraps a set of UI elements that need to be dynamically shown/hidden. Creates a panel that shows and hides its contents depending on the value of a JavaScript expression, usually input-based. This example shows how to define an output variable in the server code that you can use in the UI. Output condition example: Dean Attali session$user session$groups

Slide 19

Slide 19 text

conditionalPanel( condition = "output.isBeta == false", … UI Elements) conditionalPanel( condition = "output.isBeta == true", … UI Elements) output$isBeta <- reactive({ [Test for group membership] })

Slide 20

Slide 20 text

Feature Toggles in Production? Will I (personally) use feature toggles for Shiny application deployment and releases? No, not likely. - Not easy to manage, automate, test and ultimately “toggle” - Alternative: “Environment-Based Release Patterns” - Still a cool concept, useful for solving other types of problems - RStudio Connect Feature Hacks!

Slide 21

Slide 21 text

Mixing Access Controls & Feature Toggles on RStudio Connect

Slide 22

Slide 22 text

Content Access Control Options on RStudio Connect Access Control Setting Description Anyone, no login required Allows for anonymous viewer access All users, login required Everyone with an RStudio Connect account Specific users or groups Only users or groups you specify can access Collaborators & you Only you and your collaborators can access

Slide 23

Slide 23 text

People > Group Management UI in RStudio Connect (Admin Tools) Solutions Engineering group setup

Slide 24

Slide 24 text

Problem: Can you add me as a collaborator on this? 1. Self service code access - install.packages( "gitlink") 2. Slack Incoming Webhook integration If session$groups != solutions { Display an action button that will send me a slack alert when clicked. }

Slide 25

Slide 25 text

“Slack me if you need access” Problem: Can you add me as a collaborator on this? 1. Self service code access - install.packages( "gitlink") 2. Slack Incoming Webhook integration If session$groups != solutions { Display an action button that will send me a slack alert when clicked. }

Slide 26

Slide 26 text

“Slack me if you need (collaborator) access”

Slide 27

Slide 27 text

Action Button - Command Pattern

Slide 28

Slide 28 text

Recommendation: Create a Slack App There are a number of R packages and legacy methods you could use to talk to slack from your R code. I recommend creating a Slack App. Send data to Slack in real-time - Incoming Webhook Creating an Incoming Webhook gives you a unique URL to which you send a JSON payload with the message text and some options.

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

“Slack _me_ if you need access” - Find your slack member ID - Construct your message - Send JSON payload to Webhook URL

Slide 31

Slide 31 text

Action Button - Command Pattern message-handler.js server.R ui.R

Slide 32

Slide 32 text

Access Control Setting Group or User Conditional Solution All users, login required Group isSolutions() FALSE Element for requesting collaborator access

Slide 33

Slide 33 text

Left: Publisher view with access controls on RStudio Connect Signed in as Kelly, who is a member of solutions No button displayed Right: Vanity URL app access by a different user User is not a member of the solutions group Request Access button displayed Watch on YouTube

Slide 34

Slide 34 text

Access Control Setting Group or User Conditional Solution Anyone, no login required is.null(user()) TRUE Custom UI for anonymous viewers More Hacks for session$user Create a custom landing page for anonymous visitors and logged out users

Slide 35

Slide 35 text

Left: Publisher view with access controls on RStudio Connect Right: Custom UI for anonymous and logged-out visitors to the app Watch on YouTube

Slide 36

Slide 36 text

Code: github.com/kellobri/shiny-feature-toggle Slides: bit.ly/shiny-feature-toggle - solutions.rstudio.com - community.rstudio.com - [email protected]