Deploying our app is hard.
We have to shut down the running app, modify the production databases, make sure that the links of the new app to our testing databases are switched to the production databases, bring back up the new app, and then cross our fingers and hope that everything works.
More often than not, it seems like something goes wrong. Usually we forget to add/populate a new column in the production database that the app now depends on or we mess up and forget to change some property that we need to flip to make the app production ready. Usually an irate e-mail from a user will let me know that something is wrong.
I've been thinking about this lately though, and I think I've finally getting over the deployment hump. Using Maven I've automated all of the property flipping now and have a goal that automatically takes care of pointing the app at the production database. I've also worked in a bunch of Jelly functional tests that go through a bunch of our workflows to assure me that all of our mission critical stuff is working. I'm also working on a tool that will read the schema from both the testing and production databases and create a "database diff" of the two that I can then generate SQL from to bring them back into sync. I'm hoping that this combo of automation and tests will finally end the days of deploying the app and then waiting for the e-mail from one of our users about what's broken this time.