SlideShare a Scribd company logo
1 of 31
Parity
Keeping development and
production environments in sync
for fun, profit, and sanity
Hi, I’m Geoff
I’m the CTO at Cortex
http://cortexintel.com
Developing in Ruby since 2008
Formerly operator of
Five Tool Development
What is parity?
Parity is consistency in the configuration of your
application’s environments (production, staging,
development, test, etc.)
Why is this important?
• When your tests pass, you should be confident that
your code works.
• When you have parity, you'll find many more bugs
and configuration idiosyncrasies in development,
before you get to a QA or (gasp) production phase.
Achieving parity
• Make the time gap small: a developer may write code
and have it deployed hours or even just minutes later.
• Make the personnel gap small: developers who wrote
code are closely involved in deploying it and watching
its behavior in production.
• Make the tools gap small: keep development and
production as similar as possible.
Source: http://12factor.net/dev-prod-parity
Setup for parity
• Use the same backing services and support
software in all environments
• At Cortex our bootstrap script (modified from
Thoughtbot’s suspenders-created script) installs
PostgreSQL, Redis, node.js, and Bower if those
packages are not already installed. It then sets up
pow, foreman, tunnelss, so we can serve the app at
http://cortex.dev and https://cortex.dev
Backing Services
• Database (Postgres, MySQL, Mongo, etc)
• Queues (Sidekiq, Resque, DelayedJob)
• Storage (local disk, AWS, CloudDrive, SkyDrive)
• Search (solr, Elasticsearch)
• Caching (Rails In-memory, Memcached)
The adapter fallacy:
ActiveRecord
• ActiveRecord promises portability, but most
applications will eventually implement behavior that
isn’t consistent across different databases in the
form of SQL literals or queries that return different
results
• Rails encourages the use of SQLite in development,
but there’s no reason not to use the database you’re
going to use in production
Tools for parity
• Foreman - process manager
• Setup script
• pow - app/DNS/proxy with nice “.dev” domain
names
• Tunnelss (fork of tunnels) - route SSL to another
port locally
• Parity - easy management of Heroku environments
Foreman
• Process manager that works well locally as a stand-
in for Heroku
• Runs web and background processes like Sidekiq,
DelayedJob, or Resque
• Easy to configure alongside pow
Parity gem and Heroku
• Name your app folder big-red-machine
• Name your Heroku remotes big-red-machine-
staging and big-red-machine-production
• Use parity aliases to execute commands easily on
Heroku
• migrate, rake, log, tail, log2viz, console, config, open
Moving data with parity
• production backup - takes a snapshot on production
• staging restore production - copies the latest
production backup to staging
• development restore production - copies the latest
production backup to local dev
Rails environment setup
• Make differences between your environments
explicit
• Move universal configuration to application.rb or
initializers
• Have environments inherit from a base environment
(staging and demo from production), then override
the few items that are different
Differences in development
For your own sanity, some items might be smart
candidates to break parity in your development
environment:
• Eager loading
• Asset compilation
• SSL
Windows?
• If you deploy to a POSIX system (Linux, BSD, etc.),
you should be doing development or at least your
testing in a similar environment
• Use Vagrant or other virtualization tools to run a
facsimile environment locally
Configure with ENV
Never store credentials or secrets in source control
Environment can be used for configuration beyond
credentials!
• S3 configuration
• CDN setup
• DB connection pool size
Local ENV
• Rails 4.1 introduced secrets.yml, a standard way to
store local credentials
• dotenv/dotenv-rails can load credentials from
Heroku configs (downloaded with heroku config:pull)
• Figaro performs similar functionality to Rails 4.1’s
secrets.yml (YAML format, one file for all
environments)
Careful what you mock
You should not need a network connection to run your
tests locally
In integration tests, don’t stub or mock gems that
interface with external services. Record a real
response with the vcr gem, then replay that on later
tests (make sure to strip out credentials after
recording!)
Fog and Amazon
• Use Fog to abstract Amazon S3 so that local
development and test machines don’t need the
network
• Allows common interface for local and external
storage
• In our CI environment, we make a real connection to
S3 to confirm that our local setup is not hiding a real
problem
Strategies for parity
• Use the same backing services everywhere!
• Manage packages with a package manager such as
Homebrew or apt-get
• Use the same application server in development as
production. If you’re using Unicorn in production,
don’t use WEBrick in development
OSX protip: brew services
Can’t remember how to turn on PostgreSQL? How to
restart Redis? Use brew services
• brew services list
• brew services start postgresql
• brew services restart redis
Strategies for parity
Avoid Rails.env.production? checks. Use tools like
custom_configuration
# config/environments/production.rb
BCX::Application.configure do
config.x.resque.jobs_inline = true
end
# config/initializers/resque.rb
if Rails.configuration.x.resque.jobs_inline
Resque.inline = true
end
Make it easy on testers
• My app serves locally at http://cortex.dev
• My laptop is on the IP address 10.0.1.37
• My tester can reach my machine at
http://cortex.10.0.1.37.xip.io
• When you’re not on the same subnet, use ngrok or
Finch
Strategies for deployment
• Keep your PRs as small as is reasonable
• Only merge to master code you’re ready to ship
• Deploy early and often (or… continuously!)
• Automate your deployment process
• Reduce the number of things you can forget
Make deployment easy
• You should be able to do most deploys with
ONE (1) command
• Reduce the number of things you can forget through
automation
• Don’t trust that you or your teammates will follow a
checklist every time
Protect yourself
Automating deployment means:
• You don’t forget to run migrations
• You don’t forget to update reference data
• You don’t forget to recompile or sync assets
• You don’t forget to restart the server
How we deploy
• Alias or script: push-to-staging, push-to-production,
push-to-demo
gp staging $(git symbolic-ref --short -q HEAD):master --force && staging migrate
• Always rebuild assets with bower
• Always run migrations
• Always apply production data updates
Heroku Buildpacks
• Tim Pope’s Ruby buildpack tracks with Heroku’s
buildpack, but always runs migrations without
requiring a second connection and app restart
• We use qnyp/heroku-buildpack-ruby-bower to
automatically build our assets from Bower whenever
we deploy, which helps avoid issues where we
forget to sync assets
Questions?
Further Reading
• Heroku's 12 Factor App site: http://12factor.net/
• parity gem: http://github.com/croaky/parity
• Foreman as process manager, Pow as DNS server:
http://robots.thoughtbot.com/foreman-as-process-
manager-pow-as-dns-server-and-http
• Beyond the default Rails environments:
http://signalvnoise.com/posts/3535-beyond-the-
default-rails-environments
Thanks!
I love talking about Ruby and Rails, so feel free to
reach out to me with questions!
email: geoff@cortexintel.com
Github: geoffharcourt
Twitter: @geoffharcourt

