Another possibility- and something people do often is to maintain a release branch and merging all changes from the master/development branch onto this one when something is ready to be released. The gem built from this release branch can then be released automatically every time it is built.
The fact is, that flow too, can be automated from Snap due to our automated branch tracking.
RSpec (rspec-core at least), and many other gems, use TravisCI to do the testing but not the pushing.
Yes, Travis CI does allow you to do this. But it deploys every passing build, so you can't choose which builds should be released and which shouldn't.
I'm not aware of what others do but I sure hope they use a CI service to release a gem as it makes it easier to track what all is going in and maintaining a history.