diff options
author | 2017-04-18 15:49:27 -0400 | |
---|---|---|
committer | 2017-04-19 11:24:24 +0000 | |
commit | e16fb7584a15802949d1eb8b4ad60952619da7d4 (patch) | |
tree | 948e2e2d4c9caf2a2994249559f9ba1680d48a97 /infra/bots/recipe_modules | |
parent | c1e9617e82a2d573c890ee17e69a3d4699800f05 (diff) |
Recipes: Use strict coverage, part 1
Shouldn't change any behavior.
Bug: skia:
Change-Id: I953e0da886a6d61096eba7915101f245a6cec741
Reviewed-on: https://skia-review.googlesource.com/13765
Reviewed-by: Ravi Mistry <rmistry@google.com>
Commit-Queue: Eric Boren <borenet@google.com>
Diffstat (limited to 'infra/bots/recipe_modules')
40 files changed, 2850 insertions, 88 deletions
diff --git a/infra/bots/recipe_modules/builder_name_schema/__init__.py b/infra/bots/recipe_modules/builder_name_schema/__init__.py index 0b1d7673b9..a3c9297009 100644 --- a/infra/bots/recipe_modules/builder_name_schema/__init__.py +++ b/infra/bots/recipe_modules/builder_name_schema/__init__.py @@ -4,7 +4,3 @@ DEPS = [ ] - - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/builder_name_schema/api.py b/infra/bots/recipe_modules/builder_name_schema/api.py index edfd683140..5ce05842c3 100644 --- a/infra/bots/recipe_modules/builder_name_schema/api.py +++ b/infra/bots/recipe_modules/builder_name_schema/api.py @@ -27,13 +27,8 @@ class BuilderNameSchemaApi(recipe_api.RecipeApi): self.BUILDER_ROLE_TEST = builder_name_schema.BUILDER_ROLE_TEST self.BUILDER_ROLES = builder_name_schema.BUILDER_ROLES - self.TRYBOT_NAME_SUFFIX = builder_name_schema.TRYBOT_NAME_SUFFIX - - def MakeBuilderName(self, *args, **kwargs): # pragma: no cover + def MakeBuilderName(self, *args, **kwargs): return builder_name_schema.MakeBuilderName(*args, **kwargs) - def IsTrybot(self, *args, **kwargs): # pragma: no cover - return builder_name_schema.IsTrybot(*args, **kwargs) - def DictForBuilderName(self, *args, **kwargs): return builder_name_schema.DictForBuilderName(*args, **kwargs) diff --git a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json index 6a8c92175b..62971ee975 100644 --- a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json +++ b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.json @@ -38,6 +38,5 @@ "configuration" ] }, - "builder_name_sep": "-", - "trybot_name_suffix": "Trybot" + "builder_name_sep": "-" } diff --git a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py index 8319789154..b004ead532 100644 --- a/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py +++ b/infra/bots/recipe_modules/builder_name_schema/builder_name_schema.py @@ -33,9 +33,6 @@ BUILDER_ROLES = (BUILDER_ROLE_CANARY, BUILDER_ROLE_PERF, BUILDER_ROLE_TEST) -# Suffix which distinguishes trybots from normal bots. -TRYBOT_NAME_SUFFIX = None - def _LoadSchema(): """ Load the builder naming schema from the JSON file. """ @@ -65,10 +62,6 @@ def _LoadSchema(): BUILDER_NAME_SEP = _UnicodeToStr( builder_name_schema_json['builder_name_sep']) - global TRYBOT_NAME_SUFFIX - TRYBOT_NAME_SUFFIX = _UnicodeToStr( - builder_name_schema_json['trybot_name_suffix']) - # Since the builder roles are dictionary keys, just assert that the global # variables above account for all of them. assert len(BUILDER_ROLES) == len(BUILDER_NAME_SCHEMA) @@ -79,8 +72,7 @@ def _LoadSchema(): _LoadSchema() -def MakeBuilderName(role, extra_config=None, is_trybot=False, - **kwargs): # pragma: no cover +def MakeBuilderName(role, extra_config=None, **kwargs): # pragma: no cover schema = BUILDER_NAME_SCHEMA.get(role) if not schema: # pragma: no cover raise ValueError('%s is not a recognized role.' % role) @@ -96,46 +88,9 @@ def MakeBuilderName(role, extra_config=None, is_trybot=False, name_parts.extend([kwargs[attribute] for attribute in schema]) if extra_config: name_parts.append(extra_config) - if is_trybot: - name_parts.append(TRYBOT_NAME_SUFFIX) return BUILDER_NAME_SEP.join(name_parts) -def IsTrybot(builder_name): # pragma: no cover - """ Returns true if builder_name refers to a trybot (as opposed to a - waterfall bot). """ - return builder_name.endswith(TRYBOT_NAME_SUFFIX) - - -def GetWaterfallBot(builder_name): # pragma: no cover - """Returns the name of the waterfall bot for this builder. If it is not a - trybot, builder_name is returned unchanged. If it is a trybot the name is - returned without the trybot suffix.""" - if not IsTrybot(builder_name): - return builder_name - return _WithoutSuffix(builder_name, BUILDER_NAME_SEP + TRYBOT_NAME_SUFFIX) - - -def TrybotName(builder_name): # pragma: no cover - """Returns the name of the trybot clone of this builder. - - If the given builder is a trybot, the name is returned unchanged. If not, the - TRYBOT_NAME_SUFFIX is appended. - """ - if builder_name.endswith(TRYBOT_NAME_SUFFIX): - return builder_name - return builder_name + BUILDER_NAME_SEP + TRYBOT_NAME_SUFFIX - - -def _WithoutSuffix(string, suffix): # pragma: no cover - """ Returns a copy of string 'string', but with suffix 'suffix' removed. - Raises ValueError if string does not end with suffix. """ - if not string.endswith(suffix): - raise ValueError('_WithoutSuffix: string %s does not end with suffix %s' % ( - string, suffix)) - return string[:-len(suffix)] - - def DictForBuilderName(builder_name): """Makes a dictionary containing details about the builder from its name.""" split_name = builder_name.split(BUILDER_NAME_SEP) @@ -146,12 +101,7 @@ def DictForBuilderName(builder_name): except: # pragma: no cover raise ValueError('Invalid builder name: %s' % builder_name) - result = {'is_trybot': False} - - if split_name[-1] == TRYBOT_NAME_SUFFIX: - result['is_trybot'] = True - split_name.pop() - + result = {} if split_name[0] in BUILDER_NAME_SCHEMA.keys(): key_list = BUILDER_NAME_SCHEMA[split_name[0]] result['role'] = pop_front() diff --git a/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json b/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json new file mode 100644 index 0000000000..7726ecb249 --- /dev/null +++ b/infra/bots/recipe_modules/builder_name_schema/example.expected/test.json @@ -0,0 +1,7 @@ +[ + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/builder_name_schema/example.py b/infra/bots/recipe_modules/builder_name_schema/example.py new file mode 100644 index 0000000000..451019fa46 --- /dev/null +++ b/infra/bots/recipe_modules/builder_name_schema/example.py @@ -0,0 +1,19 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'builder_name_schema', +] + + +def RunSteps(api): + name = 'Build-Ubuntu-Clang-x64-Release-Android' + d = api.builder_name_schema.DictForBuilderName(name) + got = api.builder_name_schema.MakeBuilderName(**d) + assert got == name + + +def GenTests(api): + yield api.test('test') diff --git a/infra/bots/recipe_modules/core/__init__.py b/infra/bots/recipe_modules/core/__init__.py index 2c66e77b82..9112c1c4f8 100644 --- a/infra/bots/recipe_modules/core/__init__.py +++ b/infra/bots/recipe_modules/core/__init__.py @@ -9,13 +9,9 @@ DEPS = [ 'depot_tools/tryserver', 'flavor', 'recipe_engine/path', - 'recipe_engine/platform', 'recipe_engine/properties', 'recipe_engine/python', 'recipe_engine/step', 'run', 'vars', ] - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/core/api.py b/infra/bots/recipe_modules/core/api.py index 005ee27733..28a5d1fa10 100644 --- a/infra/bots/recipe_modules/core/api.py +++ b/infra/bots/recipe_modules/core/api.py @@ -36,8 +36,8 @@ class SkiaApi(recipe_api.RecipeApi): def update_repo(self, parent_dir, repo): """Update an existing repo. This is safe to call without gen_steps.""" repo_path = parent_dir.join(repo.name) - if self.m.path.exists(repo_path): # pragma: nocover - if self.m.platform.is_win: + if self.m.path.exists(repo_path) or self._test_data.enabled: + if 'Win' in self.m.properties.get('buildername', ''): git = 'git.bat' else: git = 'git' diff --git a/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json b/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json new file mode 100644 index 0000000000..64b600d718 --- /dev/null +++ b/infra/bots/recipe_modules/core/example.expected/Housekeeper-Weekly-RecreateSKPs.json @@ -0,0 +1,210 @@ +[ + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[CUSTOM_/_B_WORK]", + "511" + ], + "infra_step": true, + "name": "makedirs checkout_path", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "git", + "remote", + "set-url", + "origin", + "https://skia.googlesource.com/skia.git" + ], + "cwd": "[CUSTOM_/_B_WORK]/skia", + "infra_step": true, + "name": "git remote set-url" + }, + { + "cmd": [ + "git", + "fetch" + ], + "cwd": "[CUSTOM_/_B_WORK]/skia", + "infra_step": true, + "name": "git fetch" + }, + { + "cmd": [ + "git", + "reset", + "--hard", + "abc123" + ], + "cwd": "[CUSTOM_/_B_WORK]/skia", + "infra_step": true, + "name": "git reset" + }, + { + "cmd": [ + "git", + "clean", + "-d", + "-f" + ], + "cwd": "[CUSTOM_/_B_WORK]/skia", + "infra_step": true, + "name": "git clean" + }, + { + "cmd": [ + "git", + "remote", + "set-url", + "origin", + "https://chromium.googlesource.com/chromium/src.git" + ], + "cwd": "[CUSTOM_/_B_WORK]/src", + "infra_step": true, + "name": "git remote set-url (2)" + }, + { + "cmd": [ + "git", + "fetch" + ], + "cwd": "[CUSTOM_/_B_WORK]/src", + "infra_step": true, + "name": "git fetch (2)" + }, + { + "cmd": [ + "git", + "reset", + "--hard", + "origin/lkgr" + ], + "cwd": "[CUSTOM_/_B_WORK]/src", + "infra_step": true, + "name": "git reset (2)" + }, + { + "cmd": [ + "git", + "clean", + "-d", + "-f" + ], + "cwd": "[CUSTOM_/_B_WORK]/src", + "infra_step": true, + "name": "git clean (2)" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py", + "--spec", + "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}, {'deps_file': '.DEPS.git', 'managed': False, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]", + "--patch_root", + "skia", + "--revision_mapping_file", + "{\"skia\": \"got_revision\"}", + "--git-cache-dir", + "[CUSTOM_/_B_CACHE]", + "--output_json", + "/path/to/tmp/json", + "--revision", + "skia@abc123", + "--revision", + "src@origin/lkgr", + "--output_manifest" + ], + "cwd": "[CUSTOM_/_B_WORK]", + "env": { + "GIT_HTTP_LOW_SPEED_LIMIT": "1000", + "GIT_HTTP_LOW_SPEED_TIME": "300", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]" + }, + "infra_step": true, + "name": "bot_update", + "~followup_annotations": [ + "@@@STEP_TEXT@Some step text@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@", + "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"src\": \"origin/lkgr\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@", + "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_PACKAGE_REPO[depot_tools]/gclient.py", + "runhooks" + ], + "cwd": "[CUSTOM_/_B_WORK]", + "env": { + "CPPFLAGS": "-DSK_ALLOW_CROSSPROCESS_PICTUREIMAGEFILTERS=1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]" + }, + "name": "gclient runhooks" + }, + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/tmp", + "511" + ], + "infra_step": true, + "name": "makedirs tmp_dir", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json b/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json new file mode 100644 index 0000000000..d22609abb3 --- /dev/null +++ b/infra/bots/recipe_modules/core/example.expected/flutter_trybot.json @@ -0,0 +1,142 @@ +[ + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[CUSTOM_/_B_WORK]/flutter", + "511" + ], + "infra_step": true, + "name": "makedirs checkout_path", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "git", + "remote", + "set-url", + "origin", + "https://github.com/flutter/engine.git" + ], + "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter", + "infra_step": true, + "name": "git remote set-url" + }, + { + "cmd": [ + "git", + "fetch" + ], + "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter", + "infra_step": true, + "name": "git fetch" + }, + { + "cmd": [ + "git", + "reset", + "--hard", + "origin/master" + ], + "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter", + "infra_step": true, + "name": "git reset" + }, + { + "cmd": [ + "git", + "clean", + "-d", + "-f" + ], + "cwd": "[CUSTOM_/_B_WORK]/flutter/src/flutter", + "infra_step": true, + "name": "git clean" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py", + "--spec", + "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src/flutter', 'url': 'https://github.com/flutter/engine.git'}]\ntarget_os = ['android']", + "--patch_root", + "src/third_party/skia", + "--revision_mapping_file", + "{\"src/flutter\": \"got_flutter_revision\", \"src/third_party/skia\": \"got_revision\"}", + "--git-cache-dir", + "[CUSTOM_/_B_CACHE]", + "--gerrit_repo", + "https://skia.googlesource.com/skia.git", + "--gerrit_ref", + "refs/changes/89/456789/12", + "--output_json", + "/path/to/tmp/json", + "--revision", + "src/flutter@origin/master", + "--revision", + "src/third_party/skia@abc123", + "--output_manifest" + ], + "cwd": "[CUSTOM_/_B_WORK]/flutter", + "env": { + "GIT_HTTP_LOW_SPEED_LIMIT": "1000", + "GIT_HTTP_LOW_SPEED_TIME": "300", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]" + }, + "infra_step": true, + "name": "bot_update", + "~followup_annotations": [ + "@@@STEP_TEXT@Some step text@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@", + "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"src/flutter\": \"origin/master\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"src/third_party/skia\": \"abc123\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"src/flutter\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src/flutter.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9221bca00ddbd888260084def81f09543281b952\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"src/third_party/skia\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src/third_party/skia.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src/third_party/skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"got_flutter_revision\": \"9221bca00ddbd888260084def81f09543281b952\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_flutter_revision_cp\": \"refs/heads/master@{#84512}\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#143121}\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"root\": \"src/flutter\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@SET_BUILD_PROPERTY@got_revision@\"d9c4a4d173a97ef2832b65636b4200bb93ea8ee1\"@@@", + "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#143121}\"@@@", + "@@@SET_BUILD_PROPERTY@got_flutter_revision_cp@\"refs/heads/master@{#84512}\"@@@", + "@@@SET_BUILD_PROPERTY@got_flutter_revision@\"9221bca00ddbd888260084def81f09543281b952\"@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json b/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json new file mode 100644 index 0000000000..2b14fe5d9f --- /dev/null +++ b/infra/bots/recipe_modules/core/example.expected/no_persistent_checkout.json @@ -0,0 +1,30 @@ +[ + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/tmp", + "511" + ], + "infra_step": true, + "name": "makedirs tmp_dir", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json b/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json new file mode 100644 index 0000000000..df49c7e4b5 --- /dev/null +++ b/infra/bots/recipe_modules/core/example.expected/pdfium_trybot.json @@ -0,0 +1,142 @@ +[ + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[CUSTOM_/_B_WORK]", + "511" + ], + "infra_step": true, + "name": "makedirs checkout_path", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "git", + "remote", + "set-url", + "origin", + "https://pdfium.googlesource.com/pdfium.git" + ], + "cwd": "[CUSTOM_/_B_WORK]/pdfium", + "infra_step": true, + "name": "git remote set-url" + }, + { + "cmd": [ + "git", + "fetch" + ], + "cwd": "[CUSTOM_/_B_WORK]/pdfium", + "infra_step": true, + "name": "git fetch" + }, + { + "cmd": [ + "git", + "reset", + "--hard", + "origin/master" + ], + "cwd": "[CUSTOM_/_B_WORK]/pdfium", + "infra_step": true, + "name": "git reset" + }, + { + "cmd": [ + "git", + "clean", + "-d", + "-f" + ], + "cwd": "[CUSTOM_/_B_WORK]/pdfium", + "infra_step": true, + "name": "git clean" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py", + "--spec", + "cache_dir = '[CUSTOM_/_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'pdfium', 'url': 'https://pdfium.googlesource.com/pdfium.git'}]", + "--patch_root", + "pdfium/third_party/skia", + "--revision_mapping_file", + "{\"pdfium\": \"got_pdfium_revision\", \"pdfium/third_party/skia\": \"got_revision\"}", + "--git-cache-dir", + "[CUSTOM_/_B_CACHE]", + "--gerrit_repo", + "https://skia.googlesource.com/skia.git", + "--gerrit_ref", + "refs/changes/89/456789/12", + "--output_json", + "/path/to/tmp/json", + "--revision", + "pdfium@origin/master", + "--revision", + "pdfium/third_party/skia@abc123", + "--output_manifest" + ], + "cwd": "[CUSTOM_/_B_WORK]", + "env": { + "GIT_HTTP_LOW_SPEED_LIMIT": "1000", + "GIT_HTTP_LOW_SPEED_TIME": "300", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]" + }, + "infra_step": true, + "name": "bot_update", + "~followup_annotations": [ + "@@@STEP_TEXT@Some step text@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@", + "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"pdfium\": \"origin/master\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"pdfium/third_party/skia\": \"abc123\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"pdfium\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/pdfium.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"d69d97171c17fdb12a52f78847e2ee2f0594eff1\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"pdfium/third_party/skia\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/pdfium/third_party/skia.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"85501db4bcbeb8f295309fdcda1a743388f0f104\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"pdfium/third_party/skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"got_pdfium_revision\": \"d69d97171c17fdb12a52f78847e2ee2f0594eff1\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_pdfium_revision_cp\": \"refs/heads/master@{#52055}\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"85501db4bcbeb8f295309fdcda1a743388f0f104\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#120212}\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"root\": \"pdfium\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@SET_BUILD_PROPERTY@got_pdfium_revision_cp@\"refs/heads/master@{#52055}\"@@@", + "@@@SET_BUILD_PROPERTY@got_revision@\"85501db4bcbeb8f295309fdcda1a743388f0f104\"@@@", + "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#120212}\"@@@", + "@@@SET_BUILD_PROPERTY@got_pdfium_revision@\"d69d97171c17fdb12a52f78847e2ee2f0594eff1\"@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/core/example.expected/test.json b/infra/bots/recipe_modules/core/example.expected/test.json new file mode 100644 index 0000000000..c831dab096 --- /dev/null +++ b/infra/bots/recipe_modules/core/example.expected/test.json @@ -0,0 +1,154 @@ +[ + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[CUSTOM_C:\\_B_WORK]", + "511" + ], + "infra_step": true, + "name": "makedirs checkout_path", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "git.bat", + "remote", + "set-url", + "origin", + "https://skia.googlesource.com/skia.git" + ], + "cwd": "[CUSTOM_C:\\_B_WORK]/skia", + "infra_step": true, + "name": "git remote set-url" + }, + { + "cmd": [ + "git.bat", + "fetch" + ], + "cwd": "[CUSTOM_C:\\_B_WORK]/skia", + "infra_step": true, + "name": "git fetch" + }, + { + "cmd": [ + "git.bat", + "reset", + "--hard", + "abc123" + ], + "cwd": "[CUSTOM_C:\\_B_WORK]/skia", + "infra_step": true, + "name": "git reset" + }, + { + "cmd": [ + "git.bat", + "clean", + "-d", + "-f" + ], + "cwd": "[CUSTOM_C:\\_B_WORK]/skia", + "infra_step": true, + "name": "git clean" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py", + "--spec", + "cache_dir = '[CUSTOM_C:\\\\_B_CACHE]'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': False, 'name': 'skia', 'url': 'https://skia.googlesource.com/skia.git'}]", + "--patch_root", + "skia", + "--revision_mapping_file", + "{\"skia\": \"got_revision\"}", + "--git-cache-dir", + "[CUSTOM_C:\\_B_CACHE]", + "--gerrit_repo", + "https://skia.googlesource.com/skia.git", + "--gerrit_ref", + "refs/changes/89/456789/12", + "--output_json", + "/path/to/tmp/json", + "--revision", + "skia@abc123", + "--output_manifest" + ], + "cwd": "[CUSTOM_C:\\_B_WORK]", + "env": { + "GIT_HTTP_LOW_SPEED_LIMIT": "1000", + "GIT_HTTP_LOW_SPEED_TIME": "300", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]" + }, + "infra_step": true, + "name": "bot_update", + "~followup_annotations": [ + "@@@STEP_TEXT@Some step text@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@", + "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"skia\": \"abc123\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"skia\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/skia.git\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@", + "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"9046e2e693bb92a76e972b694580e5d17ad10748\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/master@{#164710}\"@@@", + "@@@STEP_LOG_LINE@json.output@ }, @@@", + "@@@STEP_LOG_LINE@json.output@ \"root\": \"skia\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@SET_BUILD_PROPERTY@got_revision@\"9046e2e693bb92a76e972b694580e5d17ad10748\"@@@", + "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/master@{#164710}\"@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/tmp", + "511" + ], + "infra_step": true, + "name": "makedirs tmp_dir", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/core/example.py b/infra/bots/recipe_modules/core/example.py new file mode 100644 index 0000000000..9cd7b47890 --- /dev/null +++ b/infra/bots/recipe_modules/core/example.py @@ -0,0 +1,103 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'core', + 'recipe_engine/path', + 'recipe_engine/properties', +] + + +def RunSteps(api): + api.core.setup() + + +def GenTests(api): + buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan' + yield ( + api.test('test') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + + api.properties(patch_storage='gerrit') + + api.properties.tryserver( + buildername=buildername, + gerrit_project='skia', + gerrit_url='https://skia-review.googlesource.com/', + ) + ) + + buildername = 'Test-Win10-MSVC-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-ANGLE' + yield ( + api.test('no_persistent_checkout') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + + api.properties(patch_storage='gerrit') + + api.properties.tryserver( + buildername=buildername, + gerrit_project='skia', + gerrit_url='https://skia-review.googlesource.com/', + ) + ) + + buildername = 'Build-Ubuntu-GCC-x86_64-Release-PDFium' + yield ( + api.test('pdfium_trybot') + + api.properties( + repository='https://skia.googlesource.com/skia.git', + buildername=buildername, + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]', + revision='abc123', + patch_issue=500, + patch_set=1, + patch_storage='gerrit') + + api.properties.tryserver( + buildername=buildername, + gerrit_project='skia', + gerrit_url='https://skia-review.googlesource.com/', + ) + + api.path.exists( + api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') + ) + ) + + buildername = 'Build-Ubuntu-GCC-x86_64-Release-Flutter_Android' + yield ( + api.test('flutter_trybot') + + api.properties( + repository='https://skia.googlesource.com/skia.git', + buildername=buildername, + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]', + revision='abc123', + patch_issue=500, + patch_set=1, + patch_storage='gerrit') + + api.properties.tryserver( + buildername=buildername, + gerrit_project='skia', + gerrit_url='https://skia-review.googlesource.com/', + ) + + api.path.exists( + api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') + ) + ) + + builder = 'Housekeeper-Weekly-RecreateSKPs' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + + api.path.exists(api.path['start_dir'].join('skp_output')) + ) diff --git a/infra/bots/recipe_modules/ct/__init__.py b/infra/bots/recipe_modules/ct/__init__.py index f9d542c303..3756b3cbb7 100644 --- a/infra/bots/recipe_modules/ct/__init__.py +++ b/infra/bots/recipe_modules/ct/__init__.py @@ -9,7 +9,3 @@ DEPS = [ 'recipe_engine/step', 'run', ] - - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/ct/api.py b/infra/bots/recipe_modules/ct/api.py index 91478fb50e..314903fe51 100644 --- a/infra/bots/recipe_modules/ct/api.py +++ b/infra/bots/recipe_modules/ct/api.py @@ -46,6 +46,6 @@ class CTApi(recipe_api.RecipeApi): gsutil_args.append(str(slave_dest_dir)) try: self.m.gsutil(gsutil_args, use_retry_wrapper=False) - except self.m.step.StepFailure: # pragma: nocover + except self.m.step.StepFailure: # Some subdirectories might have no SKPs in them. pass diff --git a/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json b/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json new file mode 100644 index 0000000000..e51ee004c7 --- /dev/null +++ b/infra/bots/recipe_modules/ct/example.expected/failed_gsutil.json @@ -0,0 +1,160 @@ +[ + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[build::file]/resources/fileutil.py", + "rmtree", + "[START_DIR]/skps/slave0" + ], + "env": { + "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts" + }, + "infra_step": true, + "name": "rmtree slave0" + }, + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/skps/slave0", + "511" + ], + "name": "makedirs slave0", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_PACKAGE_REPO[depot_tools]/gsutil.py", + "--", + "-m", + "cp", + "gs://cluster-telemetry/swarming/skps/All/abc123/100/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/101/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/102/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/103/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/104/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/105/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/106/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/107/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/108/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/109/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/110/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/111/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/112/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/113/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/114/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/115/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/116/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/117/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/118/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/119/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/120/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/121/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/122/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/123/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/124/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/125/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/126/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/127/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/128/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/129/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/130/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/131/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/132/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/133/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/134/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/135/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/136/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/137/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/138/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/139/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/140/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/141/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/142/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/143/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/144/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/145/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/146/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/147/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/148/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/149/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/150/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/151/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/152/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/153/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/154/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/155/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/156/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/157/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/158/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/159/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/160/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/161/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/162/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/163/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/164/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/165/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/166/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/167/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/168/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/169/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/170/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/171/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/172/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/173/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/174/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/175/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/176/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/177/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/178/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/179/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/180/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/181/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/182/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/183/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/184/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/185/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/186/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/187/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/188/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/189/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/190/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/191/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/192/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/193/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/194/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/195/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/196/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/197/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/198/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/199/*.skp", + "[START_DIR]/skps/slave0" + ], + "infra_step": true, + "name": "gsutil cp", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_EXCEPTION@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/ct/example.expected/test.json b/infra/bots/recipe_modules/ct/example.expected/test.json new file mode 100644 index 0000000000..dc49be70f0 --- /dev/null +++ b/infra/bots/recipe_modules/ct/example.expected/test.json @@ -0,0 +1,156 @@ +[ + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[build::file]/resources/fileutil.py", + "rmtree", + "[START_DIR]/skps/slave0" + ], + "env": { + "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts" + }, + "infra_step": true, + "name": "rmtree slave0" + }, + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/skps/slave0", + "511" + ], + "name": "makedirs slave0", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_PACKAGE_REPO[depot_tools]/gsutil.py", + "--", + "-m", + "cp", + "gs://cluster-telemetry/swarming/skps/All/abc123/100/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/101/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/102/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/103/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/104/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/105/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/106/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/107/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/108/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/109/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/110/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/111/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/112/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/113/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/114/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/115/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/116/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/117/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/118/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/119/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/120/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/121/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/122/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/123/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/124/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/125/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/126/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/127/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/128/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/129/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/130/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/131/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/132/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/133/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/134/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/135/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/136/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/137/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/138/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/139/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/140/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/141/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/142/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/143/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/144/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/145/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/146/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/147/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/148/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/149/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/150/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/151/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/152/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/153/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/154/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/155/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/156/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/157/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/158/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/159/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/160/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/161/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/162/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/163/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/164/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/165/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/166/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/167/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/168/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/169/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/170/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/171/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/172/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/173/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/174/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/175/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/176/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/177/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/178/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/179/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/180/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/181/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/182/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/183/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/184/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/185/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/186/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/187/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/188/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/189/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/190/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/191/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/192/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/193/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/194/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/195/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/196/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/197/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/198/*.skp", + "gs://cluster-telemetry/swarming/skps/All/abc123/199/*.skp", + "[START_DIR]/skps/slave0" + ], + "infra_step": true, + "name": "gsutil cp" + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/ct/example.py b/infra/bots/recipe_modules/ct/example.py new file mode 100644 index 0000000000..3b3c3f22e3 --- /dev/null +++ b/infra/bots/recipe_modules/ct/example.py @@ -0,0 +1,25 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'ct', + 'recipe_engine/path', +] + + +def RunSteps(api): + api.ct.download_swarming_skps( + 'All', '0', 'abc123', + api.path['start_dir'].join('skps'), + start_range=100, + num_skps=100) + + +def GenTests(api): + yield api.test('test') + yield ( + api.test('failed_gsutil') + + api.step_data('gsutil cp', retcode=1) + ) diff --git a/infra/bots/recipe_modules/run/__init__.py b/infra/bots/recipe_modules/run/__init__.py index e9a6f1c497..cb4c1ae0ee 100644 --- a/infra/bots/recipe_modules/run/__init__.py +++ b/infra/bots/recipe_modules/run/__init__.py @@ -11,7 +11,3 @@ DEPS = [ 'recipe_engine/step', 'vars', ] - - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/run/api.py b/infra/bots/recipe_modules/run/api.py index 475bd56d28..ecec9f9db9 100644 --- a/infra/bots/recipe_modules/run/api.py +++ b/infra/bots/recipe_modules/run/api.py @@ -60,7 +60,7 @@ class SkiaStepApi(recipe_api.RecipeApi): def readfile(self, filename, *args, **kwargs): """Convenience function for reading files.""" - name = kwargs.pop('name') or 'read %s' % self.m.path.basename(filename) + name = kwargs.pop('name', 'read %s' % self.m.path.basename(filename)) return self.m.file.read(name, filename, infra_step=True, *args, **kwargs) def writefile(self, filename, contents): diff --git a/infra/bots/recipe_modules/run/example.expected/test.json b/infra/bots/recipe_modules/run/example.expected/test.json new file mode 100644 index 0000000000..250ca9cf17 --- /dev/null +++ b/infra/bots/recipe_modules/run/example.expected/test.json @@ -0,0 +1,260 @@ +[ + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "fail", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "echo", + "do the thing" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "do a thing" + }, + { + "cmd": [ + "echo", + "0" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "run 0" + }, + { + "cmd": [ + "python", + "-u", + "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n", + "myfile.txt", + "/path/to/tmp/" + ], + "infra_step": true, + "name": "read myfile.txt" + }, + { + "cmd": [ + "python", + "-u", + "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n", + "contents", + "myfile.txt" + ], + "infra_step": true, + "name": "write myfile.txt" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[build::file]/resources/fileutil.py", + "rmtree", + "mydir" + ], + "env": { + "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts" + }, + "infra_step": true, + "name": "rmtree mydir" + }, + { + "cmd": [ + "env" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "mydir:%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "env" + }, + { + "cmd": [ + "python", + "-u", + "import errno\nimport glob\nimport os\nimport shutil\nimport sys\n\nsrc = sys.argv[1]\ndst = sys.argv[2]\nbuild_products_whitelist = ['dm', 'dm.exe', 'dm.app', 'nanobench.app', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']\n\ntry:\n os.makedirs(dst)\nexcept OSError as e:\n if e.errno != errno.EEXIST:\n raise\n\nfor pattern in build_products_whitelist:\n path = os.path.join(src, pattern)\n for f in glob.glob(path):\n dst_path = os.path.join(dst, os.path.relpath(f, src))\n if not os.path.isdir(os.path.dirname(dst_path)):\n os.makedirs(os.path.dirname(dst_path))\n print 'Copying build product %s to %s' % (f, dst_path)\n shutil.move(f, dst_path)\n", + "src", + "dst" + ], + "infra_step": true, + "name": "copy build products", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import errno@@@", + "@@@STEP_LOG_LINE@python.inline@import glob@@@", + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@import shutil@@@", + "@@@STEP_LOG_LINE@python.inline@import sys@@@", + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@src = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@dst = sys.argv[2]@@@", + "@@@STEP_LOG_LINE@python.inline@build_products_whitelist = ['dm', 'dm.exe', 'dm.app', 'nanobench.app', 'get_images_from_skps', 'get_images_from_skps.exe', 'nanobench', 'nanobench.exe', 'skpbench', '*.so', '*.dll', '*.dylib', 'skia_launcher', 'lib/*.so', 'iOSShell.app', 'iOSShell.ipa', 'visualbench', 'visualbench.exe', 'vulkan-1.dll']@@@", + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@try:@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(dst)@@@", + "@@@STEP_LOG_LINE@python.inline@except OSError as e:@@@", + "@@@STEP_LOG_LINE@python.inline@ if e.errno != errno.EEXIST:@@@", + "@@@STEP_LOG_LINE@python.inline@ raise@@@", + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@for pattern in build_products_whitelist:@@@", + "@@@STEP_LOG_LINE@python.inline@ path = os.path.join(src, pattern)@@@", + "@@@STEP_LOG_LINE@python.inline@ for f in glob.glob(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ dst_path = os.path.join(dst, os.path.relpath(f, src))@@@", + "@@@STEP_LOG_LINE@python.inline@ if not os.path.isdir(os.path.dirname(dst_path)):@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(os.path.dirname(dst_path))@@@", + "@@@STEP_LOG_LINE@python.inline@ print 'Copying build product %s to %s' % (f, dst_path)@@@", + "@@@STEP_LOG_LINE@python.inline@ shutil.move(f, dst_path)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry fail", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry fail (attempt 2)", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry fail (attempt 3)", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry fail (attempt 4)", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry fail (attempt 5)", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry success", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry success (attempt 2)", + "~followup_annotations": [ + "step returned non-zero exit code: 1", + "@@@STEP_FAILURE@@@" + ] + }, + { + "cmd": [ + "false" + ], + "env": { + "BUILDTYPE": "Release_x64", + "CHROME_HEADLESS": "1", + "PATH": "%(PATH)s:RECIPE_PACKAGE_REPO[depot_tools]", + "SKIA_OUT": "[CUSTOM_C:\\_B_WORK]/skia/out/Build-Win-MSVC-x86_64-Release-Vulkan" + }, + "name": "retry success (attempt 3)" + }, + { + "name": "$result", + "reason": "Failed build steps: fail, retry fail, retry fail (attempt 2), retry fail (attempt 3), retry fail (attempt 4), retry fail (attempt 5), retry success, retry success (attempt 2)", + "recipe_result": null, + "status_code": 1 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/run/example.py b/infra/bots/recipe_modules/run/example.py new file mode 100644 index 0000000000..fb61b48846 --- /dev/null +++ b/infra/bots/recipe_modules/run/example.py @@ -0,0 +1,69 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'recipe_engine/path', + 'recipe_engine/properties', + 'recipe_engine/step', + 'run', + 'vars', +] + + +def myfunc(api, i): + api.run(api.step, 'run %d' % i, cmd=['echo', str(i)]) + + +def RunSteps(api): + api.vars.setup() + api.run(api.step, 'fail', cmd=['false'], abort_on_failure=False) + api.run(api.step, 'do a thing', cmd=['echo', 'do the thing']) + assert len(api.run.failed_steps) == 1 + + # Run once. + for i in range(10): + api.run.run_once(myfunc, api, i) + + # Read and write files. + api.run.readfile('myfile.txt') + api.run.writefile('myfile.txt', 'contents') + api.run.rmtree('mydir') + + # Merge PATHs. + with api.step.context({'env': {'PATH': 'mydir:%(PATH)s'}}): + api.run(api.step, 'env', cmd=['env']) + + # Copy build products. + api.run.copy_build_products('src', 'dst') + + # Retries. + try: + api.run.with_retry(api.step, 'retry fail', 5, cmd=['false']) + except api.step.StepFailure: + pass + api.run.with_retry(api.step, 'retry success', 3, cmd=['false']) + + # Check failure. + api.run.check_failure() + + +def GenTests(api): + buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan' + yield ( + api.test('test') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + + api.step_data('fail', retcode=1) + + api.step_data('retry fail', retcode=1) + + api.step_data('retry fail (attempt 2)', retcode=1) + + api.step_data('retry fail (attempt 3)', retcode=1) + + api.step_data('retry fail (attempt 4)', retcode=1) + + api.step_data('retry fail (attempt 5)', retcode=1) + + api.step_data('retry success', retcode=1) + + api.step_data('retry success (attempt 2)', retcode=1) + ) diff --git a/infra/bots/recipe_modules/swarming/__init__.py b/infra/bots/recipe_modules/swarming/__init__.py index cc099f61c0..3e05b02b1f 100644 --- a/infra/bots/recipe_modules/swarming/__init__.py +++ b/infra/bots/recipe_modules/swarming/__init__.py @@ -16,7 +16,3 @@ DEPS = [ 'recipe_engine/step', 'run', ] - - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/swarming/example.expected/test.json b/infra/bots/recipe_modules/swarming/example.expected/test.json new file mode 100644 index 0000000000..310d828435 --- /dev/null +++ b/infra/bots/recipe_modules/swarming/example.expected/test.json @@ -0,0 +1,863 @@ +[ + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[depot_tools::git]/resources/git_setup.py", + "--path", + "[START_DIR]/swarming.client", + "--url", + "https://chromium.googlesource.com/external/swarming.client.git" + ], + "name": "git setup (swarming_client)" + }, + { + "cmd": [ + "git", + "retry", + "fetch", + "origin", + "abc123" + ], + "cwd": "[START_DIR]/swarming.client", + "env": { + "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s" + }, + "infra_step": true, + "name": "git fetch (swarming_client)" + }, + { + "cmd": [ + "git", + "checkout", + "-f", + "FETCH_HEAD" + ], + "cwd": "[START_DIR]/swarming.client", + "infra_step": true, + "name": "git checkout (swarming_client)" + }, + { + "cmd": [ + "git", + "rev-parse", + "HEAD" + ], + "cwd": "[START_DIR]/swarming.client", + "infra_step": true, + "name": "read revision", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_TEXT@<br/>checked out 'deadbeef'<br/>@@@" + ] + }, + { + "cmd": [ + "git", + "clean", + "-f", + "-d", + "-x" + ], + "cwd": "[START_DIR]/swarming.client", + "infra_step": true, + "name": "git clean (swarming_client)" + }, + { + "cmd": [ + "git", + "submodule", + "sync" + ], + "cwd": "[START_DIR]/swarming.client", + "infra_step": true, + "name": "submodule sync (swarming_client)" + }, + { + "cmd": [ + "git", + "submodule", + "update", + "--init", + "--recursive" + ], + "cwd": "[START_DIR]/swarming.client", + "infra_step": true, + "name": "submodule update (swarming_client)" + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "--version" + ], + "name": "swarming.py --version", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_TEXT@0.8.6@@@" + ] + }, + { + "cmd": [ + "download_from_google_storage", + "--no_resume", + "--platform=linux*", + "--no_auth", + "--bucket", + "chromium-luci", + "-d", + "lmydirimydirnmydirumydirxmydir6mydir4" + ], + "env": { + "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s" + }, + "name": "download luci-go linux" + }, + { + "cmd": [ + "download_from_google_storage", + "--no_resume", + "--platform=darwin", + "--no_auth", + "--bucket", + "chromium-luci", + "-d", + "mmydiramydircmydir6mydir4" + ], + "env": { + "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s" + }, + "name": "download luci-go mac" + }, + { + "cmd": [ + "download_from_google_storage", + "--no_resume", + "--platform=win32", + "--no_auth", + "--bucket", + "chromium-luci", + "-d", + "wmydirimydirnmydir6mydir4" + ], + "env": { + "PATH": "RECIPE_PACKAGE_REPO[depot_tools]:%(PATH)s" + }, + "name": "download luci-go win" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[build::file]/resources/fileutil.py", + "rmtree", + "[START_DIR]/luci-go" + ], + "env": { + "PYTHONPATH": "[START_DIR]/skia/infra/bots/.recipe_deps/build/scripts" + }, + "infra_step": true, + "name": "rmtree luci-go" + }, + { + "cmd": [ + "python", + "-u", + "\nimport shutil\nimport sys\nshutil.copytree(sys.argv[1], sys.argv[2], symlinks=bool(sys.argv[3]))\n", + "mydir", + "[START_DIR]/luci-go", + "0" + ], + "name": "Copy Go binary" + }, + { + "cmd": [ + "python", + "-u", + "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os.path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", + "[START_DIR]/swarming_temp_dir", + "511" + ], + "name": "makedirs swarming tmp dir", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@@@@", + "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", + "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", + "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", + "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", + "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", + "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", + "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "\nimport shutil\nimport sys\nshutil.copy(sys.argv[1], sys.argv[2])\n", + "{\n \"args\": [\n \"--isolate\", \n \"isolate_path\", \n \"--isolated\", \n \"[START_DIR]/swarming_temp_dir/skia-task-task.isolated\", \n \"--config-variable\", \n \"OS\", \n \"linux\", \n \"--extra-variable\", \n \"myvar\", \n \"myval\"\n ], \n \"dir\": \"isolate_dir\", \n \"version\": 1\n}", + "[START_DIR]/swarming_temp_dir/task.isolated.gen.json" + ], + "name": "Write task.isolated.gen.json" + }, + { + "cmd": [ + "python", + "-u", + "RECIPE_MODULE[build::isolate]/resources/isolate.py", + "[START_DIR]/swarming.client", + "batcharchive", + "--dump-json", + "/path/to/tmp/json", + "--isolate-server", + "https://isolateserver.appspot.com", + "--verbose", + "[START_DIR]/swarming_temp_dir/task-0.isolated.gen.json", + "[START_DIR]/swarming_temp_dir/task-1.isolated.gen.json", + "[START_DIR]/swarming_temp_dir/task-2.isolated.gen.json", + "[START_DIR]/swarming_temp_dir/task-3.isolated.gen.json", + "[START_DIR]/swarming_temp_dir/task-4.isolated.gen.json" + ], + "name": "isolate tests", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-0\": \"[dummy hash for task-0]\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"task-1\": \"[dummy hash for task-1]\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"task-2\": \"[dummy hash for task-2]\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"task-3\": \"[dummy hash for task-3]\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"task-4\": \"[dummy hash for task-4]\"@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@SET_BUILD_PROPERTY@swarm_hashes@{\"task-0\": \"[dummy hash for task-0]\", \"task-1\": \"[dummy hash for task-1]\", \"task-2\": \"[dummy hash for task-2]\", \"task-3\": \"[dummy hash for task-3]\", \"task-4\": \"[dummy hash for task-4]\"}@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "trigger", + "--swarming", + "https://chromium-swarm.appspot.com", + "--isolate-server", + "https://isolateserver.appspot.com", + "--priority", + "90", + "--shards", + "1", + "--task-name", + "task-4/Linux/[dummy has", + "--dump-json", + "/path/to/tmp/json", + "--expiration", + "72000", + "--io-timeout", + "2400", + "--hard-timeout", + "14400", + "--dimension", + "os", + "Linux", + "--tag", + "allow_milo:1", + "--tag", + "data:[dummy hash for task-4]", + "--tag", + "name:task-4", + "--tag", + "os:Linux", + "--tag", + "revision:abc123", + "--tag", + "stepname:task-4", + "[dummy hash for task-4]" + ], + "infra_step": true, + "name": "[trigger] task-4", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-4/Linux/[dummy has\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-4/Linux/[dummy has\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@", + "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "trigger", + "--swarming", + "https://chromium-swarm.appspot.com", + "--isolate-server", + "https://isolateserver.appspot.com", + "--priority", + "90", + "--shards", + "1", + "--task-name", + "task-2/Linux/[dummy has", + "--dump-json", + "/path/to/tmp/json", + "--expiration", + "72000", + "--io-timeout", + "2400", + "--hard-timeout", + "14400", + "--dimension", + "os", + "Linux", + "--tag", + "allow_milo:1", + "--tag", + "data:[dummy hash for task-2]", + "--tag", + "name:task-2", + "--tag", + "os:Linux", + "--tag", + "revision:abc123", + "--tag", + "stepname:task-2", + "[dummy hash for task-2]" + ], + "infra_step": true, + "name": "[trigger] task-2", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-2/Linux/[dummy has\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-2/Linux/[dummy has\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@", + "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "trigger", + "--swarming", + "https://chromium-swarm.appspot.com", + "--isolate-server", + "https://isolateserver.appspot.com", + "--priority", + "90", + "--shards", + "1", + "--task-name", + "task-3/Linux/[dummy has", + "--dump-json", + "/path/to/tmp/json", + "--expiration", + "72000", + "--io-timeout", + "2400", + "--hard-timeout", + "14400", + "--dimension", + "os", + "Linux", + "--tag", + "allow_milo:1", + "--tag", + "data:[dummy hash for task-3]", + "--tag", + "name:task-3", + "--tag", + "os:Linux", + "--tag", + "revision:abc123", + "--tag", + "stepname:task-3", + "[dummy hash for task-3]" + ], + "infra_step": true, + "name": "[trigger] task-3", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-3/Linux/[dummy has\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-3/Linux/[dummy has\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@", + "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "trigger", + "--swarming", + "https://chromium-swarm.appspot.com", + "--isolate-server", + "https://isolateserver.appspot.com", + "--priority", + "90", + "--shards", + "1", + "--task-name", + "task-0/Linux/[dummy has", + "--dump-json", + "/path/to/tmp/json", + "--expiration", + "72000", + "--io-timeout", + "2400", + "--hard-timeout", + "14400", + "--dimension", + "os", + "Linux", + "--tag", + "allow_milo:1", + "--tag", + "data:[dummy hash for task-0]", + "--tag", + "name:task-0", + "--tag", + "os:Linux", + "--tag", + "revision:abc123", + "--tag", + "stepname:task-0", + "[dummy hash for task-0]" + ], + "infra_step": true, + "name": "[trigger] task-0", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-0/Linux/[dummy has\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-0/Linux/[dummy has\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@", + "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "trigger", + "--swarming", + "https://chromium-swarm.appspot.com", + "--isolate-server", + "https://isolateserver.appspot.com", + "--priority", + "90", + "--shards", + "1", + "--task-name", + "task-1/Linux/[dummy has", + "--dump-json", + "/path/to/tmp/json", + "--expiration", + "72000", + "--io-timeout", + "2400", + "--hard-timeout", + "14400", + "--dimension", + "os", + "Linux", + "--tag", + "allow_milo:1", + "--tag", + "data:[dummy hash for task-1]", + "--tag", + "name:task-1", + "--tag", + "os:Linux", + "--tag", + "revision:abc123", + "--tag", + "stepname:task-1", + "[dummy hash for task-1]" + ], + "infra_step": true, + "name": "[trigger] task-1", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'@@@", + "@@@STEP_LOG_LINE@json.output@{@@@", + "@@@STEP_LOG_LINE@json.output@ \"base_task_name\": \"task-1/Linux/[dummy has\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"tasks\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"task-1/Linux/[dummy has\": {@@@", + "@@@STEP_LOG_LINE@json.output@ \"shard_index\": 0, @@@", + "@@@STEP_LOG_LINE@json.output@ \"task_id\": \"10000\", @@@", + "@@@STEP_LOG_LINE@json.output@ \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@ }@@@", + "@@@STEP_LOG_LINE@json.output@}@@@", + "@@@STEP_LOG_END@json.output@@@", + "@@@STEP_LINK@shard #0@https://chromium-swarm.appspot.com/user/task/10000@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/10000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "collect", + "--swarming", + "https://chromium-swarm.appspot.com", + "--decorate", + "--print-status-updates", + "--json", + "{\"base_task_name\": \"task-4/Linux/[dummy has\", \"tasks\": {\"task-4/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}", + "--task-summary-json", + "/path/to/tmp/json", + "--task-output-dir", + "[START_DIR]/swarming_temp_dir/outputs/task-4" + ], + "name": "task-4", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@", + "@@@STEP_LOG_LINE@swarming.summary@{@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ]@@@", + "@@@STEP_LOG_LINE@swarming.summary@}@@@", + "@@@STEP_LOG_END@swarming.summary@@@", + "@@@STEP_LINK@shard #0 isolated out@blah@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "collect", + "--swarming", + "https://chromium-swarm.appspot.com", + "--decorate", + "--print-status-updates", + "--json", + "{\"base_task_name\": \"task-2/Linux/[dummy has\", \"tasks\": {\"task-2/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}", + "--task-summary-json", + "/path/to/tmp/json", + "--task-output-dir", + "[START_DIR]/swarming_temp_dir/outputs/task-2" + ], + "name": "task-2", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@", + "@@@STEP_LOG_LINE@swarming.summary@{@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ]@@@", + "@@@STEP_LOG_LINE@swarming.summary@}@@@", + "@@@STEP_LOG_END@swarming.summary@@@", + "@@@STEP_LINK@shard #0 isolated out@blah@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "collect", + "--swarming", + "https://chromium-swarm.appspot.com", + "--decorate", + "--print-status-updates", + "--json", + "{\"base_task_name\": \"task-3/Linux/[dummy has\", \"tasks\": {\"task-3/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}", + "--task-summary-json", + "/path/to/tmp/json", + "--task-output-dir", + "[START_DIR]/swarming_temp_dir/outputs/task-3" + ], + "name": "task-3", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@", + "@@@STEP_LOG_LINE@swarming.summary@{@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ]@@@", + "@@@STEP_LOG_LINE@swarming.summary@}@@@", + "@@@STEP_LOG_END@swarming.summary@@@", + "@@@STEP_LINK@shard #0 isolated out@blah@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "collect", + "--swarming", + "https://chromium-swarm.appspot.com", + "--decorate", + "--print-status-updates", + "--json", + "{\"base_task_name\": \"task-0/Linux/[dummy has\", \"tasks\": {\"task-0/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}", + "--task-summary-json", + "/path/to/tmp/json", + "--task-output-dir", + "[START_DIR]/swarming_temp_dir/outputs/task-0" + ], + "name": "task-0", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@", + "@@@STEP_LOG_LINE@swarming.summary@{@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ]@@@", + "@@@STEP_LOG_LINE@swarming.summary@}@@@", + "@@@STEP_LOG_END@swarming.summary@@@", + "@@@STEP_LINK@shard #0 isolated out@blah@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "[START_DIR]/swarming.client/swarming.py", + "collect", + "--swarming", + "https://chromium-swarm.appspot.com", + "--decorate", + "--print-status-updates", + "--json", + "{\"base_task_name\": \"task-1/Linux/[dummy has\", \"tasks\": {\"task-1/Linux/[dummy has\": {\"shard_index\": 0, \"task_id\": \"10000\", \"view_url\": \"https://chromium-swarm.appspot.com/user/task/10000\"}}}", + "--task-summary-json", + "/path/to/tmp/json", + "--task-output-dir", + "[START_DIR]/swarming_temp_dir/outputs/task-1" + ], + "name": "task-1", + "~followup_annotations": [ + "@@@STEP_TEXT@Run on OS: 'Linux'<br>swarming pending 71s@@@", + "@@@STEP_LOG_LINE@swarming.summary@{@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"shards\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"abandoned_ts\": null, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"bot_id\": \"vm30\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"completed_ts\": \"2014-09-25T01:42:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"created_ts\": \"2014-09-25T01:41:00.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"durations\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 5.7, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 31.5@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"exit_codes\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ 0@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"id\": \"148aa78d7aa0000\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"internal_failure\": false, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated_out\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolated\": \"abc123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"isolatedserver\": \"https://isolateserver.appspot.com\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"namespace\": \"default-gzip\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"modified_ts\": \"2014-09-25 01:42:00\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"name\": \"heartbeat-canary-2014-09-25_01:41:55-os=Windows\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs\": [@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Heart beat succeeded on win32.\\n\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"Foo\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ], @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"outputs_ref\": {@@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"view_url\": \"blah\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"started_ts\": \"2014-09-25T01:42:11.123\", @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"state\": 112, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"try_number\": 1, @@@", + "@@@STEP_LOG_LINE@swarming.summary@ \"user\": \"unknown\"@@@", + "@@@STEP_LOG_LINE@swarming.summary@ }@@@", + "@@@STEP_LOG_LINE@swarming.summary@ ]@@@", + "@@@STEP_LOG_LINE@swarming.summary@}@@@", + "@@@STEP_LOG_END@swarming.summary@@@", + "@@@STEP_LINK@shard #0 isolated out@blah@@@", + "@@@STEP_LINK@view steps on Milo@https://luci-milo.appspot.com/swarming/task/148aa78d7aa0000@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/swarming/example.py b/infra/bots/recipe_modules/swarming/example.py new file mode 100644 index 0000000000..d862c480a6 --- /dev/null +++ b/infra/bots/recipe_modules/swarming/example.py @@ -0,0 +1,30 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'recipe_engine/path', + 'recipe_engine/properties', + 'recipe_engine/step', + 'swarming', +] + + +def RunSteps(api): + api.swarming.setup('mydir', swarming_rev='abc123') + api.swarming.create_isolated_gen_json( + 'isolate_path', 'isolate_dir', 'linux', 'task', {'myvar': 'myval'}) + tasks_to_hashes = api.swarming.batcharchive(targets=[ + 'task-%s' % num for num in range(5)]) + tasks = api.swarming.trigger_swarming_tasks( + tasks_to_hashes, dimensions={'os': 'Linux'}) + for t in tasks: + api.swarming.collect_swarming_task(t) + + +def GenTests(api): + yield ( + api.test('test') + + api.properties(revision='abc123') + ) diff --git a/infra/bots/recipe_modules/vars/__init__.py b/infra/bots/recipe_modules/vars/__init__.py index d5cf1da80b..e0e951379f 100644 --- a/infra/bots/recipe_modules/vars/__init__.py +++ b/infra/bots/recipe_modules/vars/__init__.py @@ -12,7 +12,3 @@ DEPS = [ 'recipe_engine/raw_io', 'recipe_engine/step', ] - - -# TODO(borenet): Add coverage -DISABLE_STRICT_COVERAGE = True diff --git a/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-Flutter_Android.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/Build-Ubuntu-GCC-x86_64-Release-PDFium.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json b/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/Housekeeper-Weekly-RecreateSKPs.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json b/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json b/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/command_buffer.json b/infra/bots/recipe_modules/vars/example.expected/command_buffer.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/command_buffer.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json b/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/flutter_trybot.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/linux.json b/infra/bots/recipe_modules/vars/example.expected/linux.json new file mode 100644 index 0000000000..7726ecb249 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/linux.json @@ -0,0 +1,7 @@ +[ + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json b/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/pdfium_trybot.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/test.json b/infra/bots/recipe_modules/vars/example.expected/test.json new file mode 100644 index 0000000000..7726ecb249 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/test.json @@ -0,0 +1,7 @@ +[ + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/win.json b/infra/bots/recipe_modules/vars/example.expected/win.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/win.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.expected/win_test.json b/infra/bots/recipe_modules/vars/example.expected/win_test.json new file mode 100644 index 0000000000..4594f9e6b9 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.expected/win_test.json @@ -0,0 +1,35 @@ +[ + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_BOT_ID', '')\n" + ], + "name": "get swarming bot id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_BOT_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "cmd": [ + "python", + "-u", + "import os\nprint os.environ.get('SWARMING_TASK_ID', '')\n" + ], + "name": "get swarming task id", + "stdout": "/path/to/tmp/", + "~followup_annotations": [ + "@@@STEP_LOG_LINE@python.inline@import os@@@", + "@@@STEP_LOG_LINE@python.inline@print os.environ.get('SWARMING_TASK_ID', '')@@@", + "@@@STEP_LOG_END@python.inline@@@" + ] + }, + { + "name": "$result", + "recipe_result": null, + "status_code": 0 + } +]
\ No newline at end of file diff --git a/infra/bots/recipe_modules/vars/example.py b/infra/bots/recipe_modules/vars/example.py new file mode 100644 index 0000000000..917f85db06 --- /dev/null +++ b/infra/bots/recipe_modules/vars/example.py @@ -0,0 +1,108 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + + +DEPS = [ + 'recipe_engine/properties', + 'vars', +] + + +def RunSteps(api): + api.vars.setup() + info = [ + api.vars.upload_dm_results, + api.vars.upload_perf_results, + api.vars.swarming_bot_id, + api.vars.swarming_task_id, + ] + assert len(info) == 4 # Make pylint happy. + + +def GenTests(api): + buildername = 'Build-Win-MSVC-x86_64-Release-Vulkan' + yield ( + api.test('win') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + buildername = 'Build-Mac-Clang-x86_64-Debug-CommandBuffer' + yield ( + api.test('command_buffer') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + buildername = 'Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug' + yield ( + api.test('win_test') + + api.properties(buildername=buildername, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]', + patch_storage='gerrit') + + api.properties.tryserver( + buildername=buildername, + gerrit_project='skia', + gerrit_url='https://skia-review.googlesource.com/', + ) + ) + + builder = 'Housekeeper-Weekly-RecreateSKPs' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + builder = 'Perf-Chromecast-GCC-Chorizo-CPU-Cortex_A7-arm-Debug' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + builder = 'Perf-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-ASAN' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + builder = 'Build-Ubuntu-GCC-x86_64-Release-PDFium' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) + + builder = 'Build-Ubuntu-GCC-x86_64-Release-Flutter_Android' + yield ( + api.test(builder) + + api.properties(buildername=builder, + repository='https://skia.googlesource.com/skia.git', + revision='abc123', + path_config='kitchen', + swarm_out_dir='[SWARM_OUT_DIR]') + ) |