Sha256: d14a92d8e195deff75caedaeceb19b3ac08e72b2439d3a4b7953a328d5a074af

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

require "travis_parallel_sentinel/version"
require 'open-uri'
require 'json'
require 'ostruct'

TRAVIS_JOB_NUMBER = ENV['TRAVIS_JOB_NUMBER'].to_s.strip
TRAVIS_BUILD_ID   = ENV['TRAVIS_BUILD_ID'].to_s.strip

module TravisParallelSentinel
  def result(job)
    prefix = "#{job.number}="
    return prefix + 'running' if job.result.nil?
    return prefix + 'ok' if job.result == 0
    return prefix + 'failed'
  end
  def results(jobs)
    return jobs.collect{|job| result(job)}.join(', ')
  end

  def status(phase)
    raise "Unexpected phase #{phase}, expected 'script' or 'after'" unless %w{script after}.include?(phase.to_s.downcase)
    phase = phase.to_s.downcase.to_sym

    return :deploy  if TRAVIS_JOB_NUMBER == '' # no build matrix, so good to go
    return :ignore  unless TRAVIS_JOB_NUMBER =~ /\.1$/ # first job in the sequence is the deployment container

    while true
      builds = JSON.parse(open("https://api.travis-ci.org/builds/#{TRAVIS_BUILD_ID}").read)
      jobs = status['matrix'].collect{|job| OpenStruct.new(job)}
      if jobs.select{|job| job.number != TRAVIS_JOB_NUMBER || phase == :after}.detect{|job| job.result.nil?}
        STDERR.puts "waiting... #{results(jobs)}"
        sleep 5
      elsif jobs.detect{|job| job.result != 0}
        throw "Some jobs failed: #{results(jobs)}"
      else
        return :deploy
      end
    end
  end
  module_function :status
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
travis_parallel_sentinel-0.1.6 lib/travis_parallel_sentinel.rb