?
This is actually a fairly common requirement with BuildMaster, and we have a lot of users who implement this in a lot of different ways. Here are the main two approaches.
Different Versions for Different Customers
If there is a possibility that customers will want to receive different versions of your application at different times (e.g. they may coordinate an upgrade), then the best bet is to set up an application for each customer, and then "import" the deployable from the main (customer-less, or standard) application; you can use a "controller" application of sorts to automate the build/deployment of these customer applications, or use the api.
This approach will also enable "quasi-custom" software, and let you build customizations on top.
All Customers, Same Version, Always
If this is the case, then this is simpler on the administration side, but it can be a bit tricky on the implementation side, as there are several challenges.
First, you will need to deal with the problem of adding a new customer; maybe it's not so bad, and you can do a manual copy; if you are adding several customers a day, maybe it's a problem
Then, there's the problem of rollout; do you take down every customer site at once, then upgrade, then turn them on? Or do you do a more rolling strategy (one at a time), (five at a time, etc)
What about failure, such as if customer 33 of 58 has an error during upgrade? Do you continue with the rest, or stop the whole process
It's hard to advise on a general approach because of these considerations. There's also scope and scalability -- are you looking at a handful, dozens, or hundreds of customers? Regardless, I would look to the features in the new execution engine, as they will simplify this problem quite a bit:
If you are frequently adding customers, then this is more of a "configuration management" problem, and Otter may be a good fit for the delivery aspect
You can create custom "Variable functions" that will allow you to use external data sources (CRM, etc) for customer lists. then you can do something like
<pre>
for each $customer in @GetCustomers() {
if $ShouldDeployCustomer($customer) {
...
}
}
</pre>