Skip to content

Instantly share code, notes, and snippets.

@mislav
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 raw.github.com/gist/1676577/travis.rb > ~/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
begin
require 'json'
require 'time'
require 'net/http'
require 'hub/context'
require 'hub/ssh_config'
rescue LoadError
abort $!.to_s
end
## 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}"
end
end
def to_branch(name)
name = "refs/heads/#{name}" unless name.include?('/')
Branch.new(local_repo, name)
end
## 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" % [
local_commits.split("\n").size,
upstream_name
]
end
## talk to Travis
builds = get('http://travis-ci.org/%s/builds.json' % 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
else
warn "%s build failed." % upstream_name
exit build['result']
end
else
started_at = Time.parse build['started_at']
seconds = Time.now - started_at
abort "build in progress (%d seconds)" % seconds
end
else
queue_name = case current_project.owner
when 'rails', 'spree' then current_project.owner
else
conf = '.travis.yml'
case lang = File.exist?(conf) && File.read(conf) =~ /\blanguage:\s*(\w+)\b/ && $1
when 'ruby' then 'common'
when 'java', 'scala', 'groovy', 'clojure' then 'jvm'
else
lang || 'common'
end
end
# check if build is waiting in the queue
if queue = get("http://travis-ci.org/jobs.json?state=created&queue=builds.#{queue_name}") and !queue.empty?
repo_id = builds.any? ? builds.first['repository_id'] :
get('http://travis-ci.org/%s.json' % current_project.name_with_owner)['id']
if queue.any? { |b| b['repository_id'] == repo_id }
abort "builds are waiting in the queue"
end
end
abort "no build for #{upstream_name}"
end
@ndbroadbent
Copy link

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'.

@ndbroadbent
Copy link

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

See my fork for a fix: https://gist.github.com/1708408

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