class BotBuilder
Public Instance Methods
create_bot(short_name, long_name, branch, scm_url, project_path, scheme_name, devices = [])
click to toggle source
# File lib/bot_builder.rb, line 26 def create_bot(short_name, long_name, branch, scm_url, project_path, scheme_name, devices = []) device_guids = find_guids_for_devices(devices) if (device_guids.count != devices.count) puts "Some of the following devices could not be found on the server: #{devices}" exit 1 end scm_guid = find_guid_for_scm_url(scm_url) if (scm_guid.nil? || scm_guid.empty?) puts "Could not find repository on the server #{scm_url}" exit 1 end # Create the bot buildSchemeKey = (project_path =~ /xcworkspace/) ? :buildWorkspacePath : :buildProjectPath service_requests = [ service_request('createBotWithProperties:', [ { shortName: short_name, longName: long_name, extendedAttributes: { scmInfo: { "/" => { scmBranch: branch, } }, scmInfoGUIDMap: { "/" => scm_guid }, buildSchemeKey => project_path, buildSchemeName: scheme_name, pollForSCMChanges: false, buildOnTrigger: false, buildFromClean: true, integratePerformsAnalyze: true, integratePerformsTest: true, integratePerformsArchive: false, deviceSpecification: "specificDevices", deviceInfo: device_guids }, notifyCommitterOnSuccess: false, notifyCommitterOnFailure: false, type: "com.apple.entity.Bot" } ]) ] bot_info = batch_service_request(service_requests) bot_guid = bot_info['responses'][0]['response']['guid'] puts "BOT Created #{bot_guid} #{short_name}" # Start the bot start_bot bot_guid bot_guid end
delete_bot(guid)
click to toggle source
# File lib/bot_builder.rb, line 14 def delete_bot(guid) success = false service_requests = [ service_request('deleteBotWithGUID:', [guid]) ] delete_info = batch_service_request(service_requests) if (delete_info['responses'][0]['responseStatus'] == 'succeeded') puts "BOT Deleted #{guid}" success = true else puts "Error deleting BOT #{guid}" end end
devices()
click to toggle source
# File lib/bot_builder.rb, line 122 def devices device_info = get_device_info device_info.each do |device| puts device_string_for_device(device) end end
start_bot(bot_guid)
click to toggle source
# File lib/bot_builder.rb, line 85 def start_bot(bot_guid) service_requests = [ service_request('startBotRunForBotGUID:', [bot_guid]) ] bot_start_info = batch_service_request(service_requests) puts "BOT Started #{bot_guid}" end
status()
click to toggle source
# File lib/bot_builder.rb, line 116 def status status_of_all_bots.values.each do |bot| puts "#{bot.status_url} #{bot.latest_run_status} #{bot.latest_run_sub_status}" end end
status_of_all_bots()
click to toggle source
# File lib/bot_builder.rb, line 91 def status_of_all_bots # After immediately creating: latest_run_status "" run_sub_status "" # While running: latest_run_status "running" run_sub_status "" # After completion: latest_run_status "completed" run_sub_status "build-failed|build-errors|test-failures|warnings|analysis-issues|succeeded" service_requests = [ service_request('query:', [ { fields: ['guid','tinyID','latestRunStatus','latestRunSubStatus'], entityTypes: ["com.apple.entity.Bot"] } ], 'SearchService') ] status_info = batch_service_request(service_requests) results = status_info['responses'][0]['response']['results'] statuses = {} results.each do |result| bot = OpenStruct.new result['entity'] bot.status_url = "http://#{BotConfig.instance.xcode_server_hostname}/xcode/bots/#{bot.tinyID}" bot.latest_run_status = (bot.latestRunStatus.nil? || bot.latestRunStatus.empty?) ? :unknown : bot.latestRunStatus.to_sym bot.latest_run_sub_status = (bot.latestRunSubStatus.nil? || bot.latestRunSubStatus.empty?) ? :unknown : bot.latestRunSubStatus.to_sym bot.short_name = bot.tinyID bot.short_name_without_version = bot.short_name.sub(/_v\d*$/, '_v') statuses[bot.short_name_without_version] = bot end statuses end
Private Instance Methods
batch_service_request(service_requests)
click to toggle source
# File lib/bot_builder.rb, line 186 def batch_service_request(service_requests) payload = { type: 'com.apple.BatchServiceRequest' , requests: service_requests } http = Net::HTTP.new(BotConfig.instance.xcode_server_hostname) request = Net::HTTP::Put.new('/collabdproxy') request['Content-Type'] = 'application/json; charset=UTF-8' request['Cookie'] = "cc.collabd_session_guid=#{@session_guid}" request.body = payload.to_json response = http.request(request) json = JSON.parse(response.body) # response_status = json['responses'][0]['responseStatus'] # puts "Result status #{response_status}" json end
device_string_for_device(device)
click to toggle source
# File lib/bot_builder.rb, line 154 def device_string_for_device(device) "#{device['adcDevicePlatform']} #{device['adcDeviceName']} #{device['adcDeviceSoftwareVersion']}" end
find_guid_for_scm_url(scm_url)
click to toggle source
# File lib/bot_builder.rb, line 131 def find_guid_for_scm_url(scm_url) scm_info = get_scm_info scm_guid = nil scm_info.each do |scm| if (scm['scmRepoPath'] == scm_url) scm_guid = scm['scmGUID'] end end scm_guid end
find_guids_for_devices(devices)
click to toggle source
# File lib/bot_builder.rb, line 142 def find_guids_for_devices(devices) device_info = get_device_info device_guids = [] device_info.each do |device| device_string = device_string_for_device device if (devices.include? device_string) device_guids << device['guid'] end end device_guids end
get_device_info()
click to toggle source
# File lib/bot_builder.rb, line 158 def get_device_info # Put to get device and Device Info service_requests = [ service_request('allDevices', []) ] device_info = batch_service_request(service_requests)['responses'][0]['response'] device_info end
get_scm_info()
click to toggle source
# File lib/bot_builder.rb, line 167 def get_scm_info # Put to get device and Device Info service_requests = [ service_request('findAllSCMInfos', []) ] scm_info = batch_service_request(service_requests)['responses'][0]['response'] scm_info end
get_session_guid()
click to toggle source
# File lib/bot_builder.rb, line 176 def get_session_guid # Get the guid if (@session_guid == nil) response = Net::HTTP.get_response(URI.parse("http://#{BotConfig.instance.xcode_server_hostname}/xcode")) cookies = CGI::Cookie::parse(response['set-cookie']) @session_guid = cookies['cc.collabd_session_guid'] end @session_guid end
service_request(name, arguments, service = 'XCBotService')
click to toggle source
# File lib/bot_builder.rb, line 203 def service_request(name, arguments, service = 'XCBotService') get_session_guid { type: 'com.apple.ServiceRequest', arguments: arguments, sessionGUID: @session_guid, serviceName: service, methodName: name, expandReferencedObjects: false } end