require 'net/http' require 'rexml/document' require 'win32/sound' require 'yaml' include Win32 #Ruby script for controlling the build lamps. I.e. switch the lamps on/off according to if the build has failed or not. #Command from prompt: ruby continuous_builder_lamp_controller.rb config.yml class Builder #---------------------------------------------------------- # initialize. #---------------------------------------------------------- def initialize(config_file) @config_file_name = config_file @last_successful = nil read end #---------------------------------------------------------- # Read configuration files. #---------------------------------------------------------- def read config = YAML::load(File.open(@config_file_name)) #Continuous integration @bamboo = config['bamboo'] @bamboo_url= @bamboo['bamboo_url'] #Lamp Control @lamps = config['lamp_control'] #Sounds @sound = config['sound'] @build_names = @bamboo['build_names'] end #---------------------------------------------------------- # Checks a given build against bamboo. #---------------------------------------------------------- def bamboo_build_check failures = [] successes = [] @build_results = {} @build_names.each do |build_name| #Getting build result begin build_result_url = "#{@bamboo_url}/getLatestBuildResults.action?auth=#{@authentication_token}&buildKey=#{build_name}" buld_result_xml = REXML::Document.new Net::HTTP.get_response(URI.parse(build_result_url)).body build_result = buld_result_xml.root.elements["buildState"].text rescue print "Failed retrieving build result from bamboo! build name: #{build_name}" failure return end #Execute result failures << build_name unless build_result == "Successful" successes << build_name if build_result == "Successful" build_results[build_name] = build_result end failure if failures.length > 0 success unless failures.length > 0 end #---------------------------------------------------------- # Bamboo login #---------------------------------------------------------- def can_log_in_to_bamboo_server username = @bamboo['username'] password = @bamboo['password'] begin #Logging in login_url = "#{@bamboo_url}/login.action?username=#{username}&password=#{password}" loginxml = REXML::Document.new Net::HTTP.get_response(URI.parse(login_url)).body # get_response takes an URI object @authentication_token = loginxml.root.elements["auth"].text rescue print "Cannot log in to the bamboo server! Url: #{login_url}" #failure keep last state off nil end end def build_results @build_results end def build_names @build_names end #---------------------------------------------------------- # Run this part if the build was successful. #---------------------------------------------------------- #http://www.freeaudioclips.com/list.php?subcatid=42&cat=10&subcat=Sound+FX&defaultpager_current=9&defaultpager_next=1 def success unless @last_successful if @lamps command = @lamps['command'] green = @lamps['success'] red = @lamps['failure'] `#{command} #{green} on` `#{command} #{red} off` end unless @last_successful == nil play_sound 'success' if @sound end @last_successful = true end end #---------------------------------------------------------- # Run this part if the build have failed. #---------------------------------------------------------- def failure if @last_successful or @last_successful == nil if @lamps command = @lamps['command'] green = @lamps['success'] red = @lamps['failure'] `#{command} #{red} on` `#{command} #{green} off` end unless @last_successful == nil play_sound 'failure' if @sound end @last_successful = false end end def off command = @lamps['command'] green = @lamps['success'] red = @lamps['failure'] @last_successful = nil `#{command} #{red} off` `#{command} #{green} off` end def play_sound(result) begin @sound[result].each do |s| Sound.play(s) end rescue print 'Failed while playing Sound!' end end end #---------------------------------------------------------- # The program start and loops her forever. #---------------------------------------------------------- def loop puts 'USAGE: ruby continuous_builder_lamp_controller.rb config.yml config2.yml configN.yml' builder = [] builder << Builder.new('config.yml') unless ARGV[0] #Default ARGV.each do |arg| builder << Builder.new(arg) end while true do result = [] unless Time.now.hour == 0 print "Current time: #{Time.now} " begin builder.each do |ci| ci.read if ci.can_log_in_to_bamboo_server ci.bamboo_build_check ci.build_results.each do |build_name, build_result| print "#{build_name}: #{build_result} " end end end puts "" #new line sleep 10 rescue Exception => e puts " Exception in loop!", e.inspect ,e.backtrace puts "-------------------" builder.each do |ci| ci.off end sleep 40 end else print "Put in night modus" builder.each do |ci| ci.off end print "night! Good morning at 6 a.m." sleep 60*60*6 end end end loop