Skip to content

Instantly share code, notes, and snippets.

@ndbroadbent
Forked from mislav/readme.md
Created January 31, 2012 02:52
Show Gist options
  • Save ndbroadbent/1708408 to your computer and use it in GitHub Desktop.
Save ndbroadbent/1708408 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 https://raw.github.com/gist/1708408/travis.rb > ~/bin/travis-ci \
  && chmod +x ~/bin/travis-ci

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
# 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 'rubygems'
require 'json'
require 'time'
require 'net/https'
require 'uri'
require 'hub/context'
require 'hub/ssh_config'
rescue LoadError
abort $!
end
## helper methods
include Hub::Context
def get(url)
uri = URI(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs')
case response = http.request_get(uri.request_uri)
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('https://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'
(File.exist?(conf) && File.read(conf) =~ /\blanguage:\s*(\w+)\b/) ?
(%w[java scala groovy clojure].include?($1) ? 'jvm' : $1) :
'common'
end
# check if build is waiting in the queue
if queue = get("https://travis-ci.org/jobs.json?state=created&queue=builds.#{queue_name}") and !queue.empty?
repo_id = builds.any? ? builds.first['repository_id'] :
get('https://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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment