Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
CLI tool that checks the build status of current branch on Travis CI

Check build status of a project on the command line

Install (copy & paste):

curl -sL > ~/bin/travis \
  && chmod +x ~/bin/travis

gem install hub | tail -2
ruby -e 'require "json"' 2>/dev/null || gem install json

You're in a project's directory. Is the current branch green on Travis CI? Let's find out:

$ travis
origin/master built OK.

To check a branch other than current:

$ travis feature
origin/feature built OK.

The travis command will exit with a non-zero status if the latest build has failed or is still running. This enables you to chain the command like this:

$ travis && rake release

Now if the build has failed, rake release will never happen and this gives you the chance to fix your library before releasing the gem.

#!/usr/bin/env ruby -rubygems -w
# Lookup Travis CI build status of the current branch.
# Exit with error status if build in progress or has failed.
# Dependenices: json (on ruby 1.8), hub
require 'json'
require 'time'
require 'net/http'
require 'hub/context'
rescue LoadError
abort $!
## helper methods
include Hub::Context
def get(url)
case response = Net::HTTP.get_response(URI(url))
when Net::HTTPSuccess then JSON.parse(response.body)
when Net::HTTPNotFound then abort "error: project not found on Travis"
else abort "error: Travis API returned status #{response.code}"
def to_branch(name)
name = "refs/heads/#{name}" unless name.include?('/'), name)
## figure out current repo state
branch = ARGV[0] ? to_branch(ARGV[0]) : current_branch or abort "no git branch"
project = current_project or abort "git remote not pointing to a GitHub project"
upstream = branch.upstream || to_branch("refs/remotes/#{project.remote}/#{branch.short_name}")
pushed_rev = git_command("rev-parse #{upstream}") or abort "invalid upstream branch: #{upstream}"
upstream_name = upstream.to_s.sub('refs/remotes/', '')
## warn about unpushed commits
if local_commits = git_command("rev-list --cherry #{upstream}...")
warn "%d commits not yet pushed to %s" % [
## talk to Travis
builds = get('' % current_project.name_with_owner)
if build = builds.find {|b| b['commit'] == pushed_rev }
if build['result']
if build['result'] == 0
puts "%s built OK." % upstream_name
warn "%s build failed." % upstream_name
exit build['result']
started_at = Time.parse build['started_at']
seconds = - started_at
abort "build in progress (%d seconds)" % seconds
queue_name = case current_project.owner
when 'rails', 'spree' then current_project.owner
conf = '.travis.yml'
(File.exist?(conf) && =~ /\blanguage:\s*(\w+)\b/) ?
(%w[java scala groovy clojure].include?($1) ? 'jvm' : $1) :
# check if build is waiting in the queue
if queue = get("{queue_name}") and !queue.empty?
repo_id = builds.any? ? builds.first['repository_id'] :
get('' % current_project.name_with_owner)['id']
if queue.any? { |b| b['repository_id'] == repo_id }
abort "builds are waiting in the queue"
abort "no build for #{upstream_name}"

The travis-client gem also provides a command line interface to Travis CI, but I like your interface much better. I'd be interested in taking inspiration from your gist, and making the gem's travis binary more script-friendly.

Also, if you're interested, I've written a blog post about displaying a project's Travis CI status in your shell prompt.

Scratch that, I've decided to use your script instead of the travis-client gem (for the status in prompt).

But on Ubuntu, I get:

/usr/bin/env: ruby -rubygems -w: No such file or directory

So I just changed the top line to /usr/bin/env: ruby, and added require 'rubygems'.

Hey, just a heads up that Travis CI now forces HTTPS, so you have to use and net/https, or the script will fail with a 301 response.

See my fork for a fix:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment