This is part of a series of posts on how to make software deployments boring, because Boring is good!
In earlier posts I’ve said that everything—everything—getting deployed should come from the output directory of the build. No exceptions; include even environment-specific configuration information.
Doing so gives us another way to reduce risk. We do this by deploying the same bits in every environment. Allow me to explain.
I once worked at a company where standard practice was to recompile the source code before deploying into each environment. I was always surprised at this and didn’t understand it…at the time I didn’t challenge the practice because I was still new to the industry at that point. But I still don’t understand it. Maybe someday I’ll get an explanation.
I’ve since worked, quite often, in organizations where recompiling was not a formal practice but was often done by default. (These organizations didn’t have a controlled build environment.) I think it’s a weak practice, at least for the kind of software and operating environments we tend to have now.
So here’s what to do instead:
Every time the software is built, its output should be uniquely identified. If you have something like Microsoft Team Foundation Server or CruiseControl, this identifier is generated for you. (If not, you’ll have to do it for yourself.) Then, keep track of which specific build has been deployed in the test environments. At my current workplace we have a number of test environments, and we know exactly which build numbers have been deployed in each environment. This means we know exactly what is being tested…
…which means that if we deploy the same build number into production, then we know that those exact bits have been tested. We don’t risk introducing errors by recompiling or reassembling the deployment artifacts.
Having confidence that we’ve deployed exactly what we’ve tested requires having confidence in these things:
- Every artifact is in the build output directory (also frequently called the drop directory).
- The drop directory is controlled—once the artifacts of a build are put in the drop directory, very few people should be able to alter the directory’s contents.
- We are properly tracking build numbers so we know that the build number we’re currently deploying into production is the one we deployed into our test environments earlier.
This is one more place in which to reduce risk, as we travel on our journey to make deployments boring.