SlideShare a Scribd company logo
Deploying your apps.. the right way!
Robbert van den Bogerd
June 8th, 2013
Introduction
whoami
Developer at Ibuildings
Web enthusiast
Traveller
The Average Joe
Disclaimer
DEPLOYMENT
So what are we here for?
TOC
Horror stories
Common pitfalls
What we want
Deployment from beginning to end
Integration tools
Horror stories
Horror stories
FTP: Forever Taking Process
Horror stories
Rsync: for oldschool sysadmins
Horror stories
Versioning checkout
Horror stories
Teamviewer: REALLY?
Problems & solutions
Common pitfalls
Manual operations
Sloow deployment process
Downtime
Cache
Migrations
No turning back
Manual operations
No!
The Bus Factor
Anyplace, anywhere, anytime
Confidence
No turning back
Zero downtime
No more UC pages!
Quick deploys
Smaller releases
Automate
Cache
Migrations
Common pitfalls
Manual operations
Sloow deployment process
Downtime
Cache
Migrations
No turning back
What we want
Manual operations Automation
Sloow deployments Quick rollouts
Zero Downtime
Cache warmed up
Migrations
No turning back Rollbacks
From the beginning..
“Victorious warriors first win
and then go to war”
- Sun Tzu
Think before you (sign a contr)act!
Managing expectations
Customer
Users
Project manager
Devs/testers
Deployment strategy
Release cycle
Server setup
Branching strategy
Tools to use
DTAP
So, let's cut to the point..
Use git
Seriously, use git!
Reliable
Super fast
Easy branching/merging
Distributed
Github:
Awesome ui
Extra's
PR's
Integration with existing deployment tools
Dependency management
Framework
Libraries
Build/QA tools
Company private repo's
Drumroll please..
Composer
Migrations
Write your own script
Use one of the great existing ones:
- Doctrine migrations
- DbPatch
- Shipped with your framework/orm?
Backups
Always create one!
..
unless it's not possible =]
Deployment talk dpc 13
Directory structure
/var/www/rule34/
/var/www/rule34/releases
/var/www/rule34/releases/20130606143000
/var/www/rule34/releases/20130606143400
Live www dir:
/var/www/rule34/current > releases/20130606143400
Deployment script
> Do a backup
> Create new directory
> Update your code
> Update dependencies
> Run migrations
> Warmup cache
> ...
Let's start scripting!
Wait a second..
Existing tools
Fabric
Phing/Ant
Chef
Capistrano
Capistrano
Powerful
Easy setup
Event/task based, easy to hook into
Written in ruby
Multiple servers
Multistage extension
Capifony
The power of Capistrano
Pre-configured for Symfony
Deploy with 1 single config file
Setup
Local setup
gem install capifony
cd /var/www/rule34/
capifony install .
Capifony config
# app/config/deploy.rb
set :application, "My App"
set :deploy_to, "/var/www/my-app.com"
set :domain, "my-app.com"
set :scm, :git
set :repository, "ssh-gitrepo-domain.com:/path/to/repo.git"
Remote setup
cd /var/www/rule34/
cap deploy:setup
Deploy
Capifony deploy
cd /var/www/rule34/
cap deploy
# made a boo-boo?
cap deploy:rollback
Configuration
set :model_manager, "doctrine"
Configuration
set :update_vendors, false
set :use_composer, true
set :vendors_mode, "install"
Configuration
set :dump_assetic_assets, true
Configuration
set :shared_children, [app_path+"/logs", "data"]
set :writable_dirs, [app_path+"/logs", app_path+"/cache", "data"]
Directory structure
/var/www/rule34/releases
/shared
/shared/data
/shared/app/logs
Symlink:
/var/www/rule34/releases/20130606143400/data > ../../shared/data
DTAP
Multistaging
# app/config/deploy.rb
require 'capistrano/ext/multistage'
set :stages, %w(prod acc test dev)
set :default_stage, "test"
set :stage_dir, "app/config/deploy/stages"
# app/config/deploy/stages/test.rb
server 'rule34.mytestserver.com'
set :symfony_env_prod, "test"
User permissions
set :use_sudo, false
set :user, "deployment"
set :group, "www-data"
set :webserver_user, "www-data"
:use_set_permissions, true
:permission_method, “chmod” # or “acl” or “chown”
Maintenance page
cap deploy:web:disable 
REASON="hardware upgrade" 
UNTIL="12pm Central Time"
# override template
set :maintenance_template_path, “app/Resources/uc.html”
Tips 'n Tricks
# determine tag/branch/commit/sha1 on the fly
set :branch do
default_tag = `git describe --abbrev=0 --tags`.split("n").last
tag = Capistrano::CLI.ui.ask "Tag/branch to deploy (make sure to
push the tag first): [#{default_tag}] "
tag = default_tag if tag.empty?
tag
end
Tips 'n Tricks
# enable ssh client interaction
default_run_options[:pty] = true
Tips 'n Tricks
# enable agent forwarding
ssh_options[:forward_agent] = true
Tips 'n Tricks
# cleanup old release dirs automatically
set :keep_releases, 3
after "deploy", "deploy:cleanup"
Tips 'n Tricks
# run doctrine migrations after code update
after “update_code”, “doctrine:migrations:migrate”
Tips 'n Tricks
# run any symfony console command
before “any_task”, “symfony:cache:clear”
What's next?
System provisioning
Upgrade PHP 5.3 > 5.4
Upgrade MySql
Install Redis
Install Node.js
Etc..
Chef
Version control your infrastructure
Identical environments
Integration with Vagrant
Chef
# run chef after code update
after “update_code”, “provision”
task :provision do
end
Chef
# run chef after code update
after “update_code”, “provision”
task :provision do
run "#{sudo} chef-solo -c
#{release_path}/chef/config.rb
#{release_path}/chef/chef_#{stage}.json"
end
Vagrant
Build automation
Jenkins
The end result
Deployment talk dpc 13
Deployment talk dpc 13
The usual stuff
Twitter: @nickedname
Joind.in: https://joind.in/8461
Further reading
“A basic git capistrano workflow”
http://labs.headshift.com/2012/02/29/a-basic-gitcapistrano-workflow/
“A successful git branching model”
http://nvie.com/posts/a-successful-git-branching-model/
The dbPatch project
http://www.dbpatch-project.com/
“Continuous deployment with symfony2, jenkins and capifony”
http://jeremycook.ca/2012/11/04/continuous-deployment-with-symfony2-jenkin
“Software branching and parallel universes”
http://www.codinghorror.com/blog/2007/10/software-branching-and-parallel-un

More Related Content

PDF
Chaos patterns - architecting for failure in distributed systems
PPTX
Continuous deployment
PDF
Rebooting a Cloud
KEY
Tools that help and speed up RWD dev
PPTX
CSS Regression Tests
PDF
Workflow para desenvolvimento Web & Mobile usando grunt.js
PDF
Yeoman Workflow
PDF
Tooling per il tema in Drupal 8
Chaos patterns - architecting for failure in distributed systems
Continuous deployment
Rebooting a Cloud
Tools that help and speed up RWD dev
CSS Regression Tests
Workflow para desenvolvimento Web & Mobile usando grunt.js
Yeoman Workflow
Tooling per il tema in Drupal 8

What's hot (19)

PPTX
Vagrant WordCamp Hamilton
PPTX
Hybrid app
PDF
Advanced front-end automation with npm scripts
PPTX
Building a PWA - For Everyone Who Is Scared To
PDF
PWA Roadshow Korea - Service Worker
PPT
SXSW 2012 JavaScript MythBusters
PDF
Full stack, Full run, Full test
PDF
Testing Mobile JavaScript
PPTX
Introduction aux progressive web apps
PDF
Quest for the Perfect Workflow for McrFRED
PPTX
Introduction to using Grunt & Bower with WordPress theme development
PDF
Profiling PHP with Xdebug / Webgrind
PDF
CasperJS and PhantomJS for Automated Testing
PDF
Using Vagrant for Local WordPress Development
PDF
Cake Php 101 Brownbag
PDF
Front end workflow with yeoman
KEY
Rapid Testing, Rapid Development
PPTX
Writing Performant Front-end Code
PDF
Bower & Grunt - A practical workflow
Vagrant WordCamp Hamilton
Hybrid app
Advanced front-end automation with npm scripts
Building a PWA - For Everyone Who Is Scared To
PWA Roadshow Korea - Service Worker
SXSW 2012 JavaScript MythBusters
Full stack, Full run, Full test
Testing Mobile JavaScript
Introduction aux progressive web apps
Quest for the Perfect Workflow for McrFRED
Introduction to using Grunt & Bower with WordPress theme development
Profiling PHP with Xdebug / Webgrind
CasperJS and PhantomJS for Automated Testing
Using Vagrant for Local WordPress Development
Cake Php 101 Brownbag
Front end workflow with yeoman
Rapid Testing, Rapid Development
Writing Performant Front-end Code
Bower & Grunt - A practical workflow

Viewers also liked (8)

PDF
Symfony2: Get your project started
PDF
Advanced symfony Techniques
PDF
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
PDF
Keeping the frontend under control with Symfony and Webpack
PDF
TechLeads meetup: Макс Лапшин, Erlyvideo
PPTX
TechLeads meetup: Евгений Потапов, ITSumma
PDF
TechLeads meetup: Алексей Рыбак, Badoo
PPTX
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru
Symfony2: Get your project started
Advanced symfony Techniques
Moje první aplikace v Symfony 3 + překvapení (4. sraz přátel Symfony v Praze)
Keeping the frontend under control with Symfony and Webpack
TechLeads meetup: Макс Лапшин, Erlyvideo
TechLeads meetup: Евгений Потапов, ITSumma
TechLeads meetup: Алексей Рыбак, Badoo
TechLeads meetup: Андрей Шелёхин, Tinkoff.ru

Similar to Deployment talk dpc 13 (20)

PDF
Rock Solid Deployment of Web Applications
PDF
DevOps For Small Teams
PDF
Midwest PHP 2017 DevOps For Small team
PPTX
Groovy for System Administrators
PDF
ZendCon 2015 - DevOps for Small Teams
PDF
Madison PHP 2015 - DevOps For Small Teams
PPTX
drupal ci cd concept cornel univercity.pptx
PDF
Seven steps to better security
PPTX
Raising ux bar with offline first design
PDF
Continuous Deployment: The Dirty Details
PDF
Pyramid Deployment and Maintenance
PDF
Development Setup of B-Translator
PDF
Deploying Symfony | symfony.cat
PPTX
Advanced deployment scenarios
ODP
Capifony. Minsk PHP MeetUp #11
PPTX
Advanced deployment scenarios (netcoreconf)
PDF
Introducing RaveJS: Spring Boot concepts for JavaScript applications
ODP
Django on Jython, PyCon 2009
PDF
Zero-config JavaScript apps with RaveJS -- SVCC fall 2014
PDF
Google App Engine for Java v0.0.2
Rock Solid Deployment of Web Applications
DevOps For Small Teams
Midwest PHP 2017 DevOps For Small team
Groovy for System Administrators
ZendCon 2015 - DevOps for Small Teams
Madison PHP 2015 - DevOps For Small Teams
drupal ci cd concept cornel univercity.pptx
Seven steps to better security
Raising ux bar with offline first design
Continuous Deployment: The Dirty Details
Pyramid Deployment and Maintenance
Development Setup of B-Translator
Deploying Symfony | symfony.cat
Advanced deployment scenarios
Capifony. Minsk PHP MeetUp #11
Advanced deployment scenarios (netcoreconf)
Introducing RaveJS: Spring Boot concepts for JavaScript applications
Django on Jython, PyCon 2009
Zero-config JavaScript apps with RaveJS -- SVCC fall 2014
Google App Engine for Java v0.0.2

Recently uploaded (20)

PDF
Getting Started with Data Integration: FME Form 101
PDF
2021 HotChips TSMC Packaging Technologies for Chiplets and 3D_0819 publish_pu...
PDF
A comparative study of natural language inference in Swahili using monolingua...
PDF
NewMind AI Weekly Chronicles – August ’25 Week III
PDF
Enhancing emotion recognition model for a student engagement use case through...
PPTX
O2C Customer Invoices to Receipt V15A.pptx
PDF
Hybrid model detection and classification of lung cancer
PDF
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PPTX
Modernising the Digital Integration Hub
PPTX
Final SEM Unit 1 for mit wpu at pune .pptx
PDF
TrustArc Webinar - Click, Consent, Trust: Winning the Privacy Game
PDF
DP Operators-handbook-extract for the Mautical Institute
PDF
STKI Israel Market Study 2025 version august
PDF
Zenith AI: Advanced Artificial Intelligence
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
PDF
WOOl fibre morphology and structure.pdf for textiles
PDF
Getting started with AI Agents and Multi-Agent Systems
Getting Started with Data Integration: FME Form 101
2021 HotChips TSMC Packaging Technologies for Chiplets and 3D_0819 publish_pu...
A comparative study of natural language inference in Swahili using monolingua...
NewMind AI Weekly Chronicles – August ’25 Week III
Enhancing emotion recognition model for a student engagement use case through...
O2C Customer Invoices to Receipt V15A.pptx
Hybrid model detection and classification of lung cancer
ENT215_Completing-a-large-scale-migration-and-modernization-with-AWS.pdf
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Modernising the Digital Integration Hub
Final SEM Unit 1 for mit wpu at pune .pptx
TrustArc Webinar - Click, Consent, Trust: Winning the Privacy Game
DP Operators-handbook-extract for the Mautical Institute
STKI Israel Market Study 2025 version august
Zenith AI: Advanced Artificial Intelligence
NewMind AI Weekly Chronicles - August'25-Week II
cloud_computing_Infrastucture_as_cloud_p
DASA ADMISSION 2024_FirstRound_FirstRank_LastRank.pdf
WOOl fibre morphology and structure.pdf for textiles
Getting started with AI Agents and Multi-Agent Systems

Deployment talk dpc 13

Editor's Notes

  • #5: This talk is heavily opinionated. All tools mentioned could be replaced by alternatives, but I'll show you some tools and techniques which I consider best for the job. This is not a talk about continuous deployment, although most of the ideas and best practices shown are part of the concept.
  • #9: FTP is a great protocol for transferring (large) files between computers, but what it's not so great for is deploying your 25000 files counting web project from your 2mb/s home network while your web visitors are waiting for it to finish.
  • #14: Obviously, we would all prefer to never take our website down, not even when updating. But in practice most developers find it acceptable and even customers don't find it odd that their website is down for maintenance (when announced on beforehand of course). But, ideally, our customers and, more importantly, their customers should have no idea of what's going on on the server while buying new shoes in your awesome webshop. As discussed in the previous slides, most traditional deployment strategies require the developer to perform some additional manual operations after or before uploading the updated code. This often makes the developer want to work fast, because the website is down or even broken. This results in stress and often leads to mistakes made by the deployer. Some applications are very heavy and are heavily dependant on caching. After updating the code, the cache also needs to be renewed, which willl cause the first couple of page views to be slow. This might sound as a trivial problem, but in practice, when deploying multiple times a day, it will also result in multiple slow downs each day. Some deployment processes take forever to complete, which might not be a big thing when you're releasing every 3 months, but when your team wants to get new features out of the door quickly, your productivity rate will decrease dramatically when your team mates are waiting 40 minutes a day for 3 deployments to finish. There is soo much that could potentially go wrong when deploying. Database migrations gone wrong, permission errors, connection problems and so on. But, no matter what goes wrong, you should ALWAYS be able to go back and revert, so that you can investigate the problem, at your own pace, in your own time. Not when your website is throwing fatals at your visitors.
  • #17: Wherever you can optimize, optimize! Higher release frequency means smaller deploys means less risk of exceptions Main point of presentation: optimize & automate!
  • #20: Obviously, we would all prefer to never take our website down, not even when updating. But in practice most developers find it acceptable and even customers don't find it odd that their website is down for maintenance (when announced on beforehand of course). But, ideally, our customers and, more importantly, their customers should have no idea of what's going on on the server while buying new shoes in your awesome webshop. As discussed in the previous slides, most traditional deployment strategies require the developer to perform some additional manual operations after or before uploading the updated code. This often makes the developer want to work fast, because the website is down or even broken. This results in stress and often leads to mistakes made by the deployer. Some applications are very heavy and are heavily dependant on caching. After updating the code, the cache also needs to be renewed, which willl cause the first couple of page views to be slow. This might sound as a trivial problem, but in practice, when deploying multiple times a day, it will also result in multiple slow downs each day. Some deployment processes take forever to complete, which might not be a big thing when you're releasing every 3 months, but when your team wants to get new features out of the door quickly, your productivity rate will decrease dramatically when your team mates are waiting 40 minutes a day for 3 deployments to finish. There is soo much that could potentially go wrong when deploying. Database migrations gone wrong, permission errors, connection problems and so on. But, no matter what goes wrong, you should ALWAYS be able to go back and revert, so that you can investigate the problem, at your own pace, in your own time. Not when your website is throwing fatals at your visitors.
  • #23: Deployment is an often forgotten topic when sitting around the drawing table. As before mentioned requirements will take time and therefore cost more money, you should mention and discuss this topic in the early stages of your project. It is essential for a successful deployment strategy.
  • #24: Deployment is an often forgotten topic when sitting around the drawing table. As before mentioned requirements will take time and therefore cost more money, you should mention and discuss this topic in the early stages of your project. It is essential for a successful deployment strategy.
  • #25: Also, you need to manage the expectations for everybody involved in the project. Since deployment is such a critical part of your development cycle, everyone should know how to act and what to expect when working on the project. Also, users should of course be informed about updates, maintenance windows and receive proper error messages when something goes wrong while deploying.
  • #31: No matter how cool your versioning system is, and how good your migrations script can rollback, always make sure there is a backup of your stuff before you actually start breaking things.
  • #35: No matter how cool your versioning system is, and how good your migrations script can rollback, always make sure there is a backup of your stuff before you actually start breaking things.
  • #38: So now we're getting more and more close to having us a deployment script