Standardizing Deployments? Start with Production and Work Backwards
We’re often asked where to start when organizations want to standardize their deployment processes across environments. Starting with the deployment to development environments is common. Developers extend their continuous integration platforms towards continuous delivery organically, deploying to dev test environments for simple functional tests. And later to QA environments using similar approaches.
Many of these organic efforts stumble when they get closer to production. The production deployment often differs so much from the development deployments that the automation can’t be tweaked to meet the challenge. Common tripping points include the inclusion of clusters, load balancers, backups and databases (where dropping all the tables isn’t an option in production). This is so common that most continuous delivery efforts stop at a test environment and aren’t used for staging, production or disaster recovery environments.
Having seen teams reach this stumbling block over and over again, I’m increasingly convinced that for a common process to be created, you have to start with the production deployment process and work backwards from there. For databases, that means that development deployments should use incremental updates to databases rather than a drop and recreate approach. Having a load balancer in QA would be nice, but if it isn’t present, the automation should have a switch in it for, “If there’s a load balancer….” otherwise skip this part of the deployment.
Essentially, the goal is to move from a situation where dev and production deployments are “different” to one where the dev deployment is treated as a simpler version (a subset) of the production deployment. Once a common process is agreed upon (even if its just on paper at this point) standardization and automation efforts can begin in earnest with a good chance of success.
(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)





Comments
Simonluca Landi replied on Sat, 2012/12/15 - 3:56pm
I completely agree with you. In my company we are using the same rules: we (try to..) build every environment using the same recipes, this is why we use virtual machines for all the enviroments, from the dev laptop to production systems. Using virtual machines and "recipes" simplify the setup: you start from the design of the production environment (load balancers, multiple frontends, DB replicas, etc... ) and simply "collapse" the same components in less virtual machines, up to a "all in one" virtual machine that the developers can use their laptop.
Another important lesson we learn is that you should deploy the software in all the enviroment in the same way, using the same tools/scripts/etc.. In this way you build more and more confidence in your deployment procedures.
For the interested ones, I started to share what we are learning in my blog http://www.sll.it/continuous-deployment-from-the-trenches/