SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Safely
         Deploying on
         the cutting edge
         Eric Holscher
         Urban Airship
         Djangocon 2011



Wednesday, September 7, 2011
Wednesday, September 7, 2011
Talk Contents



         •   Company culture & process
         •   Deployment environment
         •   Tools for deploying
         •   Verifying deployment




Wednesday, September 7, 2011
Process




Wednesday, September 7, 2011
Process

         •   Deploy out of git
         •   Standard git-based production/master branch model
         •   Production branch has releases are tagged with timestamp
             •   deploy-2011-08-03_14-37-38
         •   Feature branches
         •   http://nvie.com/posts/a-successful-git-branching-model/




Wednesday, September 7, 2011
Features



         •   Easily allows you to hot-fix production
         •   Keep a stable master
         •   Run CI on the master branch or long-lived feature branches




Wednesday, September 7, 2011
Services

         •   Everything that we deploy is conceptualized as a service
         •   Services all live in /mnt/services/<slug> (Thanks ec2)
         •   A service is an instance of a repository on a machine
         •   A repository might have multiple services
             •   eg. Airship deployed into “celery” and “web” services
         •   This maps really well onto Chef cookbooks




Wednesday, September 7, 2011
QA Environment


         •   Run all of your master branches
         •   Allow you to get a copy of what will become production
         •   Catch errors before they are seen by customers
         •   Spawn new ones for long-lived feature branches
         •   `host web-0` and figure out based on IP




Wednesday, September 7, 2011
Deployment Design Goals




Wednesday, September 7, 2011
Jump machine




         •   Have a standard place for all deployments to happen
         •   Log all commands run




Wednesday, September 7, 2011
No External Services



         •   Chishop
         •   No external server required to deploy code
         •   All branches are checked out on an admin server




Wednesday, September 7, 2011
Services look the same



         •   Python
         •   Java
         •   “Unix”




Wednesday, September 7, 2011
Composable




         •   Small pieces that you can build into better things
         •   Useful when trying to do something you didn’t plan for




Wednesday, September 7, 2011
Environment




Wednesday, September 7, 2011
Environment


         •   Where code lands on the remote machine
         •   Mimics a chroot
         •   Uses virtualenv & supervisord
         •   Owned by the service-user
         •   Managed by Chef




Wednesday, September 7, 2011
File Structure

         •   /mnt/services/airship
             •   bin/
             •   current -> deploy-2011-08-03_14-37-38
             •   deploy-2011-08-03_14-37-38
             •   etc/
             •   var/




Wednesday, September 7, 2011
etc/



         •   supervisord.conf
             •   [include]
             •   files = *.conf
         •   airship.conf




Wednesday, September 7, 2011
bin/



         •   start
         •   stop
         •   restart
         •   logs




Wednesday, September 7, 2011
SCRIPT_DIR=$(dirname $0)
         SERVICE_DIR=$(cd $SCRIPT_DIR && cd ../ && pwd)

         cd $SERVICE_DIR
         supervisorctl pid > /dev/null 2>&1
         if [ "$?" != "0" ]; then
              echo "Supervisord not running, starting."
              supervisord
         else
              echo "Supervisord running, starting all processes."
              supervisorctl start all
         fi
         cd - > /dev/null 2>&1




Wednesday, September 7, 2011
Bin scripts


         •   All of the process-level binscripts wrap supervisord
         •   bin/start -> supervisordctl start all
         •   bin/start foo -> supervisorctl start foo
         •   bin/stop -> supervisorctl stop all
         •   bin/stop shutdown -> supervisorctl shutdown




Wednesday, September 7, 2011
var/



         •   data/
         •   log/
         •   run/
         •   tmp/




Wednesday, September 7, 2011
Init.d



         •   All services share a common init.d script
         •   This init.d script calls into the service’s bin/
         •   /etc/init.d/airship start -> /mnt/services/airship/bin/start




