Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(512)

Side by Side Diff: appengine/findit/waterfall/detect_first_failure_pipeline.py

Issue 1886673002: [Findit] Differentiate compile failures and test failures. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import base64 5 import base64
6 import json 6 import json
7 7
8 from common import constants
8 from common.http_client_appengine import HttpClientAppengine as HttpClient 9 from common.http_client_appengine import HttpClientAppengine as HttpClient
9 from common.pipeline_wrapper import BasePipeline 10 from common.pipeline_wrapper import BasePipeline
10 from common.pipeline_wrapper import pipeline 11 from common.pipeline_wrapper import pipeline
12 from common.waterfall import failure_type
11 from model.wf_analysis import WfAnalysis 13 from model.wf_analysis import WfAnalysis
12 from model.wf_step import WfStep 14 from model.wf_step import WfStep
13 from waterfall import build_util 15 from waterfall import build_util
14 from waterfall import buildbot 16 from waterfall import buildbot
15 from waterfall import swarming_util 17 from waterfall import swarming_util
16 18
17 19
18 _MAX_BUILDS_TO_CHECK = 20 20 _MAX_BUILDS_TO_CHECK = 20
19 21
20 22
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 failed_step, http_client) 362 failed_step, http_client)
361 363
362 if result: # pragma: no cover 364 if result: # pragma: no cover
363 # Iterates backwards to get a more precise failed_steps info. 365 # Iterates backwards to get a more precise failed_steps info.
364 self._UpdateFirstFailureOnTestLevel( 366 self._UpdateFirstFailureOnTestLevel(
365 master_name, builder_name, build_number, step_name, 367 master_name, builder_name, build_number, step_name,
366 failed_step, http_client) 368 failed_step, http_client)
367 369
368 self._UpdateFailureInfoBuilds(failed_steps, builds) 370 self._UpdateFailureInfoBuilds(failed_steps, builds)
369 371
372 @staticmethod
373 def _GetFailureType(build_info):
374 if not build_info.failed_steps:
375 return failure_type.UNKNOWN
376 if constants.COMPILE_STEP_NAME in build_info.failed_steps:
377 return failure_type.COMPILE
378 # TODO(http://crbug.com/602733): differentiate test steps from infra ones.
379 return failure_type.TEST
380
370 # Arguments number differs from overridden method - pylint: disable=W0221 381 # Arguments number differs from overridden method - pylint: disable=W0221
371 def run(self, master_name, builder_name, build_number): 382 def run(self, master_name, builder_name, build_number):
372 """ 383 """
373 Args: 384 Args:
374 master_name (str): the master name of a build. 385 master_name (str): the master name of a build.
375 builder_name (str): the builder name of a build. 386 builder_name (str): the builder name of a build.
376 build_number (int): the build number of a build. 387 build_number (int): the build number of a build.
377 388
378 Returns: 389 Returns:
379 A dict in the following form: 390 A dict in the following form:
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 ], 422 ],
412 } 423 }
413 } 424 }
414 } 425 }
415 """ 426 """
416 build_info = self._ExtractBuildInfo(master_name, builder_name, build_number) 427 build_info = self._ExtractBuildInfo(master_name, builder_name, build_number)
417 428
418 if not build_info: # pragma: no cover 429 if not build_info: # pragma: no cover
419 raise pipeline.Retry('Failed to extract build info.') 430 raise pipeline.Retry('Failed to extract build info.')
420 431
432 build_failure_type = self._GetFailureType(build_info)
433
421 failure_info = { 434 failure_info = {
422 'failed': True, 435 'failed': True,
423 'master_name': master_name, 436 'master_name': master_name,
424 'builder_name': builder_name, 437 'builder_name': builder_name,
425 'build_number': build_number, 438 'build_number': build_number,
426 'chromium_revision': build_info.chromium_revision, 439 'chromium_revision': build_info.chromium_revision,
427 'builds': {}, 440 'builds': {},
428 'failed_steps': {}, 441 'failed_steps': {},
442 'failure_type': build_failure_type,
429 } 443 }
430 444
431 if (build_info.result == buildbot.SUCCESS or 445 if build_info.result == buildbot.SUCCESS or not build_info.failed_steps:
432 not build_info.failed_steps):
433 failure_info['failed'] = False 446 failure_info['failed'] = False
434 return failure_info 447 return failure_info
435 448
436 builds = dict() 449 builds = dict()
437 self._SaveBlamelistAndChromiumRevisionIntoDict(build_info, builds) 450 self._SaveBlamelistAndChromiumRevisionIntoDict(build_info, builds)
438 451
439 failed_steps = self._CreateADictOfFailedSteps(build_info) 452 failed_steps = self._CreateADictOfFailedSteps(build_info)
440 453
441 # Checks first failed builds for each failed step. 454 # Checks first failed builds for each failed step.
442 self._CheckForFirstKnownFailure( 455 self._CheckForFirstKnownFailure(
443 master_name, builder_name, build_number, failed_steps, builds) 456 master_name, builder_name, build_number, failed_steps, builds)
444 457
445 # Checks first failed builds for each failed test. 458 if build_failure_type == failure_type.TEST:
446 self._CheckFirstKnownFailureForSwarmingTests( 459 # Checks first failed builds for each failed test.
447 master_name, builder_name, build_number, failed_steps, builds) 460 self._CheckFirstKnownFailureForSwarmingTests(
461 master_name, builder_name, build_number, failed_steps, builds)
448 462
449 failure_info['builds'] = builds 463 failure_info['builds'] = builds
450 failure_info['failed_steps'] = failed_steps 464 failure_info['failed_steps'] = failed_steps
451 465
452 analysis = WfAnalysis.Get(master_name, builder_name, build_number) 466 analysis = WfAnalysis.Get(master_name, builder_name, build_number)
453 analysis.not_passed_steps = build_info.not_passed_steps 467 analysis.not_passed_steps = build_info.not_passed_steps
468 analysis.build_failure_type = build_failure_type
454 analysis.put() 469 analysis.put()
455 470
456 return failure_info 471 return failure_info
OLDNEW
« no previous file with comments | « appengine/findit/model/wf_analysis.py ('k') | appengine/findit/waterfall/test/data/m_b_221.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698