lib/runner.rb (70 lines of code) (raw):

require_relative 'build' require_relative 'network' module GitlabCi class Runner attr_accessor :current_build, :thread def initialize puts '* Gitlab CI Runner started' puts '* Waiting for builds' loop do if running? abort_if_timeout push_build update_build else get_build end sleep 5 end end private def running? @current_build end def abort_if_timeout if @current_build.running? && @current_build.running_too_long? @current_build.timeout_abort end end def update_build return unless @current_build.completed? puts "#{Time.now.to_s} | Completed build #{@current_build.id}, #{@current_build.state}." # Make sure we push latest build info submitted # before we clean build if push_build @current_build.cleanup @current_build = nil else # wait when ci server will be online again to submit build results end end def push_build case network.update_build(@current_build.id, @current_build.state, @current_build.trace) when :success # nothing to do here true when :aborted @current_build.abort true when :failure # nothing to do here, we simply assume this is a temporary failure communicating with the gitlab-ci server false end end def get_build build_data = network.get_build if build_data run(build_data) else false end end def network @network ||= Network.new end def run(build_data) @current_build = GitlabCi::Build.new(build_data) puts "#{Time.now.to_s} | Starting new build #{@current_build.id}..." @current_build.run puts "#{Time.now.to_s} | Build #{@current_build.id} started." end def collect_trace @current_build.trace end end end