Wednesday, September 7, 2011
SERVICE_USER='<%= @service %>'
         SERVICE_NAME='<%= @service %>'
         SERVICE_PATH=/mnt/services/$SERVICE_NAME
         set -e
         RET_CODE=0
         case "$1" in
              start)
                 sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/start
                 RET_CODE=$?
                 ;;
              stop)
                 sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/stop
                 RET_CODE=$?
                 ;;
              restart)
                 sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/restart
                 RET_CODE=$?
                 ;;
              status)
                 sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/status
                 RET_CODE=$?
                 ;;
              *)
                 echo "$SERVICE_NAME service usage: $0 {start|stop|restart|status}"
                 ;;
         esac

         exit $RET_CODE


Wednesday, September 7, 2011
Tools




Wednesday, September 7, 2011
Tools



         •   Fabric
         •   Rsync
         •   Pip
         •   Virtualenv




Wednesday, September 7, 2011
Low-level verbs

         •   pull
         •   build
         •   tag
         •   sync
         •   install
         •   rollback
         •   start/stop/restart/reload



Wednesday, September 7, 2011
Pull


         •   Update the code from the source repository
         •   Defaults to the “production” branch
             •   def pull(repo=None, ref='origin/production')
         •   Can pass in a specific revision/branch/tag/hashish
             •   local('git reset --hard %s' % ref, capture=False)




Wednesday, September 7, 2011
Build



         •   Could be called “prepare”
         •   Do local-specific things to get repo into a ready state
         •   Mostly used for compiling in java-land
         •   Useful in Python for running pre-install tasks




Wednesday, September 7, 2011
Tag


         •   Set a tag for the deploy in the git repo
         •   If the current commit already has a tag, use that instead
             •   git tag --contains HEAD
         •   deploy-2011-08-03_14-37-38
             •   strftime('%Y-%m-%d_%H-%M-%S')




Wednesday, September 7, 2011
Sync



         •   Move the code from the local to the remote box
         •   Uses rsync to put it into the remote service directory
         •   Also places a copy of the synced code on the admin box




Wednesday, September 7, 2011
Install



         •   Make the code the active path for code on the machine
         •   This is generally installing code into a virtualenv
         •   Updating the “current” symlink in the service directory
         •   Symlink Django settings file based on environment




Wednesday, September 7, 2011
Rollback


         •   When you break things, you need to undo quickly
         •   Reset the repository to the previous deployed tag
             •   git tag | grep deploy| sort -nr |head -2 |tail -1
         •   Deploy that
         •   Very few moving pieces




Wednesday, September 7, 2011
Start/Stop/Reload




         •   Allow you to bounce services as part of deployment
         •   Allow reload for services that support it




Wednesday, September 7, 2011
CLI UI

         •   Have nice wrapper commands that do common tasks
         •   deploy host:web-0 full_deploy:airship
             ➡ pull,           build, tag, sync, install
         •   deploy host:web-1 deploy:airship
             ➡ tag,            sync, install
         •   deploy host:web-2 sync:airship
             ➡ sync




Wednesday, September 7, 2011
UI cont.




         •   deploy host:web-0 full_deploy:airship restart:airship




Wednesday, September 7, 2011
#!/bin/bash

         cd ~/airdeploy
         DATE=$(date +%Y_%-m_%-d-%H-%m-%s)
         echo "deploy" $@ > logs/$DATE.log
         fab $@
         cd - > /dev/null 2>&1




Wednesday, September 7, 2011
Meta-commands

         •   Hard-code the correct deployment behavior
         •   “Make easy things easy, and wrong things hard”
         •   Knows what machine each service is deployed to
         •   deploy airship
             ➡ deploy          pull:airship
             ➡ deploy          type:web deploy:airship




Wednesday, September 7, 2011
Magicifying




Wednesday, September 7, 2011
Magicifying




         •   Now that we have a solid base, we can automate on top
         •   When you do a meta deploy, it should be a “smart deploy”




Wednesday, September 7, 2011
Workflow



         •   Deploy to one web server, preferably with one worker
         •   Restart it
         •   Run it against heuristics to determine if it’s broken
         •   If it’s broken, rollback, otherwise continue on




