We build two separate Debian packages: cyrus-fastmail for production, and cyrus-future for testing.
Git workflow - we push branches named fastmail and future to our git repo. They are pretty aggressively rebased on the upstream master branch.
We have unit tests and a couple of more comprehensive test suites we run against code before it hits future. Future runs on a single store with one real user (my personal account) and a bunch of users that the functional tests run against. Once we're happy, we push that same branch to fastmail and rebuild.
There's a commit hook which sends a diff against the previous build tag to the mailing list so you can easily see what is being rolled out, both for future and for fastmail.
We do some horrible things to git for the rest of our system too. Our pushback tooling that builds squashed feature branches onto host branches is pretty crazy. It mostly does what we need though.