Fabric pull the code from github, puts it in the server and restarts the services (mongo, nginx) if needed.
I took some inspiration from newblur's fabfile.py: https://github.com/samuelclay/NewsBlur/blob/master/fabfile.p...
Happy to answer any questions about Beanstalk Deployments which is my personal favorite part of the system: http://beanstalkapp.com/features/deployments
Because our workflow utilized git flow, we do the majority of our work in feature branches, submit PRs, and then merge those to develop when TravisCI says it passes.
Once on develop, we "cap staging deploy" and run any final tests using Testacular, Selenium, or just by hand.
Most of the time, though, all we do is eyeball the code changes on develop, confirm tests pass in TravisCI, and do a release on master and then "cap production deploy".
Database migrations are handled automatically via Doctrine with each deployment with rollback support.
Sessions are pooled, and there haven't been any issues between releases. NewRelic is our primary indicator for a successful release.
Using this method, we deploy 6+ times a day, and haven't had the the time to automate it all yet :)
If the push involves db schema changes, we'll take the production offline for the duration of the push, showing a "Be back shortly" page.