continuous deployment at scale, rootconf 2016

144
Scale Deployment continuous at @premshree rootconf 2016

Upload: premshree-pillai

Post on 20-Feb-2017

428 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Continuous Deployment at Scale, Rootconf 2016

Scale

Deploymentcontinuous

at

@premshreerootconf 2016

Page 2: Continuous Deployment at Scale, Rootconf 2016
Page 3: Continuous Deployment at Scale, Rootconf 2016

1.6 million active sellers

24 million active buyers

$2.39 billion GMS (2015)

819 employees

Page 4: Continuous Deployment at Scale, Rootconf 2016

Premshree PillaiSr. Engineer, Etsy

Page 5: Continuous Deployment at Scale, Rootconf 2016

ಹ"ೕ

Page 6: Continuous Deployment at Scale, Rootconf 2016

ಹ"ೕ(hello)

Page 7: Continuous Deployment at Scale, Rootconf 2016

principles

q & a

tooling + culture

Page 8: Continuous Deployment at Scale, Rootconf 2016

principles

Page 9: Continuous Deployment at Scale, Rootconf 2016

just ship

Page 10: Continuous Deployment at Scale, Rootconf 2016

enable innovation

Page 11: Continuous Deployment at Scale, Rootconf 2016

enable innovation(you are creating products, not code)

Page 12: Continuous Deployment at Scale, Rootconf 2016

optimize for purpose

Page 13: Continuous Deployment at Scale, Rootconf 2016

optimize for purpose

Page 14: Continuous Deployment at Scale, Rootconf 2016

optimize for autonomy

Page 15: Continuous Deployment at Scale, Rootconf 2016

optimize for mastery

Page 16: Continuous Deployment at Scale, Rootconf 2016

experimentation

Page 17: Continuous Deployment at Scale, Rootconf 2016

experimentationA/B testing

Page 18: Continuous Deployment at Scale, Rootconf 2016

quick iteration

Page 19: Continuous Deployment at Scale, Rootconf 2016

quick iteration(improving products/features)

Page 20: Continuous Deployment at Scale, Rootconf 2016

quick iteration(fail fast > stagnant code)

Page 21: Continuous Deployment at Scale, Rootconf 2016

continuous improvement

Page 22: Continuous Deployment at Scale, Rootconf 2016

low MTTR

Page 23: Continuous Deployment at Scale, Rootconf 2016

tooling

Page 24: Continuous Deployment at Scale, Rootconf 2016

continuous deployment

continuous delivery/

Page 25: Continuous Deployment at Scale, Rootconf 2016

commit

Page 26: Continuous Deployment at Scale, Rootconf 2016

commit build

Page 27: Continuous Deployment at Scale, Rootconf 2016

commit build tests

Page 28: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests

Page 29: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

Page 30: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

Page 31: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

Page 32: Continuous Deployment at Scale, Rootconf 2016

frequent check-ins

Page 33: Continuous Deployment at Scale, Rootconf 2016

frequent check-ins(to master!)

Page 34: Continuous Deployment at Scale, Rootconf 2016

frequent check-insbranching in code

Page 35: Continuous Deployment at Scale, Rootconf 2016

Feature

Page 36: Continuous Deployment at Scale, Rootconf 2016

Featuregithub.com/etsy/feature

Page 37: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 'on'];

Page 38: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 'off'];

Page 39: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 1];

Page 40: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 1, 'bucketing' => 'user'];

Page 41: Continuous Deployment at Scale, Rootconf 2016

if (Feature::isEnabled('my_feature') {!}

Page 42: Continuous Deployment at Scale, Rootconf 2016

if (Feature::isEnabledFor('my_feature', $user) {!}

Page 43: Continuous Deployment at Scale, Rootconf 2016

Experimentation

Page 44: Continuous Deployment at Scale, Rootconf 2016

ExperimentationA/B testing

Page 45: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 'on'];

Page 46: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => [ 'layout1' => 1, 'layout2' => 3, 'layout3' => 3 ]];

Page 47: Continuous Deployment at Scale, Rootconf 2016

