skia2/infra/bots/README.recipes.md

541 lines
44 KiB
Markdown
Raw Normal View History

<!--- AUTOGENERATED BY `./recipes.py test train` -->
# Repo documentation for [skia]()
## Table of Contents
**[Recipe Modules](#Recipe-Modules)**
* [build](#recipe_modules-build) &mdash; Build Skia for various platforms.
* [builder_name_schema](#recipe_modules-builder_name_schema)
* [checkout](#recipe_modules-checkout)
* [docker](#recipe_modules-docker)
* [doxygen](#recipe_modules-doxygen)
* [env](#recipe_modules-env)
* [flavor](#recipe_modules-flavor)
* [git](#recipe_modules-git)
* [gold_upload](#recipe_modules-gold_upload)
* [gsutil](#recipe_modules-gsutil)
* [infra](#recipe_modules-infra)
* [run](#recipe_modules-run)
* [vars](#recipe_modules-vars)
**[Recipes](#Recipes)**
* [build:examples/full](#recipes-build_examples_full)
* [builder_name_schema:examples/full](#recipes-builder_name_schema_examples_full)
* [check_generated_files](#recipes-check_generated_files)
* [checkout:examples/full](#recipes-checkout_examples_full)
* [compile](#recipes-compile)
* [compute_buildstats](#recipes-compute_buildstats)
* [compute_test](#recipes-compute_test)
* [docker:examples/full](#recipes-docker_examples_full)
* [doxygen:examples/full](#recipes-doxygen_examples_full)
* [env:examples/full](#recipes-env_examples_full)
* [flavor:examples/full](#recipes-flavor_examples_full)
* [git:examples/full](#recipes-git_examples_full)
* [gold_upload:examples/full](#recipes-gold_upload_examples_full)
* [gsutil:examples/full](#recipes-gsutil_examples_full)
* [housekeeper](#recipes-housekeeper)
* [infra](#recipes-infra)
* [infra:examples/full](#recipes-infra_examples_full)
* [perf](#recipes-perf)
* [perf_pathkit](#recipes-perf_pathkit)
* [perf_skottietrace](#recipes-perf_skottietrace)
* [perf_skottiewasm_lottieweb](#recipes-perf_skottiewasm_lottieweb)
* [recreate_skps](#recipes-recreate_skps) &mdash; Recipe for the Skia RecreateSKPs Bot.
* [run:examples/full](#recipes-run_examples_full)
* [skpbench](#recipes-skpbench)
* [sync_and_compile](#recipes-sync_and_compile)
* [test](#recipes-test)
* [test_canvaskit](#recipes-test_canvaskit)
* [test_lottie_web](#recipes-test_lottie_web)
* [test_pathkit](#recipes-test_pathkit)
* [test_skqp_emulator](#recipes-test_skqp_emulator)
* [upload_buildstats_results](#recipes-upload_buildstats_results)
* [upload_dm_results](#recipes-upload_dm_results)
* [upload_nano_results](#recipes-upload_nano_results)
* [vars:examples/full](#recipes-vars_examples_full)
## Recipe Modules
### *recipe_modules* / [build](/infra/bots/recipe_modules/build)
[DEPS](/infra/bots/recipe_modules/build/__init__.py#5): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [env](#recipe_modules-env), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
Build Skia for various platforms.
#### **class [BuildApi](/infra/bots/recipe_modules/build/api.py#22)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/build/api.py#55)(self, checkout_root, out_dir):**
Compile the code.
&mdash; **def [copy\_build\_products](/infra/bots/recipe_modules/build/api.py#59)(self, out_dir, dst):**
Copy selected build products to dst.
### *recipe_modules* / [builder\_name\_schema](/infra/bots/recipe_modules/builder_name_schema)
#### **class [BuilderNameSchemaApi](/infra/bots/recipe_modules/builder_name_schema/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [DictForBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#32)(self, \*args, \*\*kwargs):**
&mdash; **def [MakeBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#29)(self, \*\*kwargs):**
### *recipe_modules* / [checkout](/infra/bots/recipe_modules/checkout)
[DEPS](/infra/bots/recipe_modules/checkout/__init__.py#5): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
#### **class [CheckoutApi](/infra/bots/recipe_modules/checkout/api.py#13)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [assert\_git\_is\_from\_cipd](/infra/bots/recipe_modules/checkout/api.py#20)(self):**
Fail if git is not obtained from CIPD.
&mdash; **def [bot\_update](/infra/bots/recipe_modules/checkout/api.py#47)(self, checkout_root, gclient_cache=None, checkout_chromium=False, checkout_flutter=False, extra_gclient_env=None, flutter_android=False):**
Run the steps to obtain a checkout using bot_update.
Args:
checkout_root: Root directory where the code will be synced.
gclient_cache: Optional, directory of the gclient cache.
checkout_chromium: If True, will check out chromium/src.git in addition
to the primary repo.
checkout_flutter: If True, will checkout flutter in addition to the
primary repo.
extra_gclient_env: Map of extra environment variable names to their values
to supply while running gclient.
flutter_android: Indicates that we're checking out flutter for Android.
&emsp; **@property**<br>&mdash; **def [default\_checkout\_root](/infra/bots/recipe_modules/checkout/api.py#15)(self):**
The default location for cached persistent checkouts.
&mdash; **def [git](/infra/bots/recipe_modules/checkout/api.py#34)(self, checkout_root):**
Run the steps to perform a pure-git checkout without DEPS.
### *recipe_modules* / [docker](/infra/bots/recipe_modules/docker)
[DEPS](/infra/bots/recipe_modules/docker/__init__.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [run](#recipe_modules-run)
#### **class [DockerApi](/infra/bots/recipe_modules/docker/api.py#15)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [mount\_out](/infra/bots/recipe_modules/docker/api.py#27)(self):**
&mdash; **def [mount\_src](/infra/bots/recipe_modules/docker/api.py#24)(self):**
&mdash; **def [run](/infra/bots/recipe_modules/docker/api.py#32)(self, name, docker_image, src_dir, out_dir, script, args=None, docker_args=None, copies=None, recursive_read=None, attempts=1, match_directory_structure=False):**
### *recipe_modules* / [doxygen](/infra/bots/recipe_modules/doxygen)
[DEPS](/infra/bots/recipe_modules/doxygen/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run)
#### **class [DoxygenApi](/infra/bots/recipe_modules/doxygen/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [generate\_and\_upload](/infra/bots/recipe_modules/doxygen/api.py#10)(self, skia_dir):**
### *recipe_modules* / [env](/infra/bots/recipe_modules/env)
[DEPS](/infra/bots/recipe_modules/env/__init__.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context]
#### **class [EnvApi](/infra/bots/recipe_modules/env/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
### *recipe_modules* / [flavor](/infra/bots/recipe_modules/flavor)
[DEPS](/infra/bots/recipe_modules/flavor/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [env](#recipe_modules-env), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
#### **class [SkiaFlavorApi](/infra/bots/recipe_modules/flavor/api.py#63)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [cleanup\_steps](/infra/bots/recipe_modules/flavor/api.py#135)(self):**
&mdash; **def [copy\_directory\_contents\_to\_device](/infra/bots/recipe_modules/flavor/api.py#91)(self, host_dir, device_dir):**
&mdash; **def [copy\_directory\_contents\_to\_host](/infra/bots/recipe_modules/flavor/api.py#94)(self, device_dir, host_dir):**
&mdash; **def [copy\_file\_to\_device](/infra/bots/recipe_modules/flavor/api.py#97)(self, host_path, device_path):**
&mdash; **def [create\_clean\_device\_dir](/infra/bots/recipe_modules/flavor/api.py#103)(self, path):**
&mdash; **def [create\_clean\_host\_dir](/infra/bots/recipe_modules/flavor/api.py#100)(self, path):**
&mdash; **def [device\_path\_join](/infra/bots/recipe_modules/flavor/api.py#88)(self, \*args):**
&mdash; **def [get\_flavor](/infra/bots/recipe_modules/flavor/api.py#64)(self, vars_api, app_name):**
Return a flavor utils object specific to the given builder.
&mdash; **def [install](/infra/bots/recipe_modules/flavor/api.py#112)(self, skps=False, images=False, lotties=False, svgs=False, resources=False, mskps=False, texttraces=False):**
&mdash; **def [read\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#106)(self, path, \*\*kwargs):**
&mdash; **def [remove\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#109)(self, path):**
&mdash; **def [setup](/infra/bots/recipe_modules/flavor/api.py#79)(self, app_name):**
&mdash; **def [step](/infra/bots/recipe_modules/flavor/api.py#85)(self, name, cmd, \*\*kwargs):**
### *recipe_modules* / [git](/infra/bots/recipe_modules/git)
[DEPS](/infra/bots/recipe_modules/git/__init__.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [env](#recipe_modules-env)
#### **class [GitApi](/infra/bots/recipe_modules/git/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [env](/infra/bots/recipe_modules/git/api.py#10)(self):**
Add Git to PATH
Requires the infra/git and infra/tools/git CIPD packages to be installed
in the 'git' relative path.
### *recipe_modules* / [gold\_upload](/infra/bots/recipe_modules/gold_upload)
[DEPS](/infra/bots/recipe_modules/gold_upload/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [gsutil](#recipe_modules-gsutil), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
#### **class [GoldUploadApi](/infra/bots/recipe_modules/gold_upload/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [upload](/infra/bots/recipe_modules/gold_upload/api.py#12)(self):**
Attempt to upload files to Gold.
This module assumes setup has occurred for the vars and flavor modules.
### *recipe_modules* / [gsutil](/infra/bots/recipe_modules/gsutil)
[DEPS](/infra/bots/recipe_modules/gsutil/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
#### **class [GSUtilApi](/infra/bots/recipe_modules/gsutil/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/gsutil/api.py#11)(self, step_name, \*args):**
Run gsutil with the given args.
&mdash; **def [cp](/infra/bots/recipe_modules/gsutil/api.py#17)(self, name, src, dst, extra_args=None, multithread=False):**
Attempt to upload or download files to/from Google Cloud Storage (GCS).
Args:
name: string. Will be used to fill out the step name.
src: string. Absolute path for a local file or gcs file (e.g. gs://...)
dst: string. Same as src.
extra_args: optional list of args to be passed to gsutil. e.g. [-Z] asks
all files be compressed with gzip after upload and before download.
multi_thread: if the -m argument should be used to copy multiple items
at once (e.g. gsutil -m cp foo* gs://bar/dir)
If the operation fails, it will be retried multiple times.
### *recipe_modules* / [infra](/infra/bots/recipe_modules/infra)
[DEPS](/infra/bots/recipe_modules/infra/__init__.py#5): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
#### **class [InfraApi](/infra/bots/recipe_modules/infra/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&emsp; **@property**<br>&mdash; **def [go\_bin](/infra/bots/recipe_modules/infra/api.py#19)(self):**
&emsp; **@property**<br>&mdash; **def [go\_env](/infra/bots/recipe_modules/infra/api.py#23)(self):**
&emsp; **@property**<br>&mdash; **def [gopath](/infra/bots/recipe_modules/infra/api.py#33)(self):**
&emsp; **@property**<br>&mdash; **def [goroot](/infra/bots/recipe_modules/infra/api.py#15)(self):**
### *recipe_modules* / [run](/infra/bots/recipe_modules/run)
[DEPS](/infra/bots/recipe_modules/run/__init__.py#5): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [vars](#recipe_modules-vars)
#### **class [SkiaStepApi](/infra/bots/recipe_modules/run/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/run/api.py#69)(self, steptype, name, abort_on_failure=True, fail_build_on_failure=True, \*\*kwargs):**
Run a step. If it fails, keep going but mark the build status failed.
&mdash; **def [\_\_init\_\_](/infra/bots/recipe_modules/run/api.py#16)(self, \*args, \*\*kwargs):**
Initialize the recipe module.
&mdash; **def [asset\_version](/infra/bots/recipe_modules/run/api.py#54)(self, asset_name, skia_dir, test_data=None):**
Return the contents of VERSION for the given asset as a string.
If test_data is not specified, reads the property
'test_<asset_name>_version' or if not present, uses
TEST_DEFAULT_ASSET_VERSION.
&mdash; **def [check\_failure](/infra/bots/recipe_modules/run/api.py#25)(self):**
Raise an exception if any step failed.
&emsp; **@property**<br>&mdash; **def [failed\_steps](/infra/bots/recipe_modules/run/api.py#31)(self):**
&mdash; **def [readfile](/infra/bots/recipe_modules/run/api.py#40)(self, filename, \*args, \*\*kwargs):**
Convenience function for reading files.
&mdash; **def [rmtree](/infra/bots/recipe_modules/run/api.py#50)(self, path):**
Wrapper around api.file.rmtree.
&mdash; **def [run\_once](/infra/bots/recipe_modules/run/api.py#35)(self, fn, \*args, \*\*kwargs):**
&mdash; **def [with\_retry](/infra/bots/recipe_modules/run/api.py#81)(self, steptype, name, attempts, between_attempts_fn=None, abort_on_failure=True, fail_build_on_failure=True, \*\*kwargs):**
&mdash; **def [writefile](/infra/bots/recipe_modules/run/api.py#45)(self, filename, contents):**
Convenience function for writing files.
### *recipe_modules* / [vars](/infra/bots/recipe_modules/vars)
[DEPS](/infra/bots/recipe_modules/vars/__init__.py#5): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [builder\_name\_schema](#recipe_modules-builder_name_schema)
#### **class [SkiaVarsApi](/infra/bots/recipe_modules/vars/api.py#16)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&emsp; **@property**<br>&mdash; **def [is\_linux](/infra/bots/recipe_modules/vars/api.py#88)(self):**
&mdash; **def [setup](/infra/bots/recipe_modules/vars/api.py#18)(self):**
Prepare the variables.
&emsp; **@property**<br>&mdash; **def [swarming\_bot\_id](/infra/bots/recipe_modules/vars/api.py#96)(self):**
&emsp; **@property**<br>&mdash; **def [swarming\_task\_id](/infra/bots/recipe_modules/vars/api.py#108)(self):**
## Recipes
### *recipes* / [build:examples/full](/infra/bots/recipe_modules/build/examples/full.py)
[DEPS](/infra/bots/recipe_modules/build/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [build](#recipe_modules-build), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/build/examples/full.py#17)(api):**
### *recipes* / [builder\_name\_schema:examples/full](/infra/bots/recipe_modules/builder_name_schema/examples/full.py)
[DEPS](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#6): [builder\_name\_schema](#recipe_modules-builder_name_schema)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#11)(api):**
### *recipes* / [check\_generated\_files](/infra/bots/recipes/check_generated_files.py)
[DEPS](/infra/bots/recipes/check_generated_files.py#8): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/check_generated_files.py#24)(api):**
### *recipes* / [checkout:examples/full](/infra/bots/recipe_modules/checkout/examples/full.py)
[DEPS](/infra/bots/recipe_modules/checkout/examples/full.py#6): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/checkout/examples/full.py#17)(api):**
### *recipes* / [compile](/infra/bots/recipes/compile.py)
[DEPS](/infra/bots/recipes/compile.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/compile.py#25)(api):**
### *recipes* / [compute\_buildstats](/infra/bots/recipes/compute_buildstats.py)
[DEPS](/infra/bots/recipes/compute_buildstats.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [env](#recipe_modules-env), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/compute_buildstats.py#32)(api):**
&mdash; **def [add\_binary\_size\_output\_property](/infra/bots/recipes/compute_buildstats.py#28)(result, source, binary_size):**
&mdash; **def [analyze\_cpp\_lib](/infra/bots/recipes/compute_buildstats.py#164)(api, checkout_root, out_dir, files):**
&mdash; **def [analyze\_flutter\_lib](/infra/bots/recipes/compute_buildstats.py#192)(api, checkout_root, out_dir, files):**
&mdash; **def [analyze\_wasm\_file](/infra/bots/recipes/compute_buildstats.py#231)(api, checkout_root, out_dir, files):**
&mdash; **def [analyze\_web\_file](/infra/bots/recipes/compute_buildstats.py#137)(api, checkout_root, out_dir, files):**
&mdash; **def [keys\_and\_props](/infra/bots/recipes/compute_buildstats.py#113)(api):**
&mdash; **def [make\_treemap](/infra/bots/recipes/compute_buildstats.py#263)(api, checkout_root, out_dir, files):**
### *recipes* / [compute\_test](/infra/bots/recipes/compute_test.py)
[DEPS](/infra/bots/recipes/compute_test.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/compute_test.py#16)(api):**
### *recipes* / [docker:examples/full](/infra/bots/recipe_modules/docker/examples/full.py)
[DEPS](/infra/bots/recipe_modules/docker/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [docker](#recipe_modules-docker), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/docker/examples/full.py#15)(api):**
### *recipes* / [doxygen:examples/full](/infra/bots/recipe_modules/doxygen/examples/full.py)
[DEPS](/infra/bots/recipe_modules/doxygen/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [doxygen](#recipe_modules-doxygen), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/doxygen/examples/full.py#14)(api):**
### *recipes* / [env:examples/full](/infra/bots/recipe_modules/env/examples/full.py)
[DEPS](/infra/bots/recipe_modules/env/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/env/examples/full.py#13)(api):**
### *recipes* / [flavor:examples/full](/infra/bots/recipe_modules/flavor/examples/full.py)
[DEPS](/infra/bots/recipe_modules/flavor/examples/full.py#6): [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/flavor/examples/full.py#31)(api):**
&mdash; **def [test\_exceptions](/infra/bots/recipe_modules/flavor/examples/full.py#16)(api):**
### *recipes* / [git:examples/full](/infra/bots/recipe_modules/git/examples/full.py)
[DEPS](/infra/bots/recipe_modules/git/examples/full.py#6): [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/step][recipe_engine/recipe_modules/step], [git](#recipe_modules-git)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/git/examples/full.py#13)(api):**
### *recipes* / [gold\_upload:examples/full](/infra/bots/recipe_modules/gold_upload/examples/full.py)
[DEPS](/infra/bots/recipe_modules/gold_upload/examples/full.py#9): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/gold_upload/examples/full.py#21)(api):**
### *recipes* / [gsutil:examples/full](/infra/bots/recipe_modules/gsutil/examples/full.py)
[DEPS](/infra/bots/recipe_modules/gsutil/examples/full.py#9): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [gsutil](#recipe_modules-gsutil), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/gsutil/examples/full.py#20)(api):**
### *recipes* / [housekeeper](/infra/bots/recipes/housekeeper.py)
[DEPS](/infra/bots/recipes/housekeeper.py#12): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [checkout](#recipe_modules-checkout), [doxygen](#recipe_modules-doxygen), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/housekeeper.py#23)(api):**
### *recipes* / [infra](/infra/bots/recipes/infra.py)
[DEPS](/infra/bots/recipes/infra.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [infra](#recipe_modules-infra), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/infra.py#27)(api):**
&mdash; **def [git\_init](/infra/bots/recipes/infra.py#19)(api, repo_root, env):**
### *recipes* / [infra:examples/full](/infra/bots/recipe_modules/infra/examples/full.py)
[DEPS](/infra/bots/recipe_modules/infra/examples/full.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/infra/examples/full.py#22)(api):**
### *recipes* / [perf](/infra/bots/recipes/perf.py)
[DEPS](/infra/bots/recipes/perf.py#14): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/perf.py#103)(api):**
&mdash; **def [perf\_steps](/infra/bots/recipes/perf.py#30)(api):**
Run Skia benchmarks.
### *recipes* / [perf\_pathkit](/infra/bots/recipes/perf_pathkit.py)
[DEPS](/infra/bots/recipes/perf_pathkit.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/perf_pathkit.py#26)(api):**
### *recipes* / [perf\_skottietrace](/infra/bots/recipes/perf_skottietrace.py)
[DEPS](/infra/bots/recipes/perf_skottietrace.py#15): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/perf_skottietrace.py#221)(api):**
&mdash; **def [get\_trace\_match](/infra/bots/recipes/perf_skottietrace.py#130)(lottie_filename, is_android):**
Returns the DM regex to match the specified lottie file name.
&mdash; **def [parse\_trace](/infra/bots/recipes/perf_skottietrace.py#145)(trace_json, lottie_filename, api):**
parse_trace parses the specified trace JSON.
Parses the trace JSON and calculates the time of a single frame. Frame time is
considered the same as seek time + render time.
Note: The first seek is ignored because it is a constructor call.
A dictionary is returned that has the following structure:
{
'frame_max_us': 100,
'frame_min_us': 90,
'frame_avg_us': 95,
}
&mdash; **def [perf\_steps](/infra/bots/recipes/perf_skottietrace.py#35)(api):**
Run DM on lottie files with tracing turned on and then parse the output.
### *recipes* / [perf\_skottiewasm\_lottieweb](/infra/bots/recipes/perf_skottiewasm_lottieweb.py)
[DEPS](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [checkout](#recipe_modules-checkout), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#82)(api):**
&mdash; **def [parse\_trace](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#207)(trace_json, lottie_filename, api, renderer):**
parse_trace parses the specified trace JSON.
Parses the trace JSON and calculates the time of a single frame.
A dictionary is returned that has the following structure:
{
'frame_max_us': 100,
'frame_min_us': 90,
'frame_avg_us': 95,
}
### *recipes* / [recreate\_skps](/infra/bots/recipes/recreate_skps.py)
[DEPS](/infra/bots/recipes/recreate_skps.py#9): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
Recipe for the Skia RecreateSKPs Bot.
&mdash; **def [RunSteps](/infra/bots/recipes/recreate_skps.py#35)(api):**
### *recipes* / [run:examples/full](/infra/bots/recipe_modules/run/examples/full.py)
[DEPS](/infra/bots/recipe_modules/run/examples/full.py#6): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/run/examples/full.py#21)(api):**
&mdash; **def [myfunc](/infra/bots/recipe_modules/run/examples/full.py#17)(api, i):**
### *recipes* / [skpbench](/infra/bots/recipes/skpbench.py)
[DEPS](/infra/bots/recipes/skpbench.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/skpbench.py#155)(api):**
&mdash; **def [skpbench\_steps](/infra/bots/recipes/skpbench.py#41)(api):**
benchmark Skia using skpbench.
### *recipes* / [sync\_and\_compile](/infra/bots/recipes/sync_and_compile.py)
[DEPS](/infra/bots/recipes/sync_and_compile.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [build](#recipe_modules-build), [checkout](#recipe_modules-checkout), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/sync_and_compile.py#25)(api):**
### *recipes* / [test](/infra/bots/recipes/test.py)
[DEPS](/infra/bots/recipes/test.py#12): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/test.py#161)(api):**
&mdash; **def [test\_steps](/infra/bots/recipes/test.py#30)(api):**
Run the DM test.
### *recipes* / [test\_canvaskit](/infra/bots/recipes/test_canvaskit.py)
[DEPS](/infra/bots/recipes/test_canvaskit.py#8): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/test_canvaskit.py#28)(api):**
### *recipes* / [test\_lottie\_web](/infra/bots/recipes/test_lottie_web.py)
[DEPS](/infra/bots/recipes/test_lottie_web.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/test_lottie_web.py#27)(api):**
### *recipes* / [test\_pathkit](/infra/bots/recipes/test_pathkit.py)
[DEPS](/infra/bots/recipes/test_pathkit.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [docker](#recipe_modules-docker), [env](#recipe_modules-env), [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/test_pathkit.py#28)(api):**
### *recipes* / [test\_skqp\_emulator](/infra/bots/recipes/test_skqp_emulator.py)
[DEPS](/infra/bots/recipes/test_skqp_emulator.py#7): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/python][recipe_engine/recipe_modules/python], [recipe\_engine/step][recipe_engine/recipe_modules/step], [checkout](#recipe_modules-checkout), [infra](#recipe_modules-infra), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/test_skqp_emulator.py#25)(api):**
### *recipes* / [upload\_buildstats\_results](/infra/bots/recipes/upload_buildstats_results.py)
[DEPS](/infra/bots/recipes/upload_buildstats_results.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/upload_buildstats_results.py#20)(api):**
### *recipes* / [upload\_dm\_results](/infra/bots/recipes/upload_dm_results.py)
[DEPS](/infra/bots/recipes/upload_dm_results.py#12): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [gsutil](#recipe_modules-gsutil), [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/upload_dm_results.py#28)(api):**
### *recipes* / [upload\_nano\_results](/infra/bots/recipes/upload_nano_results.py)
[DEPS](/infra/bots/recipes/upload_nano_results.py#9): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time], [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipes/upload_nano_results.py#20)(api):**
### *recipes* / [vars:examples/full](/infra/bots/recipe_modules/vars/examples/full.py)
[DEPS](/infra/bots/recipe_modules/vars/examples/full.py#6): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step], [vars](#recipe_modules-vars)
&mdash; **def [RunSteps](/infra/bots/recipe_modules/vars/examples/full.py#15)(api):**
[depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/343f63643b432ace2d2d4c253c6c327bb18c03ea/recipes/README.recipes.md#recipe_modules-bot_update
[depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/343f63643b432ace2d2d4c253c6c327bb18c03ea/recipes/README.recipes.md#recipe_modules-gclient
[depot_tools/recipe_modules/git]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/343f63643b432ace2d2d4c253c6c327bb18c03ea/recipes/README.recipes.md#recipe_modules-git
[depot_tools/recipe_modules/tryserver]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/343f63643b432ace2d2d4c253c6c327bb18c03ea/recipes/README.recipes.md#recipe_modules-tryserver
[recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-context
[recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-file
[recipe_engine/recipe_modules/json]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-json
[recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-path
[recipe_engine/recipe_modules/platform]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-platform
[recipe_engine/recipe_modules/properties]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-properties
[recipe_engine/recipe_modules/python]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-python
[recipe_engine/recipe_modules/raw_io]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-raw_io
[recipe_engine/recipe_modules/step]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-step
[recipe_engine/recipe_modules/time]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/README.recipes.md#recipe_modules-time
[recipe_engine/wkt/RecipeApi]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/c89555ad4aad0d235c318a660be9bb34a5d51c60/recipe_engine/recipe_api.py#802