def prefill_builds_cache(cache, master_url, builder_name): # pragma: no cover master_name = master_name_from_url(master_url) builds_url = '%s/get_builds' % CBE_BASE params = {'master': master_name, 'builder': builder_name} response = requests.get(builds_url, params=params) builds = [] try: builds = response.json()['builds'] except ValueError: logging.error( 'Failed to parse JSON response from master: %s, builder: %s', master_name, builder_name) for build in builds: if not build.get('number'): index = builds.index(build) logging.error('build at index %s in %s missing number?', index, response.url) continue build_number = build['number'] key = cache_key_for_build(master_url, builder_name, build_number) cache.set(key, build) build_numbers = map(operator.itemgetter('number'), builds) logging.debug('Prefilled (%.1fs) %s for %s %s', response.elapsed.total_seconds(), string_helpers.re_range(build_numbers), master_name, builder_name) return build_numbers
def prefill_builds_cache(cache, master_url, builder_name): # pragma: no cover master_name = master_name_from_url(master_url) builds_url = '%s/get_builds' % CBE_BASE params = {'master': master_name, 'builder': builder_name} response = requests.get(builds_url, params=params) builds = [] try: builds = response.json()['builds'] except ValueError: logging.error( 'Failed to parse JSON response from master: %s, builder: %s', master_name, builder_name) for build in builds: if not build.get('number'): index = builds.index(build) logging.error( 'build at index %s in %s missing number?', index, response.url) continue build_number = build['number'] key = cache_key_for_build(master_url, builder_name, build_number) cache.set(key, build) build_numbers = map(operator.itemgetter('number'), builds) logging.debug('Prefilled (%.1fs) %s for %s %s', response.elapsed.total_seconds(), string_helpers.re_range(build_numbers), master_name, builder_name) return build_numbers
def test_re_range(self): self.assertEquals(string_helpers.re_range([3, 2, 1]), "1-3") self.assertEquals(string_helpers.re_range([1, 1]), "1, 1") self.assertEquals(string_helpers.re_range([1, 2, 2, 3]), "1-2, 2-3")
def compute_transition(cache, alert, recent_build_ids): # pragma: no cover master = alert['master_url'] builder = alert['builder_name'] step = alert['step_name'] reason = alert['reason'] previous_build_ids = [num for num in recent_build_ids if num < alert['last_failing_build']] def fetch_function(num): return buildbot.fetch_build_json(cache, master, builder, num) first_fail = fetch_function(alert['last_failing_build'])[0] last_pass = None builds_missing_steps = [] for build_id in previous_build_ids: build = fetch_function(build_id) # build is a tuple of the json and the origin of the data build_data = build[0] if not build_data: # fetch_build_json will already log critical in this case. continue matching_steps = [s for s in build_data['steps'] if s['name'] == step] if len(matching_steps) != 1: if not matching_steps: # This case is pretty common, so just warn all at once at the end. builds_missing_steps.append(build_data['number']) else: logging.error( '%s has unexpected number of %s steps: %s', build_data['number'], step, matching_steps) continue step_data = matching_steps[0] step_result = step_data['results'][0] if step_result not in NON_FAILING_RESULTS: if reason: reasons = reasons_for_failure( cache, step_data, build_data, builder, master) # This build doesn't seem to have this step reason, ignore it. if not reasons: continue # Failed, but our failure reason wasn't present! # FIXME: This is wrong for compile failures, and possibly # for test failures as well if not all tests are run... if reason not in reasons: last_pass = build_data break first_fail = build_data continue # None is 'didn't run', not a passing result. if step_result is None: continue last_pass = build_data break if builds_missing_steps: logging.warn( 'Builds %s missing step %s (%s %s).', string_helpers.re_range(builds_missing_steps), step, master, builder) return last_pass, first_fail
def test_re_range(self): self.assertEquals(string_helpers.re_range([3, 2, 1]), "1-3") self.assertEquals(string_helpers.re_range([1, 1]), "1, 1") self.assertEquals(string_helpers.re_range([1, 2, 2, 3]), "1-2, 2-3")