$30 off During Our Annual Pro Sale. View Details »

I deploy on Fridays (and maybe you should too)

Michiel Rook
February 22, 2019

I deploy on Fridays (and maybe you should too)

Have you ever heard someone say "Don’t deploy on Friday"? I used to say that too! Learn about resilience and operability, deployments, pipelines and continuous testing. Discover trunk based development, pair programming and best practices, and gain the confidence to deploy any day of the week!

Michiel Rook

February 22, 2019
Tweet

More Decks by Michiel Rook

Other Decks in Programming

Transcript

  1. I DEPLOY ON

    FRIDAYS

    (AND MAYBE YOU SHOULD TOO)
    MICHIEL ROOK

    @MICHIELTCS

    View Slide

  2. @michieltcs

    View Slide

  3. @michieltcs
    DEPLOYING

    View Slide

  4. @michieltcs
    ON A FRIDAY

    View Slide

  5. @michieltcs

    View Slide

  6. @michieltcs
    DEPLOYING?

    View Slide

  7. @michieltcs
    ON A

    FRIDAY??

    View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. View Slide

  12. @michieltcs

    View Slide

  13. @michieltcs
    BUT WHY?

    View Slide

  14. @michieltcs
    TRADITION

    View Slide

  15. @michieltcs
    RISK

    View Slide

  16. @michieltcs
    CONTROL

    View Slide

  17. @michieltcs
    CONFIDENCE
    & TRUST

    View Slide

  18. @michieltcs
    TIME TO REPAIR / RECOVER

    View Slide

  19. @michieltcs
    ON-CALL

    View Slide

  20. @michieltcs
    SO

    View Slide

  21. @michieltcs
    DON'T DEPLOY ON A FRIDAY!

    View Slide

  22. @michieltcs
    I USED TO SAY THAT TOO

    View Slide

  23. @michieltcs
    I LIKE MY WEEKENDS

    View Slide

  24. @michieltcs
    AND MY EVENINGS

    View Slide

  25. @michieltcs
    WHAT ABOUT BUGS?

    View Slide

  26. @michieltcs
    WHAT ABOUT 3 PM?

    View Slide

  27. @michieltcs
    WHAT ABOUT THURSDAY?

    View Slide

  28. @michieltcs
    FRIDAY IS 20%

    OF THE WEEK

    View Slide

  29. @michieltcs
    IMPROVE!

    View Slide

  30. @michieltcs
    IF IT HURTS

    DO IT MORE OFTEN

    View Slide

  31. @michieltcs
    FAILURE IS NOT

    THE OPPOSITE OF SUCCESS

    View Slide

  32. SUCCESS CONSISTS
    OF GOING FROM
    FAILURE TO
    FAILURE WITHOUT
    LOSS OF
    ENTHUSIASM.
    Winston Churchill

    View Slide

  33. @michieltcs
    BIG STEPS

    View Slide

  34. @michieltcs
    FAIL BIG

    View Slide

  35. @michieltcs
    SMALL STEPS

    View Slide

  36. @michieltcs
    FAIL SMALL

    View Slide

  37. @michieltcs
    MAKE IT EFFORTLESS

    View Slide

  38. @michieltcs
    REDUCE RISK

    View Slide

  39. @michieltcs
    $ = REALIZED VALUE

    CREDITS TO @FGOULDING

    View Slide

  40. @michieltcs
    CONTINUOUS EVERYTHING

    View Slide

  41. @michieltcs
    DELIVERING VALUE
    TO USERS

    View Slide

  42. @michieltcs
    SAFELY & QUICKLY

    View Slide

  43. @michieltcs
    IN A SUSTAINABLE
    WAY

    View Slide

  44. @michieltcs
    DEV BUILD / TEST ACCEPTANCE PRODUCTION
    CONTINUOUS DELIVERY

    View Slide

  45. @michieltcs
    CODE IS ALWAYS

    IN A RELEASABLE STATE

    View Slide

  46. @michieltcs
    DEV BUILD / TEST ACCEPTANCE PRODUCTION
    CONTINUOUS DEPLOYMENT

    View Slide

  47. @michieltcs
    HIGH VS. LOW PERFORMING TEAMS
    Source: Accelerate - The Science Of DevOps

    View Slide

  48. @michieltcs
    SO

    View Slide

  49. @michieltcs
    IF YOU CAN DEPLOY

    ON FRIDAY

    View Slide

  50. @michieltcs
    AT 5 PM

    View Slide

  51. @michieltcs
    YOU CAN DEPLOY

    ANY TIME

    View Slide

  52. @michieltcs
    BUT OUR CODE IS
    OLD

    View Slide

  53. @michieltcs
    BUT OUR CODE IS
    NOT UNDER TEST

    View Slide

  54. @michieltcs
    BUT OUR CODE IS
    IMPOSSIBLE TO CHANGE

    View Slide

  55. @michieltcs
    DEALING WITH "LEGACY"

    View Slide

  56. @michieltcs
    STRANGLER PATTERN

    View Slide

  57. @michieltcs
    ORIGINAL
    MONOLITH
    DB
    @michieltcs

    View Slide

  58. @michieltcs
    ORIGINAL
    MONOLITH
    PROXY
    SERVICE
    ORIGINAL
    MONOLITH
    DB
    DB
    DB
    @michieltcs

    View Slide

  59. @michieltcs
    ORIGINAL
    MONOLITH
    PROXY
    SERVICE
    ORIGINAL
    MONOLITH
    ORIGINAL
    MONOLITH
    SERVICE SERVICE
    SERVICE
    PROXY
    DB
    DB
    DB
    DB
    DB DB
    @michieltcs

    View Slide

  60. @michieltcs
    BRANCH BY ABSTRACTION

    View Slide

  61. @michieltcs
    CLIENT
    OLD
    MODULE
    CLIENT
    CLIENT
    @michieltcs

    View Slide

  62. @michieltcs
    CLIENT
    ABSTRACTION
    LAYER
    OLD
    MODULE
    CLIENT
    CLIENT
    @michieltcs

    View Slide

  63. @michieltcs
    CLIENT
    ABSTRACTION
    LAYER
    OLD
    MODULE
    CLIENT
    CLIENT
    @michieltcs

    View Slide

  64. @michieltcs
    CLIENT ABSTRACTION
    LAYER
    OLD
    MODULE
    CLIENT
    CLIENT ABSTRACTION
    LAYER
    NEW
    MODULE
    @michieltcs

    View Slide

  65. @michieltcs
    CLIENT ABSTRACTION
    LAYER
    OLD
    MODULE
    CLIENT
    CLIENT ABSTRACTION
    LAYER
    NEW
    MODULE
    @michieltcs

    View Slide

  66. @michieltcs
    CLIENT
    ABSTRACTION
    LAYER
    CLIENT
    CLIENT
    NEW
    MODULE
    @michieltcs

    View Slide

  67. @michieltcs
    CLIENT
    NEW
    MODULE
    CLIENT
    CLIENT
    @michieltcs

    View Slide

  68. @michieltcs
    ON BRANCHES

    View Slide

  69. @michieltcs
    CONFLICTS

    View Slide

  70. @michieltcs
    "This pull request affects 31 files...

    could be a lot of conflicts if we don't merge it soon"

    View Slide

  71. @michieltcs

    View Slide

  72. @michieltcs
    CONTINUOUS INTEGRATION

    View Slide

  73. @michieltcs
    INTEGRATE TO MASTER

    AT LEAST DAILY

    View Slide

  74. @michieltcs
    DELAYING INTEGRATION

    View Slide

  75. @michieltcs
    MERGING FEATURES?

    View Slide

  76. @michieltcs
    DECOUPLE

    DEPLOYMENTS FROM
    RELEASES

    View Slide

  77. @michieltcs
    FEATURE TOGGLES

    View Slide

  78. @michieltcs

    View Slide

  79. @michieltcs
    @michieltcs

    View Slide

  80. @michieltcs
    FEATURE TOGGLE DEBT

    View Slide

  81. @michieltcs
    BRANCHING STRATEGIES

    View Slide

  82. @michieltcs
    BRANCHING STRATEGIES
    1. DON'T BRANCH

    View Slide

  83. @michieltcs
    BRANCHING STRATEGIES
    1. DON'T BRANCH
    2. DON'T BRANCH

    View Slide

  84. @michieltcs
    BRANCHING STRATEGIES
    1. DON'T BRANCH
    2. DON'T BRANCH
    3. DON'T BRANCH

    View Slide

  85. @michieltcs

    View Slide

  86. @michieltcs
    TRUNK

    BASED DEVELOPMENT

    View Slide

  87. @michieltcs
    SHORT LIVED

    FEATURE BRANCHES?

    View Slide

  88. @michieltcs
    PULL REQUESTS?

    View Slide

  89. @michieltcs
    CODE REVIEWS ARE USEFUL

    View Slide

  90. @michieltcs
    BUT: FLOW DELAY

    View Slide

  91. PAIR PROGRAMMING

    View Slide

  92. @michieltcs
    CONTINUOUS INLINE

    CODE REVIEW

    View Slide

  93. MOB PROGRAMMING

    View Slide

  94. @michieltcs
    PIPELINES

    View Slide

  95. @michieltcs
    AUTOMATION

    View Slide

  96. @michieltcs
    AUTOMATION

    AUTOMATION

    View Slide

  97. @michieltcs
    AUTOMATION

    AUTOMATION

    AUTOMATION

    View Slide

  98. @michieltcs
    COMPILE
    CHECKOUT TEST PACKAGE

    View Slide

  99. @michieltcs
    COMPILE
    CHECKOUT TEST PACKAGE

    View Slide

  100. @michieltcs
    COMPILE
    CHECKOUT TEST PACKAGE

    View Slide

  101. @michieltcs
    COMPILE
    CHECKOUT TEST PACKAGE

    View Slide

  102. @michieltcs
    COMPILE
    CHECKOUT TEST PACKAGE

    View Slide

  103. @michieltcs
    DEPLOY ACC VERIFY ACC DEPLOY PROD VERIFY PROD

    View Slide

  104. @michieltcs
    DEPLOY ACC VERIFY ACC DEPLOY PROD VERIFY PROD

    View Slide

  105. @michieltcs
    DEPLOY ACC VERIFY ACC DEPLOY PROD VERIFY PROD

    View Slide

  106. @michieltcs
    DEPLOY ACC VERIFY ACC DEPLOY PROD VERIFY PROD

    View Slide

  107. @michieltcs
    DEPLOY ACC VERIFY ACC DEPLOY PROD VERIFY PROD

    View Slide

  108. @michieltcs
    CONTINUOUS TESTING

    View Slide

  109. @michieltcs
    CONTINUOUS TESTING
    UNIT TESTS
    ACCEPTANCE TESTS
    E2E

    TESTS
    Cost Speed
    INTEGRATION TESTS

    View Slide

  110. @michieltcs
    CONTINUOUS TESTING
    UNIT TESTS
    ACCEPTANCE TESTS
    E2E

    TESTS
    Cost Speed
    Exploratory

    testing & user

    feedback
    Monitoring

    & alerting
    INTEGRATION TESTS

    View Slide

  111. @michieltcs
    GOOD ENOUGH

    View Slide

  112. @michieltcs
    NO TEST SUITE
    DETECTS EVERY ISSUE

    View Slide

  113. @michieltcs
    PIPELINE SPEED = KEY

    View Slide

  114. @michieltcs
    DEPLOYMENTS

    View Slide

  115. @michieltcs
    ROLLING UPDATE

    View Slide

  116. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.0
    SERVICE V1.0
    @michieltcs

    View Slide

  117. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.0
    SERVICE V1.0
    SERVICE V1.1
    @michieltcs

    View Slide

  118. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.1
    SERVICE V1.0
    SERVICE V1.0
    @michieltcs

    View Slide

  119. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.1
    SERVICE V1.0
    SERVICE V1.1
    @michieltcs

    View Slide

  120. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.1
    SERVICE V1.1
    SERVICE V1.0
    @michieltcs

    View Slide

  121. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.0 SERVICE V1.1
    SERVICE V1.1
    SERVICE V1.1
    @michieltcs

    View Slide

  122. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.1 SERVICE V1.1
    SERVICE V1.1
    SERVICE V1.0
    @michieltcs

    View Slide

  123. @michieltcs
    LOAD BALANCER
    ROLLING UPDATE
    SERVICE V1.1 SERVICE V1.1
    SERVICE V1.1
    @michieltcs

    View Slide

  124. @michieltcs
    pipeline {

    stages {

    stage('Run tests') {

    sh "gradle check"

    }


    stage('Build docker image') {

    sh "docker build -t jobservice:${env.BUILD_NUMBER} ."

    sh "docker push jobservice:${env.BUILD_NUMBER}"

    }


    stage('Deploy staging') {

    sh "ansible-playbook -e BUILD=${env.BUILD_NUMBER}

    -i staging deploy.yml"

    }


    stage('Deploy production') {

    sh "ansible-playbook -e BUILD=${env.BUILD_NUMBER}

    -i prod deploy.yml"

    }

    }

    PIPELINE AS CODE
    image: registry.local/runner:latest


    stages:

    - test

    - images

    - deploy


    phpunit:

    stage: test

    script:

    - bin/phpunit


    images:

    stage: images

    script:

    - make images publish

    only:

    - master


    deploy:

    stage: deploy

    script:

    - make deploy

    only:

    - master

    View Slide

  125. @michieltcs
    BUILD PIPELINE
    @michieltcs

    View Slide

  126. @michieltcs
    FEEDBACK!

    View Slide

  127. @michieltcs
    DEPLOYING

    View Slide

  128. @michieltcs
    ON A FRIDAY

    View Slide

  129. @michieltcs
    YOU CAN DO IT TOO!

    View Slide

  130. @michieltcs
    THANK YOU FOR LISTENING!
    @michieltcs / [email protected]
    www.michielrook.nl

    View Slide