in buildkite/bazel_auto_sheriff.py [0:0]
def _analyze_for_downstream_pipeline_result(self):
self._log("INFO", "")
self._log("PASSED", "***Analyze failures in downstream pipeline***")
# Report failed tasks
self._log("WARNING", "The following tasks are failing in downstream pipeline")
self._print_job_list([info for _, info in self.downstream_result["tasks"].items() if info["state"] != "passed"])
# Retry all failed tasks
self._log("PASSED", "Retry failed downstream pipeline tasks...")
retry_per_failed_task = self._retry_failed_jobs(self.downstream_result, DOWNSTREAM_PIPELINE_CLIENT)
# Report tasks that succeeded after retry
succeeded_tasks = []
for task, info in retry_per_failed_task.items():
if info["state"] == "passed":
succeeded_tasks.append(info)
self.downstream_result["tasks"][task]["flaky"] = True
if succeeded_tasks:
self._log("WARNING", "The following tasks succeeded after retry, they might be flaky")
self._print_job_list(succeeded_tasks)
# Report tasks that are still failing after retry
still_failing_tasks = []
failing_task_names = []
for task, info in retry_per_failed_task.items():
if info["state"] != "passed":
still_failing_tasks.append(info)
failing_task_names.append(task)
self.downstream_result["tasks"][task]["broken"] = True
if not still_failing_tasks:
return
self._log("FAIL", f"The following tasks are still failing after retry, they are probably broken due to recent Bazel changes.")
self._print_job_list(still_failing_tasks)
# Do bisect for still failing jobs
self._log("PASSED", f"Bisect for still failing tasks...")
bisect_build = self._trigger_bisect(failing_task_names)
bisect_build = CULPRIT_FINDER_PIPELINE_CLIENT.wait_build_to_finish(build_number = bisect_build["number"], logger = self)
bisect_result_by_task = {}
for task in failing_task_names:
for job in bisect_build["jobs"]:
if ("--task_name=" + task) in job["command"]:
bisect_result_by_task[task], culprit = self._determine_bisect_result(job)
if culprit:
self.downstream_result["tasks"][task]["culprit"] = culprit
if task not in bisect_result_by_task:
error = f"Bisect job for task {task} is missing in " + bisect_build["web_url"]
self._log("SERIOUS", error)
raise bazelci.BuildkiteException(error)
# Report bisect result
for task, result in bisect_result_by_task.items():
self._log("WARNING", "Bisect result for " + self.downstream_result["tasks"][task]["name"])
self._log("INFO", result)