Skip to content

@mislav /

Embed URL


Subversion checkout URL

You can clone with
Download ZIP
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
Something went wrong with that request. Please try again.