We have an ASP.NET app that exists in three environments: Dev where we do our actual work, production where we deploy our final releases at the end of the month, and staging where we deploy our release for the client to review before final approval to deploy to production. This is pretty much common.
Additional information before I go on: The client sends us a list of enhancement requests they want for a particular monthly release and each request is assigned to individual developers. Just putting that out there.
So, anyway, the client has recently requested that we do multiple staging deployments per month so they can review the individual enhancements as they are completed. This has thrown a tremendous curve ball at us.
Before, we'd branch our dev branch to the staging branch at the end of the month and then deploy the staging branch to the test site. After they reviewed all enhancements, they'd give the word to deploy to production, after which we'd branch the staging branch to the production branch and then deploy that to the production site.
Now that they want multiple staging deployments per month, however, we have to be very careful in what we deploy to the test site. This is because two developers might be finished with their requests and are ready for deployment, but another dev might still be working on a very large request that might not be done for a few days.
The only option we seem to have is for the dev not to check their unfinished work into source control (SourceGear Vault if anyone needs to know) so that it doesn't get deployed in a broken state. To make matters worse, we use Oracle packages which don't exist in source control. If one dev has completed their changes to a stored procedure (sproc) in a package, but another dev still has another sproc in the same packaged all borked up because he's in the middle of making changes, we have to painstakingly move the individual sprocs to the staging environment instead of just doing a build of the entire package.
So what we have had to resort to is basically telling the client that we can't do staging deployments at whim, that we have to wait until all devs are done with the requests they're currently working on. The client gets really bickery about this. It's a real bite.
So what do you guys all do in this situation? Is there a standard construct in place that makes this kind of thing easy that we just don't know about? Or perhaps this is just the rigid nature of the beast? I'd like to hear the best recommendations of how to go about things such as this.