60
Retrofitting Continuous Delivery A DevOps Tale

Retrofitting Continuous Delivery

Embed Size (px)

Citation preview

Page 1: Retrofitting Continuous Delivery

Retrofitting Continuous

DeliveryA DevOps Tale

Page 2: Retrofitting Continuous Delivery

Hi. I’m Alan.

Page 3: Retrofitting Continuous Delivery
Page 4: Retrofitting Continuous Delivery
Page 5: Retrofitting Continuous Delivery
Page 6: Retrofitting Continuous Delivery

betterment :

investing::

devops : engineering

Page 7: Retrofitting Continuous Delivery

Phase 1: Snowflakes

Page 8: Retrofitting Continuous Delivery
Page 9: Retrofitting Continuous Delivery

Betterment Core Applications

“brochure”

wordpressapache

phpmysql

batch(trading)

cronjava

springhibernate

mysql

webapp

apachetomcat

javaspring

hibernatemysql

Page 10: Retrofitting Continuous Delivery

Rackspace Loadbalancer

pre-prodapachetomcatmysqlhudsonjiraconfluence“warehouse”sendmailfile lockerbackup

Page 11: Retrofitting Continuous Delivery

Look at the Mess You’ve Made

● Overburdened, inflexible infrastructure from Rackspace● Only one pre-prod environment

○ And it runs five other things including Jira/Confluence/etc.● Building and deploying artifacts manually, ad-hoc, as needed

○ “Why is your trunk .war 23 bytes larger than mine?”● No Automated Functional Testing ● Deployments require downtime.● Deployments happen at 3am ET● Manual Provisioning on persistent servers

○ “This wordpress plugin needs php5.3 but we have 5.1” ● Branching (and merging) with Subversion requires significant

effort● …

Page 12: Retrofitting Continuous Delivery

yuck. so what’s the good

news?

Page 13: Retrofitting Continuous Delivery

we shipped a ton of functionality.

Page 14: Retrofitting Continuous Delivery

delivery speed faster than

innovation speed

Page 15: Retrofitting Continuous Delivery

Phase 2: Addicted to Automation

Page 16: Retrofitting Continuous Delivery

stop building features.fix what’s painful.

Page 17: Retrofitting Continuous Delivery

DevOps

Page 18: Retrofitting Continuous Delivery

fix onboarding.

Page 19: Retrofitting Continuous Delivery

boxen.

github // @jbarnette + @wfarr

Page 20: Retrofitting Continuous Delivery

mac osx+ homebrew

+ puppet+ facter

Page 21: Retrofitting Continuous Delivery

github.com/boxen/puppet-*

Page 22: Retrofitting Continuous Delivery
Page 23: Retrofitting Continuous Delivery

fix tooling.

Page 24: Retrofitting Continuous Delivery

>

Page 25: Retrofitting Continuous Delivery

$ time ant clean test deployment19m 22s

$ time gradle clean test intTest war zipJar2m 36s

(~builds/day · Δt · devs · man_days/mo)/min =

(6 · 17 · 19 · 20) / 60 = 646 hrs/mo

Page 26: Retrofitting Continuous Delivery

fix notifications & logging.

Page 27: Retrofitting Continuous Delivery
Page 28: Retrofitting Continuous Delivery

Whoa.

Page 29: Retrofitting Continuous Delivery

fix parallel workflows.

Page 30: Retrofitting Continuous Delivery
Page 31: Retrofitting Continuous Delivery

everybody loves jenkins

build open pull requests* build develop/stage/mastercobertura reports coverage

* https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin

Page 32: Retrofitting Continuous Delivery
Page 33: Retrofitting Continuous Delivery

fix crowded infrastructure.

Page 34: Retrofitting Continuous Delivery

AWS + Rackspace(sitting in a tree, N-E-T-W-O-R-K-I-N-G)

Page 35: Retrofitting Continuous Delivery
Page 36: Retrofitting Continuous Delivery

<10ms !

Page 37: Retrofitting Continuous Delivery

“canary” ec2 webapps exposed via route53

weighting

Page 38: Retrofitting Continuous Delivery

fix provisioning.

Page 39: Retrofitting Continuous Delivery

Ansible (not manual) AMIs

● Playbooks are YML that execute over SSH● Playbooks define necessary machine config

o Results in AMI creation in AWSo Returns AMI_ID