Wednesday, September 7, 2011
Heuristics

         •   Any 500s
         •   Number of 200s to non-200s
         •   Number of 500s to 200s
         •   Requests a second
         •   Response time
         •   $$$ (Business metrics)




Wednesday, September 7, 2011
How it works

         •   Tell load balancer to take machine out of pool
             •   /take_me_out_of_the_lb -> 200
         •   Start your code with 1 worker and a different port
             •   supervisorctl start canary
         •   Expose metrics from your services over json
         •   Make sure your load balancer weights it appropriately
         •   Poll your metrics for X time before considering it functional



Wednesday, September 7, 2011
Thanks



         •   Alex Kritikos
         •   Erik Onnen
         •   Schmichael




Wednesday, September 7, 2011
Questions?



         •   Eric Holscher
         •   Urban Airship (Hiring and whatnot)
         •   eric@ericholscher.com




Wednesday, September 7, 2011

Mais conteúdo relacionado

Mais procurados

PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
Graham Dumpleton
 
Investigation of testing with ansible
Investigation of testing with ansibleInvestigation of testing with ansible
Investigation of testing with ansible
Dennis Rowe
 
Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012
Toru Furukawa
 
Building a Drupal site with Git
Building a Drupal site with GitBuilding a Drupal site with Git
Building a Drupal site with Git
dirtytactics
 

Mais procurados (20)

PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
PyCon AU 2010 - Getting Started With Apache/mod_wsgi.
 
Portland PUG April 2014: Beaker 101: Acceptance Test Everything
Portland PUG April 2014: Beaker 101: Acceptance Test EverythingPortland PUG April 2014: Beaker 101: Acceptance Test Everything
Portland PUG April 2014: Beaker 101: Acceptance Test Everything
 
Ansible Crash Course
Ansible Crash CourseAnsible Crash Course
Ansible Crash Course
 
Puppet for SysAdmins
Puppet for SysAdminsPuppet for SysAdmins
Puppet for SysAdmins
 
Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)Introduction to Ansible (Pycon7 2016)
Introduction to Ansible (Pycon7 2016)
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
 
Investigation of testing with ansible
Investigation of testing with ansibleInvestigation of testing with ansible
Investigation of testing with ansible
 
Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012Trying Continuous Delivery - pyconjp 2012
Trying Continuous Delivery - pyconjp 2012
 
Auto Deploy Deep Dive – vBrownBag Style
Auto Deploy Deep Dive – vBrownBag StyleAuto Deploy Deep Dive – vBrownBag Style
Auto Deploy Deep Dive – vBrownBag Style
 
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
Building and Testing from Scratch a Puppet Environment with Docker - PuppetCo...
 
Tp install anything
Tp install anythingTp install anything
Tp install anything
 
Modern Infrastructure from Scratch with Puppet
Modern Infrastructure from Scratch with PuppetModern Infrastructure from Scratch with Puppet
Modern Infrastructure from Scratch with Puppet
 
Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...
Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...
Continuous Infrastructure: Modern Puppet for the Jenkins Project - PuppetConf...
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Building a Drupal site with Git
Building a Drupal site with GitBuilding a Drupal site with Git
Building a Drupal site with Git
 
Django Deployment with Fabric
Django Deployment with FabricDjango Deployment with Fabric
Django Deployment with Fabric
 
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Syncing up with Python’s asyncio for (micro) service development, Joir-dan GumbsSyncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
 
Puppet Camp Düsseldorf 2014: Continuously Deliver Your Puppet Code with Jenki...
Puppet Camp Düsseldorf 2014: Continuously Deliver Your Puppet Code with Jenki...Puppet Camp Düsseldorf 2014: Continuously Deliver Your Puppet Code with Jenki...
Puppet Camp Düsseldorf 2014: Continuously Deliver Your Puppet Code with Jenki...
 
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
Workshop: Know Before You Push 'Go': Using the Beaker Acceptance Test Framewo...
 
Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014Test Driven Development with Puppet - PuppetConf 2014
Test Driven Development with Puppet - PuppetConf 2014
 

Semelhante a Deploying on the cutting edge