if (Feature::isEnabled('my_feature')) { switch (Feature::variant('my_feature')) { case 'layout1': // layout1 code break; case 'layout2': // layout2 code break; }}

Page 48: Continuous Deployment at Scale, Rootconf 2016

continuous integration

Page 49: Continuous Deployment at Scale, Rootconf 2016

continuous integration(and automated tests)

Page 50: Continuous Deployment at Scale, Rootconf 2016

keep the build green

Page 51: Continuous Deployment at Scale, Rootconf 2016
Page 52: Continuous Deployment at Scale, Rootconf 2016

ready to release

Page 53: Continuous Deployment at Scale, Rootconf 2016

ready to releaseanytime

Page 54: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

try

Page 55: Continuous Deployment at Scale, Rootconf 2016

Try

Page 56: Continuous Deployment at Scale, Rootconf 2016

Try(before you commit)

Page 57: Continuous Deployment at Scale, Rootconf 2016

TryLib

Page 58: Continuous Deployment at Scale, Rootconf 2016

TryLibgithub.com/etsy/TryLib

Page 59: Continuous Deployment at Scale, Rootconf 2016
Page 60: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

try deployinator

Page 61: Continuous Deployment at Scale, Rootconf 2016

Deployinator

Page 62: Continuous Deployment at Scale, Rootconf 2016

Deployinatorgithub.com/etsy/deployinator

Page 63: Continuous Deployment at Scale, Rootconf 2016
Page 64: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

try deployinator ci/jenkins

Page 65: Continuous Deployment at Scale, Rootconf 2016
Page 66: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

try deployinator ci/jenkins manual tests

Page 67: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

try deployinator ci/jenkins manual tests deploy

Page 68: Continuous Deployment at Scale, Rootconf 2016
Page 69: Continuous Deployment at Scale, Rootconf 2016
Page 70: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests release

Page 71: Continuous Deployment at Scale, Rootconf 2016

commit build tests user tests princess prod

Page 72: Continuous Deployment at Scale, Rootconf 2016

anybody can push

Page 73: Continuous Deployment at Scale, Rootconf 2016

http://www.flickr.com/photos/zsqr0000/5269002895

Page 74: Continuous Deployment at Scale, Rootconf 2016

be anxious

Page 75: Continuous Deployment at Scale, Rootconf 2016

… but do not fear

Page 76: Continuous Deployment at Scale, Rootconf 2016

dev /

ops

Page 77: Continuous Deployment at Scale, Rootconf 2016

♥dev /

ops

Page 78: Continuous Deployment at Scale, Rootconf 2016

dark changes

Page 79: Continuous Deployment at Scale, Rootconf 2016

template changes css tweaks unreferenced code

Page 80: Continuous Deployment at Scale, Rootconf 2016
Page 81: Continuous Deployment at Scale, Rootconf 2016

config pushes

Page 82: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 1, 'bucketing' => 'user'];

Page 83: Continuous Deployment at Scale, Rootconf 2016

$server_config['my_feature'] = [ 'enabled' => 50, 'bucketing' => 'user'];

Page 84: Continuous Deployment at Scale, Rootconf 2016

push train

Page 85: Continuous Deployment at Scale, Rootconf 2016
Page 86: Continuous Deployment at Scale, Rootconf 2016
Page 87: Continuous Deployment at Scale, Rootconf 2016

premshree> .join

john

Page 88: Continuous Deployment at Scale, Rootconf 2016

john + premshree

premshree>

Page 89: Continuous Deployment at Scale, Rootconf 2016

john + premshree

premshree> .good

Page 90: Continuous Deployment at Scale, Rootconf 2016

john + premshree

premshree> .bueno

Page 91: Continuous Deployment at Scale, Rootconf 2016

john + premshree*

premshree>

Page 92: Continuous Deployment at Scale, Rootconf 2016

john + premshree*

sally> .join

Page 93: Continuous Deployment at Scale, Rootconf 2016

john + premshree* | sally

sally>

Page 94: Continuous Deployment at Scale, Rootconf 2016

push train(with PushBot)

Page 95: Continuous Deployment at Scale, Rootconf 2016

push traingithub.com/etsy/pushbot

Page 96: Continuous Deployment at Scale, Rootconf 2016

post-deploy

Page 97: Continuous Deployment at Scale, Rootconf 2016

post-deploy(gaining confidence)

Page 98: Continuous Deployment at Scale, Rootconf 2016

supergrep

Page 99: Continuous Deployment at Scale, Rootconf 2016

supergrepgithub.com/etsy/supergrep

Page 100: Continuous Deployment at Scale, Rootconf 2016
Page 101: Continuous Deployment at Scale, Rootconf 2016
Page 102: Continuous Deployment at Scale, Rootconf 2016

dashboards

Page 103: Continuous Deployment at Scale, Rootconf 2016

dashboards(deploy)

Page 104: Continuous Deployment at Scale, Rootconf 2016
Page 105: Continuous Deployment at Scale, Rootconf 2016
Page 106: Continuous Deployment at Scale, Rootconf 2016

push

Page 107: Continuous Deployment at Scale, Rootconf 2016

dashboards(app)

Page 108: Continuous Deployment at Scale, Rootconf 2016
Page 109: Continuous Deployment at Scale, Rootconf 2016

StatsD + Graphite

Page 110: Continuous Deployment at Scale, Rootconf 2016

StatsD + Graphitegithub.com/etsy/statsd

Page 111: Continuous Deployment at Scale, Rootconf 2016

summary

Page 112: Continuous Deployment at Scale, Rootconf 2016

pre-flight check

ready to push

ready to deploy

testing/verification

confidence

Page 113: Continuous Deployment at Scale, Rootconf 2016

pre-flight check

ready to push

ready to deploy

testing/verification

confidence

try/git hooks

push train/irc

deployinator

user testing

supergrep/dashboards

Page 114: Continuous Deployment at Scale, Rootconf 2016

https://www.flickr.com/photos/saschaaa/152502539/

Page 115: Continuous Deployment at Scale, Rootconf 2016

poka-yokeポカヨケ

Page 116: Continuous Deployment at Scale, Rootconf 2016

culture

Page 117: Continuous Deployment at Scale, Rootconf 2016
Page 118: Continuous Deployment at Scale, Rootconf 2016

assume best intentions

Page 119: Continuous Deployment at Scale, Rootconf 2016

cultivate empathy

Page 120: Continuous Deployment at Scale, Rootconf 2016

open

Page 121: Continuous Deployment at Scale, Rootconf 2016

failure is an option

Page 122: Continuous Deployment at Scale, Rootconf 2016

failure is an option(but not our intention)

Page 123: Continuous Deployment at Scale, Rootconf 2016

failure is an option(we strongly want NOT to fail)

Page 124: Continuous Deployment at Scale, Rootconf 2016

failure is an opportunity

Page 125: Continuous Deployment at Scale, Rootconf 2016

post-mortems

Page 126: Continuous Deployment at Scale, Rootconf 2016

blameless post-mortems

Page 127: Continuous Deployment at Scale, Rootconf 2016

+ remediation

Page 128: Continuous Deployment at Scale, Rootconf 2016

morgue

Page 129: Continuous Deployment at Scale, Rootconf 2016
Page 130: Continuous Deployment at Scale, Rootconf 2016
Page 131: Continuous Deployment at Scale, Rootconf 2016

morguegithub.com/etsy/morgue

Page 132: Continuous Deployment at Scale, Rootconf 2016
Page 133: Continuous Deployment at Scale, Rootconf 2016

mixer

Page 134: Continuous Deployment at Scale, Rootconf 2016

mixergithub.com/etsy/mixer

Page 135: Continuous Deployment at Scale, Rootconf 2016

culture + tooling

deploy

fail ok

post-mortem

remediationstimulii

Page 136: Continuous Deployment at Scale, Rootconf 2016
Page 137: Continuous Deployment at Scale, Rootconf 2016

deploys

Page 138: Continuous Deployment at Scale, Rootconf 2016

30+ deploys

Page 139: Continuous Deployment at Scale, Rootconf 2016

30+ config deploys

Page 140: Continuous Deployment at Scale, Rootconf 2016

codeascraft.com

Page 141: Continuous Deployment at Scale, Rootconf 2016

fin

Page 142: Continuous Deployment at Scale, Rootconf 2016

ಧನ&'ದಗ*.

Page 143: Continuous Deployment at Scale, Rootconf 2016

ಧನ&'ದಗ*.(thanks.)