● Commit playbooks and current AMI_ID● Jenkins reads AMI_ID from build artifact

o Spins-up necessary EC2 instanceso Runs deploy playbook, unrelated to provisioning playbook

● If you need to modify a playbooko Run playbook to create new AMI_IDo Commit new playbook and AMI_ID to repo.

Page 40: Retrofitting Continuous Delivery

no more snowflakes.

Page 41: Retrofitting Continuous Delivery

everybody loves jenkins again

deploys to rackspacedeploys to ec2

bash or ansible playbooks

Page 42: Retrofitting Continuous Delivery
Page 43: Retrofitting Continuous Delivery

fix database migrations.

Page 44: Retrofitting Continuous Delivery

Flyway Database Migrations

● Looks a lot like rake db:migrateo core/src/main/resources/db/migrationso core/src/main/resources/db/cleanups

● Kept track of in a schema_versions table.

● Cleanups are promoted to migrations when develop moves to stage.

● Run as part of weekly releases.● http://flywaydb.org/

Page 45: Retrofitting Continuous Delivery

Database Subsetting with Jailer

● Walks the constraint graph from the mysql schema.

● Requires some manual intervention to cut off circular or “eager” relations.

● Exports a referentially valid subset of data.o User, Account(s), Trade(s), Etc.

● http://jailer.sourceforge.net/

Page 46: Retrofitting Continuous Delivery

Users. Duh.

Page 47: Retrofitting Continuous Delivery

+ = freshdb

subsets live in s3. download and run flyway.instant db on any branch.

Page 48: Retrofitting Continuous Delivery

eos:better-core(develop)$ ./fresh -fForcing download...Downloading fresh data... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 21.0M 100 21.0M 0 0 1004k 0 0:00:21 0:00:21 --:--:-- 1365k:setupFreshDb:setupFreshDb:complete

__ _ / _| |_ ___ ____ _ _ _| |_| | | | \ \ /\ / / _` | | | || _| | |_| |\ V V / (_| | |_| ||_| |_|\__, | \_/\_/ \__,_|\__, | |___/ by fido |___/

[stderr] INFO AbstractCLI.doMain(287) | cli_started[stderr] INFO FlywayDbMigrationCLI.executeBeforeSpring(164) | jdbc:mysql://127.0.0.1:3306/bettermentdbfresh [stderr] INFO FlywayWrapper.migrateTo(154) | Running ALL pending migrations ...[stderr] INFO ApacheCommonsLog.info(43) | Validated 146 migrations (execution time 00:00.616s)[stderr] INFO ApacheCommonsLog.info(43) | Current version of schema `bettermentdbfresh`: 20140617123653[stderr] INFO ApacheCommonsLog.info(43) | Migrating schema `bettermentdbfresh` to version 20140620132438[stderr] INFO ApacheCommonsLog.info(43) | Migrating schema `bettermentdbfresh` to version 20140620132439[stderr] INFO ApacheCommonsLog.info(43) | Migrating schema `bettermentdbfresh` to version 20140620132440[stderr] INFO ApacheCommonsLog.info(43) | Migrating schema `bettermentdbfresh` to version 20140620132441[stderr] INFO ApacheCommonsLog.info(43) | Migrating schema `bettermentdbfresh` to version 20140625091709...

Page 49: Retrofitting Continuous Delivery

ah. that’s better.now what?

Page 50: Retrofitting Continuous Delivery

Phase 3: Innovation That Scales

Page 51: Retrofitting Continuous Delivery

innovating is easy.demoing is easy.

Page 52: Retrofitting Continuous Delivery

product teams move faster than

infrastructure teams.

Page 53: Retrofitting Continuous Delivery

jruby on railsfactory girl for Javamultiple schemas

webservices

Page 54: Retrofitting Continuous Delivery

delivery speed slower than

innovation speed

Page 55: Retrofitting Continuous Delivery

DevOps

Page 56: Retrofitting Continuous Delivery

DevOps

Page 57: Retrofitting Continuous Delivery

Solution?Undercover DevOps

Page 58: Retrofitting Continuous Delivery

every team builds product features with

delivery in mind

Page 59: Retrofitting Continuous Delivery

Questions?

first one: can you start at phase 3?

Page 60: Retrofitting Continuous Delivery

[email protected]/twitter: @nonrational