Deployment presentation
Deployment presentationDeployment presentation
Deployment presentation
Corey Purcell
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011
Bachkoutou Toutou
 
Conquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JSConquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JS
Caridy Patino
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
Howard Greenberg
 

Semelhante a Deploying on the cutting edge (20)

Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
 
Continuous Integration/Deployment with Docker and Jenkins
Continuous Integration/Deployment with Docker and JenkinsContinuous Integration/Deployment with Docker and Jenkins
Continuous Integration/Deployment with Docker and Jenkins
 
MongoDB at Sailthru: Scaling and Schema Design
MongoDB at Sailthru: Scaling and Schema DesignMongoDB at Sailthru: Scaling and Schema Design
MongoDB at Sailthru: Scaling and Schema Design
 
TYPO3 Camp Stuttgart 2015 - Continuous Delivery with Open Source Tools
TYPO3 Camp Stuttgart 2015 - Continuous Delivery with Open Source ToolsTYPO3 Camp Stuttgart 2015 - Continuous Delivery with Open Source Tools
TYPO3 Camp Stuttgart 2015 - Continuous Delivery with Open Source Tools
 
DCRUG: Achieving Development-Production Parity
DCRUG: Achieving Development-Production ParityDCRUG: Achieving Development-Production Parity
DCRUG: Achieving Development-Production Parity
 
Deployment presentation
Deployment presentationDeployment presentation
Deployment presentation
 
Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP Applications
 
Kuby, ActiveDeployment for Rails Apps
Kuby, ActiveDeployment for Rails AppsKuby, ActiveDeployment for Rails Apps
Kuby, ActiveDeployment for Rails Apps
 
Nagios Conference 2014 - Mike Merideth - The Art and Zen of Managing Nagios w...
Nagios Conference 2014 - Mike Merideth - The Art and Zen of Managing Nagios w...Nagios Conference 2014 - Mike Merideth - The Art and Zen of Managing Nagios w...
Nagios Conference 2014 - Mike Merideth - The Art and Zen of Managing Nagios w...
 
Deployer - Deployment tool for PHP
Deployer - Deployment tool for PHPDeployer - Deployment tool for PHP
Deployer - Deployment tool for PHP
 
Django dev-env-my-way
Django dev-env-my-wayDjango dev-env-my-way
Django dev-env-my-way
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011
 
Splunk: Forward me the REST of those shells
Splunk: Forward me the REST of those shellsSplunk: Forward me the REST of those shells
Splunk: Forward me the REST of those shells
 
Maven: from Scratch to Production (.pdf)
Maven: from Scratch to Production (.pdf)Maven: from Scratch to Production (.pdf)
Maven: from Scratch to Production (.pdf)
 
Installing and Getting Started with Alfresco
Installing and Getting Started with AlfrescoInstalling and Getting Started with Alfresco
Installing and Getting Started with Alfresco
 
Continuous feature-development
Continuous feature-developmentContinuous feature-development
Continuous feature-development
 
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A CookbookJavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
 
Caridy patino - node-js
Caridy patino - node-jsCaridy patino - node-js
Caridy patino - node-js
 
Conquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JSConquistando el Servidor con Node.JS
Conquistando el Servidor con Node.JS
 
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's WorkbenchAugust Webinar - Water Cooler Talks: A Look into a Developer's Workbench
August Webinar - Water Cooler Talks: A Look into a Developer's Workbench
 

Mais de ericholscher (6)

The story and tech of Read the Docs
The story and tech of Read the DocsThe story and tech of Read the Docs
The story and tech of Read the Docs
 
Read the Docs: A completely open source Django project
Read the Docs: A completely open source Django projectRead the Docs: A completely open source Django project
Read the Docs: A completely open source Django project
 
Read the Docs
Read the DocsRead the Docs
Read the Docs
 
Large problems, Mostly Solved
Large problems, Mostly SolvedLarge problems, Mostly Solved
Large problems, Mostly Solved
 
Token Testing Slides
Token  Testing SlidesToken  Testing Slides
Token Testing Slides
 
Django Testing
Django TestingDjango Testing
Django Testing
 

