Skip to content

Instantly share code, notes, and snippets.

Created January 25, 2012 14:42
Show Gist options
  • Save mislav/1676577 to your computer and use it in GitHub Desktop.
Save mislav/1676577 to your computer and use it in GitHub Desktop.
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'
require 'hub/ssh_config'
rescue LoadError
abort $!.to_s
## 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'
case lang = File.exist?(conf) && =~ /\blanguage:\s*(\w+)\b/ && $1
when 'ruby' then 'common'
when 'java', 'scala', 'groovy', 'clojure' then 'jvm'
lang || 'common'
# 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}"
Copy link

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