Travis Deployment to Rubygems.org
After working on it rather un-seriously for a number of months, I decided to finally learn how to publish a ruby gem today. You can thank my workmate, Craig for this.
And since I am lazy, I also made sure to have Travis CI do it automatically for any releases I tag on Github. Here is the result:
We have a success folks! So I thought I'd document the process to help others trying to do something similar.
How to Get Your Gems Flowing to RubyGems.org from Travis CI
Step 1 - Setup an account on Rubygems.org
You will need an account, and, more
Step 2 - Setup your Rubygems.org api key
This tip comes from the Make Your Own Gem guide at rubygems.org.
To setup your RubyGems API key, do the following (and be sure to substitute your rubygems username where you see the ${USERNAME} field).
curl -u ${USERNAME} https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Step 3 - Use the Jeweler Gem
We use the jeweler gem to handle versioning and structure creation/update of the .gemspec manifest so that we don't have to do these things by hand. The jeweler gem adds tasks to rake
and I found it really easy to get setup and customized for my gem.
The readme on the github pretty much had everything I needed.
The section labeled "Customizing Your Gem" is especially important since it offers a modifiable section of code you can drop in your rake files:
require 'jeweler'
Jeweler::Tasks.new do |gem|
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
gem.name = "whatwhatwhat"
gem.summary = %Q{TODO: one-line summary of your gem}
gem.description = %Q{TODO: longer description of your gem}
gem.email = "josh@technicalpickles.com"
gem.homepage = "http://github.com/technicalpickles/whatwhatwhat"
gem.authors = ["Joshua Nichols"]
end
Jeweler::RubygemsDotOrgTasks.new
Here is the jeweler customization for expect-behaviors.
Once jeweler is setup, we now have a rake driven flow to build the gemspec file so that you can bump a version by doing:
rake version:bump:patch
rake gemspec
You will have to decide for yourself how you feel about rake release
. I plan to use Travis CI to deploy so the release part is less important to me.
Also important: it was really useful for me to build the gem locally because it turns out the gem builder really didn't like the way I wrote some of my dependencies. To do this, run gem build ${GEMSPEC_FILE}
.
Step 4 - Get Travis CI up and running
I'm assuming that if you're reading this, you're already familiar with the basics of Travis CI. But in case you need help to get going, I would refer you to their docs:
https://docs.travis-ci.com/user/getting-started/
You want to be up and running with tests before you move on the to next step. If it helps to see an example of how little it takes to configure Travis, you can see my .travis.yml file here. The important sections are covered on lines 1-9 for basic testing. Creating the deploy
section is covered in the next step.
Step 5 - Install the Travis Gem and setup rubygems
gem install travis
travis setup rubygems
Dead simple. That's why we love Ruby.
You will be prompted for everything else. Here is what I saw:
$ travis setup rubygems
Gem name: |expect-behaviors|
Release only tagged commits? |yes|
Release only from francisluong/expect-behaviors? |yes|
Encrypt API key? |yes|
Step 6 - Travis will attempt to deploy when you draft a new release on Github.
But make sure to bump the revision in the commit too.
Here's what I think my flow will be:
- As part of my branch/pull-request, I will include a
rake version:bump:patch
(or :major or :minor as appropriate)
$ rake version:bump:patch
Current version: 0.1.2
Updated version: 0.1.3
- After it passes testing, I merge the PR to master
- Then I draft a release on Github, which triggers Travis CI to build the release and deploy it to RubyGems.