예제 #1
0
    def testGetFirstFailuresInCurrentBuildOnlyStepFailedBefore(self):
        build_122_info = {
            'id': 8000000000122,
            'number': self.build_number - 1,
            'commit_id': 'git_sha_122'
        }
        build_121_info = {
            'id': 8000000000121,
            'number': self.build_number - 2,
            'commit_id': 'git_sha_121'
        }

        failures = {
            'compile': {
                'failures': {},
                'first_failed_build': build_122_info,
                'last_passed_build': build_121_info,
            },
        }

        expected_res = {'failures': {}, 'last_passed_build': None}

        self.assertEqual(
            expected_res,
            pre_compile_analysis.GetFirstFailuresInCurrentBuild(
                self.context, self.build, failures))
예제 #2
0
    def testGetFirstFailuresInCurrentBuildNoFirstFailures(self):
        build_122_info = {
            'id': 8000000000122,
            'number': self.build_number - 1,
            'commit_id': 'git_sha_122'
        }

        build_121_info = {
            'id': 8000000000121,
            'number': self.build_number - 2,
            'commit_id': 'git_sha_121'
        }

        failures = {
            'compile': {
                'failures': {
                    frozenset(['target1', 'target2']): {
                        'rule': 'CXX',
                        'first_failed_build': build_122_info,
                        'last_passed_build': build_121_info,
                    },
                },
                'first_failed_build': build_122_info,
                'last_passed_build': build_121_info,
            },
        }

        expected_res = {'failures': {}, 'last_passed_build': None}

        self.assertEqual(
            expected_res,
            pre_compile_analysis.GetFirstFailuresInCurrentBuild(
                self.context, self.build, failures))
예제 #3
0
    def testGetFirstFailuresInCurrentBuildFailureStartedInDifferentBuild(self):
        build_122_info = {
            'id': 8000000000122,
            'number': self.build_number - 1,
            'commit_id': 'git_sha_122'
        }
        build_121_info = {
            'id': 8000000000121,
            'number': self.build_number - 2,
            'commit_id': 'git_sha_121'
        }

        failures = {
            'compile': {
                'failures': {
                    frozenset(['target1', 'target2']): {
                        'rule': 'CXX',
                        'first_failed_build': self.build_info,
                        'last_passed_build': build_122_info,
                    },
                    frozenset(['target3']): {
                        'rule': 'ACTION',
                        'first_failed_build': build_122_info,
                        'last_passed_build': None,
                    },
                    frozenset(['target4']): {
                        'rule': 'ACTION',
                        'first_failed_build': self.build_info,
                        'last_passed_build': build_121_info,
                    },
                },
                'first_failed_build': build_122_info,
                'last_passed_build': None,
            },
        }

        expected_res = {
            'failures': {
                'compile': {
                    'output_targets': [{'target4'}, {'target1', 'target2'}],
                    'last_passed_build': build_121_info,
                },
            },
            'last_passed_build': build_121_info
        }

        self.assertEqual(
            expected_res,
            pre_compile_analysis.GetFirstFailuresInCurrentBuild(
                self.context, self.build, failures))
예제 #4
0
    def testGetFirstFailuresInCurrentBuildNoLastPass(self):

        failures = {
            'compile': {
                'failures': {
                    frozenset(['target1', 'target2']): {
                        'rule': 'CXX',
                        'first_failed_build': self.build_info,
                        'last_passed_build': None,
                    },
                },
                'first_failed_build': self.build_info,
                'last_passed_build': None,
            },
        }

        expected_res = {'failures': {}, 'last_passed_build': None}

        self.assertEqual(
            expected_res,
            pre_compile_analysis.GetFirstFailuresInCurrentBuild(
                self.context, self.build, failures))
예제 #5
0
def AnalyzeCompileFailure(context, build, compile_steps):
  """Analyzes compile failure from a failed ci/postsubmit build.

  Args:
    context (findit_v2.services.context.Context): Scope of the analysis.
    build (buildbucket build.proto): ALL info about the build.
    compile_steps (list of buildbucket step.proto): The failed compile steps.

  Returns:
    (bool): Returns True if a new analysis starts, otherwise False.
  """
  luci_project = context.luci_project_name
  if luci_project == 'chromium':
    logging.warning('Findit does not support chromium project in v2.')
    return False

  project_api = projects.GetProjectAPI(luci_project)
  if not project_api:
    logging.debug('Unsupported project %s', luci_project)
    return False

  # Project config for if failures should be grouped to reduce duplicated
  # analyses.
  should_group_failures = projects.PROJECT_CFG.get(
      luci_project, {}).get('should_group_failures')

  detailed_compile_failures = project_api.GetCompileFailures(
      build, compile_steps)
  # Checks previous builds to look for first time failures for all the failures
  # in current failed build.
  pre_compile_analysis.UpdateCompileFailuresWithFirstFailureInfo(
      context, build, detailed_compile_failures)
  pre_compile_analysis.SaveCompileFailures(context, build,
                                           detailed_compile_failures)

  # Looks for the failures that started to fail in the current build.
  first_failures_in_current_build = (
      pre_compile_analysis.GetFirstFailuresInCurrentBuild(
          context, build, detailed_compile_failures))
  if not first_failures_in_current_build.get('failures'):
    logging.info(
        'No new analysis for build %d because all failures have '
        'happened in previous builds.', build.id)
    return False

  # Filters out the first failures with existing failure group.
  if should_group_failures:
    failures_without_existing_group = (
        pre_compile_analysis.GetFirstFailuresInCurrentBuildWithoutGroup(
            context, build, first_failures_in_current_build))
  else:
    failures_without_existing_group = first_failures_in_current_build

  if not failures_without_existing_group.get('failures'):
    logging.info(
        'All failures have matching failure groups in build %s,'
        ' no need to start a new analysis.', build.id)
    return False

  # Start a new analysis to analyze the first time failures.
  pre_compile_analysis.SaveCompileAnalysis(
      context, build, failures_without_existing_group, should_group_failures)
  compile_failure_rerun_analysis.RerunBasedAnalysis(context, build.id, build)
  return True