Último

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Último (20)

Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 

Deploying on the cutting edge

  • 1. Safely Deploying on the cutting edge Eric Holscher Urban Airship Djangocon 2011 Wednesday, September 7, 2011
  • 3. Talk Contents • Company culture & process • Deployment environment • Tools for deploying • Verifying deployment Wednesday, September 7, 2011
  • 5. Process • Deploy out of git • Standard git-based production/master branch model • Production branch has releases are tagged with timestamp • deploy-2011-08-03_14-37-38 • Feature branches • http://nvie.com/posts/a-successful-git-branching-model/ Wednesday, September 7, 2011
  • 6. Features • Easily allows you to hot-fix production • Keep a stable master • Run CI on the master branch or long-lived feature branches Wednesday, September 7, 2011
  • 7. Services • Everything that we deploy is conceptualized as a service • Services all live in /mnt/services/<slug> (Thanks ec2) • A service is an instance of a repository on a machine • A repository might have multiple services • eg. Airship deployed into “celery” and “web” services • This maps really well onto Chef cookbooks Wednesday, September 7, 2011
  • 8. QA Environment • Run all of your master branches • Allow you to get a copy of what will become production • Catch errors before they are seen by customers • Spawn new ones for long-lived feature branches • `host web-0` and figure out based on IP Wednesday, September 7, 2011
  • 10. Jump machine • Have a standard place for all deployments to happen • Log all commands run Wednesday, September 7, 2011
  • 11. No External Services • Chishop • No external server required to deploy code • All branches are checked out on an admin server Wednesday, September 7, 2011
  • 12. Services look the same • Python • Java • “Unix” Wednesday, September 7, 2011
  • 13. Composable • Small pieces that you can build into better things • Useful when trying to do something you didn’t plan for Wednesday, September 7, 2011
  • 15. Environment • Where code lands on the remote machine • Mimics a chroot • Uses virtualenv & supervisord • Owned by the service-user • Managed by Chef Wednesday, September 7, 2011
  • 16. File Structure • /mnt/services/airship • bin/ • current -> deploy-2011-08-03_14-37-38 • deploy-2011-08-03_14-37-38 • etc/ • var/ Wednesday, September 7, 2011
  • 17. etc/ • supervisord.conf • [include] • files = *.conf • airship.conf Wednesday, September 7, 2011
  • 18. bin/ • start • stop • restart • logs Wednesday, September 7, 2011
  • 19. SCRIPT_DIR=$(dirname $0) SERVICE_DIR=$(cd $SCRIPT_DIR && cd ../ && pwd) cd $SERVICE_DIR supervisorctl pid > /dev/null 2>&1 if [ "$?" != "0" ]; then echo "Supervisord not running, starting." supervisord else echo "Supervisord running, starting all processes." supervisorctl start all fi cd - > /dev/null 2>&1 Wednesday, September 7, 2011
  • 20. Bin scripts • All of the process-level binscripts wrap supervisord • bin/start -> supervisordctl start all • bin/start foo -> supervisorctl start foo • bin/stop -> supervisorctl stop all • bin/stop shutdown -> supervisorctl shutdown Wednesday, September 7, 2011
  • 21. var/ • data/ • log/ • run/ • tmp/ Wednesday, September 7, 2011
  • 22. Init.d • All services share a common init.d script • This init.d script calls into the service’s bin/ • /etc/init.d/airship start -> /mnt/services/airship/bin/start Wednesday, September 7, 2011
  • 23. SERVICE_USER='<%= @service %>' SERVICE_NAME='<%= @service %>' SERVICE_PATH=/mnt/services/$SERVICE_NAME set -e RET_CODE=0 case "$1" in start) sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/start RET_CODE=$? ;; stop) sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/stop RET_CODE=$? ;; restart) sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/restart RET_CODE=$? ;; status) sudo su - $SERVICE_USER -c $SERVICE_PATH/bin/status RET_CODE=$? ;; *) echo "$SERVICE_NAME service usage: $0 {start|stop|restart|status}" ;; esac exit $RET_CODE Wednesday, September 7, 2011
  • 25. Tools • Fabric • Rsync • Pip • Virtualenv Wednesday, September 7, 2011
  • 26. Low-level verbs • pull • build • tag • sync • install • rollback • start/stop/restart/reload Wednesday, September 7, 2011
  • 27. Pull • Update the code from the source repository • Defaults to the “production” branch • def pull(repo=None, ref='origin/production') • Can pass in a specific revision/branch/tag/hashish • local('git reset --hard %s' % ref, capture=False) Wednesday, September 7, 2011
  • 28. Build • Could be called “prepare” • Do local-specific things to get repo into a ready state • Mostly used for compiling in java-land • Useful in Python for running pre-install tasks Wednesday, September 7, 2011
  • 29. Tag • Set a tag for the deploy in the git repo • If the current commit already has a tag, use that instead • git tag --contains HEAD • deploy-2011-08-03_14-37-38 • strftime('%Y-%m-%d_%H-%M-%S') Wednesday, September 7, 2011
  • 30. Sync • Move the code from the local to the remote box • Uses rsync to put it into the remote service directory • Also places a copy of the synced code on the admin box Wednesday, September 7, 2011
  • 31. Install • Make the code the active path for code on the machine • This is generally installing code into a virtualenv • Updating the “current” symlink in the service directory • Symlink Django settings file based on environment Wednesday, September 7, 2011
  • 32. Rollback • When you break things, you need to undo quickly • Reset the repository to the previous deployed tag • git tag | grep deploy| sort -nr |head -2 |tail -1 • Deploy that • Very few moving pieces Wednesday, September 7, 2011
  • 33. Start/Stop/Reload • Allow you to bounce services as part of deployment • Allow reload for services that support it Wednesday, September 7, 2011
  • 34. CLI UI • Have nice wrapper commands that do common tasks • deploy host:web-0 full_deploy:airship ➡ pull, build, tag, sync, install • deploy host:web-1 deploy:airship ➡ tag, sync, install • deploy host:web-2 sync:airship ➡ sync Wednesday, September 7, 2011
  • 35. UI cont. • deploy host:web-0 full_deploy:airship restart:airship Wednesday, September 7, 2011
  • 36. #!/bin/bash cd ~/airdeploy DATE=$(date +%Y_%-m_%-d-%H-%m-%s) echo "deploy" $@ > logs/$DATE.log fab $@ cd - > /dev/null 2>&1 Wednesday, September 7, 2011
  • 37. Meta-commands • Hard-code the correct deployment behavior • “Make easy things easy, and wrong things hard” • Knows what machine each service is deployed to • deploy airship ➡ deploy pull:airship ➡ deploy type:web deploy:airship Wednesday, September 7, 2011
  • 39. Magicifying • Now that we have a solid base, we can automate on top • When you do a meta deploy, it should be a “smart deploy” Wednesday, September 7, 2011
  • 40. Workflow • Deploy to one web server, preferably with one worker • Restart it • Run it against heuristics to determine if it’s broken • If it’s broken, rollback, otherwise continue on Wednesday, September 7, 2011
  • 41. Heuristics • Any 500s • Number of 200s to non-200s • Number of 500s to 200s • Requests a second • Response time • $$$ (Business metrics) Wednesday, September 7, 2011
  • 42. How it works • Tell load balancer to take machine out of pool • /take_me_out_of_the_lb -> 200 • Start your code with 1 worker and a different port • supervisorctl start canary • Expose metrics from your services over json • Make sure your load balancer weights it appropriately • Poll your metrics for X time before considering it functional Wednesday, September 7, 2011
  • 43. Thanks • Alex Kritikos • Erik Onnen • Schmichael Wednesday, September 7, 2011
  • 44. Questions? • Eric Holscher • Urban Airship (Hiring and whatnot) • eric@ericholscher.com Wednesday, September 7, 2011

Notas do Editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n
  77. \n
  78. \n
  79. \n
  80. \n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. \n
  89. \n
  90. \n
  91. \n
  92. \n
  93. \n
  94. \n
  95. \n
  96. \n
  97. \n