Where I work, our programs are first installed in QA, then staging and finally production. For each step, there's a web form we fill out, listing the release number, tracking system ID, what program, any config changes, any database changes, any special instructions and what testing have been done. Once submitted, the OPs team pulls the proper program from the build server, updates the config and pushes the stuff automatically (I know they use something like chef or ansible, but I'm not in that department (which is on the other side of the country) so I'm not sure of the exact details).
For the final push into production, the developers have to be online (2:00 am Eastern), along with QA and OPs. QA or the developers can abort the deployment [1] for any reason, and rolling back is trivial. So far in my seven years at The Company, I've had to abort a production deployment once (yes, I noticed an issue and aborted the deployment---it was totally my call).
[1] Our customers are the various Monopolistic Phone Companies. We have scary SLAs. We get approval for deployment from them. Downtime costs us Real Money. I don't get to deploy stuff all that often (stuff that doesn't talk directly with the customers is easier to deploy---unfortunately, most of what I work on talks directly with the customers).
For the final push into production, the developers have to be online (2:00 am Eastern), along with QA and OPs. QA or the developers can abort the deployment [1] for any reason, and rolling back is trivial. So far in my seven years at The Company, I've had to abort a production deployment once (yes, I noticed an issue and aborted the deployment---it was totally my call).
[1] Our customers are the various Monopolistic Phone Companies. We have scary SLAs. We get approval for deployment from them. Downtime costs us Real Money. I don't get to deploy stuff all that often (stuff that doesn't talk directly with the customers is easier to deploy---unfortunately, most of what I work on talks directly with the customers).