diff --git a/recipes/README.recipes.md b/recipes/README.recipes.md index 0e5f83ebf..ce6755233 100644 --- a/recipes/README.recipes.md +++ b/recipes/README.recipes.md @@ -795,37 +795,31 @@ Returns: #### **class [TryserverApi](/recipes/recipe_modules/tryserver/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):** -— **def [add\_failure\_reason](/recipes/recipe_modules/tryserver/api.py#237)(self, reason):** - -Records a more detailed reason why build is failing. - -The reason can be any JSON-serializable object. - -  **@property**
— **def [gerrit\_change](/recipes/recipe_modules/tryserver/api.py#34)(self):** +  **@property**
— **def [gerrit\_change](/recipes/recipe_modules/tryserver/api.py#32)(self):** Returns current gerrit change, if there is exactly one. Returns a self.m.buildbucket.common_pb2.GerritChange or None. -  **@property**
— **def [gerrit\_change\_fetch\_ref](/recipes/recipe_modules/tryserver/api.py#98)(self):** +  **@property**
— **def [gerrit\_change\_fetch\_ref](/recipes/recipe_modules/tryserver/api.py#96)(self):** Returns gerrit patch ref, e.g. "refs/heads/45/12345/6, or None. Populated iff gerrit_change is populated. -  **@property**
— **def [gerrit\_change\_repo\_url](/recipes/recipe_modules/tryserver/api.py#42)(self):** +  **@property**
— **def [gerrit\_change\_repo\_url](/recipes/recipe_modules/tryserver/api.py#40)(self):** Returns canonical URL of the gitiles repo of the current Gerrit CL. Populated iff gerrit_change is populated. -  **@property**
— **def [gerrit\_change\_target\_ref](/recipes/recipe_modules/tryserver/api.py#107)(self):** +  **@property**
— **def [gerrit\_change\_target\_ref](/recipes/recipe_modules/tryserver/api.py#105)(self):** Returns gerrit change destination ref, e.g. "refs/heads/master". Populated iff gerrit_change is populated. -— **def [get\_files\_affected\_by\_patch](/recipes/recipe_modules/tryserver/api.py#137)(self, patch_root, \*\*kwargs):** +— **def [get\_files\_affected\_by\_patch](/recipes/recipe_modules/tryserver/api.py#135)(self, patch_root, \*\*kwargs):** Returns list of paths to files affected by the patch. @@ -835,52 +829,43 @@ Argument: Returned paths will be relative to to patch_root. -— **def [get\_footer](/recipes/recipe_modules/tryserver/api.py#295)(self, tag, patch_text=None):** +— **def [get\_footer](/recipes/recipe_modules/tryserver/api.py#255)(self, tag, patch_text=None):** Gets a specific tag from a CL description -— **def [get\_footers](/recipes/recipe_modules/tryserver/api.py#275)(self, patch_text=None):** +— **def [get\_footers](/recipes/recipe_modules/tryserver/api.py#235)(self, patch_text=None):** Retrieves footers from the patch description. footers are machine readable tags embedded in commit messages. See git-footers documentation for more information. -— **def [initialize](/recipes/recipe_modules/tryserver/api.py#23)(self):** +— **def [initialize](/recipes/recipe_modules/tryserver/api.py#21)(self):** -  **@property**
— **def [is\_gerrit\_issue](/recipes/recipe_modules/tryserver/api.py#121)(self):** +  **@property**
— **def [is\_gerrit\_issue](/recipes/recipe_modules/tryserver/api.py#119)(self):** Returns true iff the properties exist to match a Gerrit issue. -  **@property**
— **def [is\_patch\_in\_git](/recipes/recipe_modules/tryserver/api.py#131)(self):** +  **@property**
— **def [is\_patch\_in\_git](/recipes/recipe_modules/tryserver/api.py#129)(self):** -  **@property**
— **def [is\_tryserver](/recipes/recipe_modules/tryserver/api.py#116)(self):** +  **@property**
— **def [is\_tryserver](/recipes/recipe_modules/tryserver/api.py#114)(self):** Returns true iff we have a change to check out. -— **def [normalize\_footer\_name](/recipes/recipe_modules/tryserver/api.py#299)(self, footer):** +— **def [normalize\_footer\_name](/recipes/recipe_modules/tryserver/api.py#259)(self, footer):** -— **def [set\_compile\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#200)(self):** +— **def [set\_compile\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#198)(self):** Mark the tryjob result as a compile failure. -— **def [set\_do\_not\_retry\_build](/recipes/recipe_modules/tryserver/api.py#186)(self):** +— **def [set\_do\_not\_retry\_build](/recipes/recipe_modules/tryserver/api.py#184)(self):** A flag to indicate the build should not be retried by the CQ. This mechanism is used to reduce CQ duration when retrying will likely return an identical result. -  **@contextlib.contextmanager**
— **def [set\_failure\_hash](/recipes/recipe_modules/tryserver/api.py#246)(self):** - -Context manager that sets a failure_hash build property on StepFailure. - -This can be used to easily compare whether two builds have failed -for the same reason. For example, if a patch is bad (breaks something), -we'd expect it to always break in the same way. Different failures -for the same patch are usually a sign of flakiness. - -— **def [set\_invalid\_test\_results\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#212)(self):** +— **def [set\_invalid\_test\_results\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#210)(self):** Mark the tryjob result as having invalid test results. @@ -888,32 +873,32 @@ This means we run some tests, but the results were not valid (e.g. no list of specific test cases that failed, or too many tests failing, etc). -— **def [set\_patch\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#196)(self):** +— **def [set\_patch\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#194)(self):** Mark the tryjob result as failure to apply the patch. -— **def [set\_subproject\_tag](/recipes/recipe_modules/tryserver/api.py#164)(self, subproject_tag):** +— **def [set\_subproject\_tag](/recipes/recipe_modules/tryserver/api.py#162)(self, subproject_tag):** Adds a subproject tag to the build. This can be used to distinguish between builds that execute different steps depending on what was patched, e.g. blink vs. pure chromium patches. -— **def [set\_test\_expired\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#229)(self):** +— **def [set\_test\_expired\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#227)(self):** Mark the tryjob result as a test expiration. This means a test task expired and was never scheduled, most likely due to lack of capacity. -— **def [set\_test\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#204)(self):** +— **def [set\_test\_failure\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#202)(self):** Mark the tryjob result as a test failure. This means we started running actual tests (not prerequisite steps like checkout or compile), and some of these tests have failed. -— **def [set\_test\_timeout\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#221)(self):** +— **def [set\_test\_timeout\_tryjob\_result](/recipes/recipe_modules/tryserver/api.py#219)(self):** Mark the tryjob result as a test timeout. diff --git a/recipes/recipe_modules/tryserver/api.py b/recipes/recipe_modules/tryserver/api.py index 2da8ada17..547560d4e 100644 --- a/recipes/recipe_modules/tryserver/api.py +++ b/recipes/recipe_modules/tryserver/api.py @@ -11,8 +11,6 @@ from recipe_engine import recipe_api class TryserverApi(recipe_api.RecipeApi): def __init__(self, *args, **kwargs): super(TryserverApi, self).__init__(*args, **kwargs) - self._failure_reasons = [] - self._gerrit_change = None # self.m.buildbucket.common_pb2.GerritChange self._gerrit_change_repo_url = None @@ -234,44 +232,6 @@ class TryserverApi(recipe_api.RecipeApi): """ self._set_failure_type('TEST_EXPIRED') - def add_failure_reason(self, reason): - """ - Records a more detailed reason why build is failing. - - The reason can be any JSON-serializable object. - """ - assert self.m.json.is_serializable(reason) - self._failure_reasons.append(reason) - - @contextlib.contextmanager - def set_failure_hash(self): - """ - Context manager that sets a failure_hash build property on StepFailure. - - This can be used to easily compare whether two builds have failed - for the same reason. For example, if a patch is bad (breaks something), - we'd expect it to always break in the same way. Different failures - for the same patch are usually a sign of flakiness. - """ - try: - yield - except self.m.step.StepFailure as e: - self.add_failure_reason(e.reason) - - # TODO(iannucci): add API to set properties regardless of the current - # step. - try: - step_result = self.m.step.active_result - except ValueError: - step_result = None - if step_result: - failure_hash = hashlib.sha1() - failure_hash.update(self.m.json.dumps(self._failure_reasons)) - step_result.presentation.properties['failure_hash'] = ( - failure_hash.hexdigest()) - - raise e - def get_footers(self, patch_text=None): """Retrieves footers from the patch description. diff --git a/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json b/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json deleted file mode 100644 index 63d967732..000000000 --- a/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "failure": { - "failure": {}, - "humanReason": "boom!" - }, - "name": "$result" - } -] \ No newline at end of file diff --git a/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json b/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json index 3c04236c3..db2538bdc 100644 --- a/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +++ b/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json @@ -189,23 +189,6 @@ ] }, { - "cmd": [ - "python", - "-u", - "import sys; sys.exit(1)" - ], - "name": "fail", - "~followup_annotations": [ - "@@@STEP_TEXT@foo@@@", - "@@@SET_BUILD_PROPERTY@failure_hash@\"622c0c52e65e6d0dc78957dd113ad343e57ae6d2\"@@@", - "@@@STEP_FAILURE@@@" - ] - }, - { - "failure": { - "failure": {}, - "humanReason": "Step('fail') (retcode: 1)" - }, "name": "$result" } ] \ No newline at end of file diff --git a/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json b/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json index 288bcdbbd..348c161da 100644 --- a/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +++ b/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json @@ -189,23 +189,6 @@ ] }, { - "cmd": [ - "python", - "-u", - "import sys; sys.exit(1)" - ], - "name": "fail", - "~followup_annotations": [ - "@@@STEP_TEXT@foo@@@", - "@@@SET_BUILD_PROPERTY@failure_hash@\"622c0c52e65e6d0dc78957dd113ad343e57ae6d2\"@@@", - "@@@STEP_FAILURE@@@" - ] - }, - { - "failure": { - "failure": {}, - "humanReason": "Step('fail') (retcode: 1)" - }, "name": "$result" } ] \ No newline at end of file diff --git a/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json b/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json index 24af03821..d5a7fb723 100644 --- a/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +++ b/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json @@ -23,23 +23,6 @@ ] }, { - "cmd": [ - "python", - "-u", - "import sys; sys.exit(1)" - ], - "name": "fail", - "~followup_annotations": [ - "@@@STEP_TEXT@foo@@@", - "@@@SET_BUILD_PROPERTY@failure_hash@\"622c0c52e65e6d0dc78957dd113ad343e57ae6d2\"@@@", - "@@@STEP_FAILURE@@@" - ] - }, - { - "failure": { - "failure": {}, - "humanReason": "Step('fail') (retcode: 1)" - }, "name": "$result" } ] \ No newline at end of file diff --git a/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json b/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json index 3142397f1..869505a40 100644 --- a/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +++ b/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json @@ -24,23 +24,6 @@ ] }, { - "cmd": [ - "python", - "-u", - "import sys; sys.exit(1)" - ], - "name": "fail", - "~followup_annotations": [ - "@@@STEP_TEXT@foo@@@", - "@@@SET_BUILD_PROPERTY@failure_hash@\"622c0c52e65e6d0dc78957dd113ad343e57ae6d2\"@@@", - "@@@STEP_FAILURE@@@" - ] - }, - { - "failure": { - "failure": {}, - "humanReason": "Step('fail') (retcode: 1)" - }, "name": "$result" } ] \ No newline at end of file diff --git a/recipes/recipe_modules/tryserver/examples/full.py b/recipes/recipe_modules/tryserver/examples/full.py index 8913de5ba..ded683754 100644 --- a/recipes/recipe_modules/tryserver/examples/full.py +++ b/recipes/recipe_modules/tryserver/examples/full.py @@ -17,10 +17,6 @@ DEPS = [ def RunSteps(api): - if api.properties.get('set_failure_hash_with_no_steps'): - with api.tryserver.set_failure_hash(): - raise api.step.StepFailure('boom!') - api.path['checkout'] = api.path['start_dir'] if api.properties.get('patch_text'): api.step('patch_text test', [ @@ -56,9 +52,6 @@ def RunSteps(api): api.tryserver.normalize_footer_name('Cr-Commit-Position') - with api.tryserver.set_failure_hash(): - api.python.failing_step('fail', 'foo') - def GenTests(api): description_step = api.override_step_data( @@ -103,6 +96,3 @@ def GenTests(api): 'parse description (2)', api.json.output({'Foo': ['bar']})) ) - - yield (api.test('set_failure_hash_with_no_steps') + - api.properties(set_failure_hash_with_no_steps=True))