More Related Content

What's hot

Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of ChefChef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of ChefChef Software, Inc.
 
Chef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK BoxChef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK BoxChef Software, Inc.
 
Automated Infrastructure Testing
Automated Infrastructure TestingAutomated Infrastructure Testing
Automated Infrastructure TestingRanjib Dey
 
Puppet Camp Denver 2015: Nagios Management With Puppet
Puppet Camp Denver 2015: Nagios Management With PuppetPuppet Camp Denver 2015: Nagios Management With Puppet
Puppet Camp Denver 2015: Nagios Management With PuppetPuppet
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefNathen Harvey
 
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web Scale
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web ScaleSaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web Scale
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web ScaleSaltStack
 
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Software, Inc.
 
Introduction to Chef: Automate Your Infrastructure by Modeling It In Code
Introduction to Chef: Automate Your Infrastructure by Modeling It In CodeIntroduction to Chef: Automate Your Infrastructure by Modeling It In Code
Introduction to Chef: Automate Your Infrastructure by Modeling It In CodeJosh Padnick
 
Introduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitIntroduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitJennifer Davis
 
Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Jennifer Davis
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with ChefJonathan Weiss
 
Infrastructure as code
Infrastructure as codeInfrastructure as code
Infrastructure as codedaisuke awaji
 
