Top Banner
12 Factor App Best Practices for JRuby Deployment
84
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 12-factor-jruby

12 Factor AppBest Practices for JRuby Deployment

Page 2: 12-factor-jruby

Joe Kutner@codefinger

JVM Platform Owner@Heroku

Joe Kutner

Page 3: 12-factor-jruby

deployment, deployment, deployment, deployment

Page 4: 12-factor-jruby

This book is wrong now!

Page 5: 12-factor-jruby

.war

Traditional Deployment

Page 6: 12-factor-jruby

.jar

Modern Deployment

Page 7: 12-factor-jruby

Make JAR

Not WAR

Page 8: 12-factor-jruby

2005 2015

WAR files JAR files

App Servers Microservices

Hot Deploy Continuous Deploy

Server in a closet Heroku/AWS/etc

Page 9: 12-factor-jruby
Page 10: 12-factor-jruby

12 Factor Appa methodology

ScalabilityMaintainability

Portability

Page 11: 12-factor-jruby

• Immutable• Ephemeral• Declarative• Automated

Page 12: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 13: 12-factor-jruby

Thank You!Goodbye!

(just kidding)

Page 14: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 15: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 16: 12-factor-jruby

Use Version Control

Page 17: 12-factor-jruby
Page 18: 12-factor-jruby
Page 19: 12-factor-jruby

BAD

Page 20: 12-factor-jruby

BAD

App #1 App #2

Page 21: 12-factor-jruby

Submodules

Page 22: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 23: 12-factor-jruby

Never rely on implicit existence of system-wide

packages

Explicitly declare and isolate

dependencies

Page 24: 12-factor-jruby

Don’t check JAR files into Git

Page 25: 12-factor-jruby
Page 26: 12-factor-jruby

JBundler

Page 27: 12-factor-jruby

Jarfile

jar 'org.yaml:snakeyaml'jar 'org.slf4j:slf4j-simple', '>1.1'

Page 28: 12-factor-jruby

$ gem install jbundler...

$ jbundle install...

$ jbundle console...

Page 29: 12-factor-jruby

server.rb

require 'jbundler'

java_import 'org.slf4j.Logger'

Page 30: 12-factor-jruby

$ jbundle install --vendor...

$ tree vendor/jars/vendor/jars/!"" io#   $"" netty#   $"" netty-all#   $"" 4.0.28.Final#   $"" netty-all-4.0.28.Final.jar$"" jbundler.rb

4 directories, 2 files

Page 31: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 32: 12-factor-jruby

• Resource handles to the database, Memcached, and other backing services

• Credentials to external services such as Amazon S3 or Twitter

• Per-deploy values such as the canonical hostname for the deploy

Anything that changes between deployment environments:

(does not include things like config/routes.rb)

Configuration is…

Page 33: 12-factor-jruby

Configuration should be strictly separated

from code

Page 34: 12-factor-jruby

Don’t check passwords into Git

Page 35: 12-factor-jruby
Page 36: 12-factor-jruby

Can you make your app open source at any moment, without compromising

any credentials?

Litmus Test

Page 37: 12-factor-jruby

Configuration belongs in the environment,

not in the application

Page 38: 12-factor-jruby

database.yml

dev: username: everyone password: 1234567 …

test: username: everyone password: 1234567 …

production: username: admin password: 89haiusdf90fasd ...

BAD

Page 39: 12-factor-jruby

database.yml

production: url: <%= ENV['DATABASE_URL']%>

GOOD

Page 40: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 41: 12-factor-jruby
Page 42: 12-factor-jruby

database.yml

production: url: <%= ENV['DATABASE_URL']%>

Page 43: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 44: 12-factor-jruby

build, release, run

Page 45: 12-factor-jruby

$ jrubyc ...

$ rake assets:precompile

$ warble executable war

$ ./gradlew build

build

Page 46: 12-factor-jruby

$ heroku deploy:jar -j myapp.war

$ mvn heroku:deploy

$ scp myapp.war prod-server:~

$ docker push ...

release

Page 47: 12-factor-jruby

$ java -jar myapp.war

$ bundle exec puma ...

run

$ /var/tomcat/start.sh

$ service tomcat start

$ torquebox start

Page 48: 12-factor-jruby

$ git push heroku masterbuild,

release,& run

Page 49: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 50: 12-factor-jruby

DEMO!

Page 51: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 52: 12-factor-jruby

Processes should be stateless

Page 53: 12-factor-jruby

sticky sessions 😞

Page 54: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 55: 12-factor-jruby

The twelve-factor app is completely self-contained

The web app exports HTTP as a service by binding to a port

Page 56: 12-factor-jruby

.war

Traditional Deployment

Page 57: 12-factor-jruby

.jar

Modern Deployment

Page 58: 12-factor-jruby

Dropwizard

Page 59: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 60: 12-factor-jruby

GIL

RELAX BRO, I GOT THIS…

Page 61: 12-factor-jruby

Scale Up

Scale Out

Page 62: 12-factor-jruby

web.1

web.2

worker.1 clock.1

Workload Diversity

Num

ber o

f Pro

cess

es

worker.2

worker.3

Page 63: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 64: 12-factor-jruby

Graceful shutdown

Quick startup

Resilience to failure

Page 65: 12-factor-jruby

Servers are not pets

Servers are cattle

Page 66: 12-factor-jruby

Application Servers are not disposable

Page 67: 12-factor-jruby

Microservices are disposable

Page 68: 12-factor-jruby

Easy to replace

Decoupled from external infrastructure

Easy to modify

Page 69: 12-factor-jruby

Microservices

Page 70: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 71: 12-factor-jruby

dev

sqlite

postgres

stage

mysql

postgres

prod

postgres

postgres

=

=

=

=

Page 72: 12-factor-jruby

dev

webrick

puma

stage

puma

puma

prod

unicorn

puma

=

=

=

=

Page 73: 12-factor-jruby

disposable

⇒reproducible

parity⇒

Page 74: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 75: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 76: 12-factor-jruby

Admin tasks should be run in isolated processes

Page 77: 12-factor-jruby

$ heroku run jirbRunning `rails console` attached to terminal... up, run.1594Loading production environment (Rails 4.1.4)irb(main):001:0>

Page 78: 12-factor-jruby

web1

web2

web3

admin

Page 79: 12-factor-jruby

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 80: 12-factor-jruby

http://12factor.net

http://jkutner.github.io

Page 81: 12-factor-jruby

warble executable war1.

gem install jbundle2.

Remove all passwords3.

Kill your app. Then restart it. Time it.4.

What next?

Page 82: 12-factor-jruby

Joe Kutner@codefinger

JVM Platform Owner@Heroku

http://www.slideshare.net/jkutner/12-factor-jruby

Page 83: 12-factor-jruby
Page 84: 12-factor-jruby