Hi Vanessa,
We have one project in total. This is our core product. There are other projects on our Octopus system, but they don’t concern the team I’m in.
Within this project we have a couple of builds, which are slightly different product options. Each one has a latest release. We only ever deploy the latest releases.
We have three delivery stages, Dev/QA, UAT, and Production. Each stage has a different set of servers in it, and we use variables to point to these. We have a web server, service server, and database instance serving all customers in each delivery stage. We have a tentacle on each web server and service server, and we run scripts on the service server to do the database work (as we’re not allowed to put a tentacle on the database servers).
As our application doesn’t support multi-tenancy, and may not be able to due to clients requiring separate data stores, we have one install per client, installed into separate folders. We have parameterised this (so the install folder is something like “D:\App#{clientshortcode}”, for example, and other client-specific settings are similar).
For a given customer instance in a given stage, we need some variables that are scoped across Dev, UAT and Prod for a given customer, and we need some variables scoped across all clients for a given stage. However, the only way we’ve found to separate out the settings is to create an environment per client per stage. This means we have over 50 environments, all called something like “Product-Stage-Customer”. We’ve found this is very error-prone, as we have a massive list of variables per customer, and we’ve made a fair few mistakes with the deployments. We also can’t multi-deploy like this, so when we put a new build into UAT, we have to do something like 20 separate deployments, one at a time, to the correct environment. This also is painful and error-prone.
What I’d like to know is if there’s a better way to manage all of this?
Please let me know.
Rhys