Infrastructure as Code with Chef
Infrastructure as Code with ChefInfrastructure as Code with Chef
Infrastructure as Code with ChefSarah Hynes Cheney
 
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...Simplilearn
 
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with ChefOpscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with ChefChef Software, Inc.
 
Test-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefTest-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefMichael Lihs
 

What's hot (20)

Chef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of ChefChef Fundamentals Training Series Module 1: Overview of Chef
Chef Fundamentals Training Series Module 1: Overview of Chef
 
Chef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK BoxChef ignited a DevOps revolution – BK Box
Chef ignited a DevOps revolution – BK Box
 
Automated Infrastructure Testing
Automated Infrastructure TestingAutomated Infrastructure Testing
Automated Infrastructure Testing
 
Puppet Camp Denver 2015: Nagios Management With Puppet
Puppet Camp Denver 2015: Nagios Management With PuppetPuppet Camp Denver 2015: Nagios Management With Puppet
Puppet Camp Denver 2015: Nagios Management With Puppet
 
Introduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to ChefIntroduction to Infrastructure as Code & Automation / Introduction to Chef
Introduction to Infrastructure as Code & Automation / Introduction to Chef
 
Understand Chef
Understand ChefUnderstand Chef
Understand Chef
 
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web Scale
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web ScaleSaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web Scale
SaltConf14 - Craig Sebenik, LinkedIn - SaltStack at Web Scale
 
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
 
Automation in Cloud
Automation in CloudAutomation in Cloud
Automation in Cloud
 
Chef: Smart infrastructure automation
Chef: Smart infrastructure automationChef: Smart infrastructure automation
Chef: Smart infrastructure automation
 
Introduction to Chef: Automate Your Infrastructure by Modeling It In Code
Introduction to Chef: Automate Your Infrastructure by Modeling It In CodeIntroduction to Chef: Automate Your Infrastructure by Modeling It In Code
Introduction to Chef: Automate Your Infrastructure by Modeling It In Code
 
Introduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen SummitIntroduction to Chef - Techsuperwomen Summit
Introduction to Chef - Techsuperwomen Summit
 
Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015Introduction to Chef - April 22 2015
Introduction to Chef - April 22 2015
 
Infrastructure Automation with Chef
Infrastructure Automation with ChefInfrastructure Automation with Chef
Infrastructure Automation with Chef
 
Infrastructure as code
Infrastructure as codeInfrastructure as code
Infrastructure as code
 
Infrastructure as Code with Chef
Infrastructure as Code with ChefInfrastructure as Code with Chef
Infrastructure as Code with Chef
 
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...
Chef vs Puppet vs Ansible vs Saltstack | Configuration Management Tools | Dev...
 
Opscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with ChefOpscode Webinar: Managing Your VMware Infrastructure with Chef
Opscode Webinar: Managing Your VMware Infrastructure with Chef
 
Test-Driven Infrastructure with Chef
Test-Driven Infrastructure with ChefTest-Driven Infrastructure with Chef
Test-Driven Infrastructure with Chef
 
Command box
Command boxCommand box
Command box
 

Similar to DCRUG: Achieving Development-Production Parity

Fluo CICD OpenStack Summit
Fluo CICD OpenStack SummitFluo CICD OpenStack Summit
Fluo CICD OpenStack SummitMiguel Zuniga
 
Deploying software at Scale
Deploying software at ScaleDeploying software at Scale
Deploying software at ScaleKris Buytaert
 
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-20Michael Lihs
 
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony AppsSymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony AppsPablo Godel
 
