Every organisation I’ve developed software for held the belief that their deployment situation was special, unique and complicated. Most of them came up with convoluted release processes involving multiple manual steps, hundreds of configuration variables, shell scripts and workarounds.
The problem is primarily one of mindset. The presence of multiple applications at multiple versions and multiple environments on multiple machines can lead to a belief that it’s necessary to explicitly manage all of these axes as part of the deployment process.
I prefer a different metaphor: I always try to work as if the deployment artifact will be burned onto DVD and shipped all over the world. Treating software as a product like this makes it much easier to identify what is really part of the software and what must be configured as part of the installation process.
All of the environment/machine/etc specific information can be collapsed into configuration, eg. as a property file or command-line argument. Artificially separating them out leads to more complexity not less. It’s either part of the software (on the DVD) or it’s configuration. That’s it.