Smart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSSmart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSJames Huston
 
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...Nagios
 
Habitat Overview
Habitat OverviewHabitat Overview
Habitat OverviewMandi Walls
 
Prescriptive System Security with InSpec
Prescriptive System Security with InSpecPrescriptive System Security with InSpec
Prescriptive System Security with InSpecAll Things Open
 
Prescriptive Security with InSpec - All Things Open 2019
Prescriptive Security with InSpec - All Things Open 2019Prescriptive Security with InSpec - All Things Open 2019
Prescriptive Security with InSpec - All Things Open 2019Mandi Walls
 
Top 10 dev ops tools (1)
Top 10 dev ops tools (1)Top 10 dev ops tools (1)
Top 10 dev ops tools (1)yalini97
 
Getting to Walk with DevOps
Getting to Walk with DevOpsGetting to Walk with DevOps
Getting to Walk with DevOpsEklove Mohan
 
ClearCase Escape Plan
ClearCase Escape PlanClearCase Escape Plan
ClearCase Escape PlanPerforce
 
Deployment Strategies: Managing Code, Content, and Configurations
Deployment Strategies: Managing Code, Content, and ConfigurationsDeployment Strategies: Managing Code, Content, and Configurations
Deployment Strategies: Managing Code, Content, and Configurationsnyccamp
 
Moving Windows Applications to the Cloud
Moving Windows Applications to the CloudMoving Windows Applications to the Cloud
Moving Windows Applications to the CloudRightScale
 
How bigtop leveraged docker for build automation and one click hadoop provis...
How bigtop leveraged docker for build automation and  one click hadoop provis...How bigtop leveraged docker for build automation and  one click hadoop provis...
How bigtop leveraged docker for build automation and one click hadoop provis...Evans Ye
 
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 WorkbenchHoward Greenberg
 

Similar to DCRUG: Achieving Development-Production Parity (20)

Fluo CICD OpenStack Summit
Fluo CICD OpenStack SummitFluo CICD OpenStack Summit
Fluo CICD OpenStack Summit
 
Devops
DevopsDevops
Devops
 
Deploying software at Scale
Deploying software at ScaleDeploying software at Scale
Deploying software at Scale
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as Code
 
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
 
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony AppsSymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
SymfonyCon Madrid 2014 - Rock Solid Deployment of Symfony Apps
 
Smart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWSSmart Platform Infrastructure with AWS
Smart Platform Infrastructure with AWS
 
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...
 
Habitat Overview
Habitat OverviewHabitat Overview
Habitat Overview
 
Prescriptive System Security with InSpec
Prescriptive System Security with InSpecPrescriptive System Security with InSpec
Prescriptive System Security with InSpec
 
Prescriptive Security with InSpec - All Things Open 2019
Prescriptive Security with InSpec - All Things Open 2019Prescriptive Security with InSpec - All Things Open 2019
Prescriptive Security with InSpec - All Things Open 2019
 
DevOps tools for winning agility
DevOps tools for winning agilityDevOps tools for winning agility
DevOps tools for winning agility
 
Top 10 dev ops tools (1)
Top 10 dev ops tools (1)Top 10 dev ops tools (1)
Top 10 dev ops tools (1)
 
Getting to Walk with DevOps
Getting to Walk with DevOpsGetting to Walk with DevOps
Getting to Walk with DevOps
 
ClearCase Escape Plan
ClearCase Escape PlanClearCase Escape Plan
ClearCase Escape Plan
 
Deployment Strategies: Managing Code, Content, and Configurations
Deployment Strategies: Managing Code, Content, and ConfigurationsDeployment Strategies: Managing Code, Content, and Configurations
Deployment Strategies: Managing Code, Content, and Configurations
 
Moving Windows Applications to the Cloud
Moving Windows Applications to the CloudMoving Windows Applications to the Cloud
Moving Windows Applications to the Cloud
 
How bigtop leveraged docker for build automation and one click hadoop provis...
How bigtop leveraged docker for build automation and  one click hadoop provis...How bigtop leveraged docker for build automation and  one click hadoop provis...
How bigtop leveraged docker for build automation and one click hadoop provis...
 
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
 
Enterprise PHP
Enterprise PHPEnterprise PHP
Enterprise PHP
 

Recently uploaded

Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...OnePlan Solutions
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxRTS corp
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 

Recently uploaded (20)

Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
Tech Tuesday - Mastering Time Management Unlock the Power of OnePlan's Timesh...
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 

DCRUG: Achieving Development-Production Parity

  • 1. Parity Keeping development and production environments in sync for fun, profit, and sanity
  • 2. Hi, I’m Geoff I’m the CTO at Cortex http://cortexintel.com Developing in Ruby since 2008 Formerly operator of Five Tool Development
  • 3. What is parity? Parity is consistency in the configuration of your application’s environments (production, staging, development, test, etc.)
  • 4. Why is this important? • When your tests pass, you should be confident that your code works. • When you have parity, you'll find many more bugs and configuration idiosyncrasies in development, before you get to a QA or (gasp) production phase.
  • 5. Achieving parity • Make the time gap small: a developer may write code and have it deployed hours or even just minutes later. • Make the personnel gap small: developers who wrote code are closely involved in deploying it and watching its behavior in production. • Make the tools gap small: keep development and production as similar as possible. Source: http://12factor.net/dev-prod-parity
  • 6. Setup for parity • Use the same backing services and support software in all environments • At Cortex our bootstrap script (modified from Thoughtbot’s suspenders-created script) installs PostgreSQL, Redis, node.js, and Bower if those packages are not already installed. It then sets up pow, foreman, tunnelss, so we can serve the app at http://cortex.dev and https://cortex.dev
  • 7. Backing Services • Database (Postgres, MySQL, Mongo, etc) • Queues (Sidekiq, Resque, DelayedJob) • Storage (local disk, AWS, CloudDrive, SkyDrive) • Search (solr, Elasticsearch) • Caching (Rails In-memory, Memcached)
  • 8. The adapter fallacy: ActiveRecord • ActiveRecord promises portability, but most applications will eventually implement behavior that isn’t consistent across different databases in the form of SQL literals or queries that return different results • Rails encourages the use of SQLite in development, but there’s no reason not to use the database you’re going to use in production
  • 9. Tools for parity • Foreman - process manager • Setup script • pow - app/DNS/proxy with nice “.dev” domain names • Tunnelss (fork of tunnels) - route SSL to another port locally • Parity - easy management of Heroku environments
  • 10. Foreman • Process manager that works well locally as a stand- in for Heroku • Runs web and background processes like Sidekiq, DelayedJob, or Resque • Easy to configure alongside pow
  • 11. Parity gem and Heroku • Name your app folder big-red-machine • Name your Heroku remotes big-red-machine- staging and big-red-machine-production • Use parity aliases to execute commands easily on Heroku • migrate, rake, log, tail, log2viz, console, config, open
  • 12. Moving data with parity • production backup - takes a snapshot on production • staging restore production - copies the latest production backup to staging • development restore production - copies the latest production backup to local dev
  • 13. Rails environment setup • Make differences between your environments explicit • Move universal configuration to application.rb or initializers • Have environments inherit from a base environment (staging and demo from production), then override the few items that are different
  • 14. Differences in development For your own sanity, some items might be smart candidates to break parity in your development environment: • Eager loading • Asset compilation • SSL
  • 15. Windows? • If you deploy to a POSIX system (Linux, BSD, etc.), you should be doing development or at least your testing in a similar environment • Use Vagrant or other virtualization tools to run a facsimile environment locally
  • 16. Configure with ENV Never store credentials or secrets in source control Environment can be used for configuration beyond credentials! • S3 configuration • CDN setup • DB connection pool size
  • 17. Local ENV • Rails 4.1 introduced secrets.yml, a standard way to store local credentials • dotenv/dotenv-rails can load credentials from Heroku configs (downloaded with heroku config:pull) • Figaro performs similar functionality to Rails 4.1’s secrets.yml (YAML format, one file for all environments)
  • 18. Careful what you mock You should not need a network connection to run your tests locally In integration tests, don’t stub or mock gems that interface with external services. Record a real response with the vcr gem, then replay that on later tests (make sure to strip out credentials after recording!)
  • 19. Fog and Amazon • Use Fog to abstract Amazon S3 so that local development and test machines don’t need the network • Allows common interface for local and external storage • In our CI environment, we make a real connection to S3 to confirm that our local setup is not hiding a real problem
  • 20. Strategies for parity • Use the same backing services everywhere! • Manage packages with a package manager such as Homebrew or apt-get • Use the same application server in development as production. If you’re using Unicorn in production, don’t use WEBrick in development
  • 21. OSX protip: brew services Can’t remember how to turn on PostgreSQL? How to restart Redis? Use brew services • brew services list • brew services start postgresql • brew services restart redis
  • 22. Strategies for parity Avoid Rails.env.production? checks. Use tools like custom_configuration # config/environments/production.rb BCX::Application.configure do config.x.resque.jobs_inline = true end # config/initializers/resque.rb if Rails.configuration.x.resque.jobs_inline Resque.inline = true end
  • 23. Make it easy on testers • My app serves locally at http://cortex.dev • My laptop is on the IP address 10.0.1.37 • My tester can reach my machine at http://cortex.10.0.1.37.xip.io • When you’re not on the same subnet, use ngrok or Finch
  • 24. Strategies for deployment • Keep your PRs as small as is reasonable • Only merge to master code you’re ready to ship • Deploy early and often (or… continuously!) • Automate your deployment process • Reduce the number of things you can forget
  • 25. Make deployment easy • You should be able to do most deploys with ONE (1) command • Reduce the number of things you can forget through automation • Don’t trust that you or your teammates will follow a checklist every time
  • 26. Protect yourself Automating deployment means: • You don’t forget to run migrations • You don’t forget to update reference data • You don’t forget to recompile or sync assets • You don’t forget to restart the server
  • 27. How we deploy • Alias or script: push-to-staging, push-to-production, push-to-demo gp staging $(git symbolic-ref --short -q HEAD):master --force && staging migrate • Always rebuild assets with bower • Always run migrations • Always apply production data updates
  • 28. Heroku Buildpacks • Tim Pope’s Ruby buildpack tracks with Heroku’s buildpack, but always runs migrations without requiring a second connection and app restart • We use qnyp/heroku-buildpack-ruby-bower to automatically build our assets from Bower whenever we deploy, which helps avoid issues where we forget to sync assets
  • 30. Further Reading • Heroku's 12 Factor App site: http://12factor.net/ • parity gem: http://github.com/croaky/parity • Foreman as process manager, Pow as DNS server: http://robots.thoughtbot.com/foreman-as-process- manager-pow-as-dns-server-and-http • Beyond the default Rails environments: http://signalvnoise.com/posts/3535-beyond-the- default-rails-environments
  • 31. Thanks! I love talking about Ruby and Rails, so feel free to reach out to me with questions! email: geoff@cortexintel.com Github: geoffharcourt Twitter: @geoffharcourt

Editor's Notes

  1. At Cortex, we have production, staging (stakeholder QA), development (my laptop), test (my laptop), and CI (Travis, build verification)
  2. You should strive to have your development and production environments as close to each other in configuration and behavior as possible so that your development (or testing) environment is an accurate representation of your deployed code in production.
  3. Aaron Patterson from Rails Core has a joke that no app has ever successfully switched databases PG does not support strftime