• Home
Name Date Size #Lines LOC

..--

analysis/03-May-2024-11442

assets/03-May-2024-3,3561,957

buildstats/03-May-2024-457301

gen_tasks_logic/03-May-2024-5,5304,242

recipe_modules/03-May-2024-44,72843,303

recipes/03-May-2024-25,97925,328

task_drivers/03-May-2024-6,8695,592

tools/luci-go/03-May-2024-1710

BUILD.bazelD03-May-20242.9 KiB5450

MakefileD03-May-202458 64

README.mdD03-May-20243 KiB9764

README.recipes.mdD03-May-202443.3 KiB602367

build_task_drivers.shD03-May-20241.4 KiB339

bundle_recipes.shD03-May-2024320 168

cfg.jsonD03-May-20241.1 KiB2726

check_deps.pyD03-May-20241.9 KiB7248

gen_tasks.goD03-May-2024359 197

git_utils.pyD03-May-20245.8 KiB164132

infra_tests.pyD03-May-20241.9 KiB9163

jobs.jsonD03-May-202456.7 KiB1,0431,043

recipes.pyD03-May-20248.5 KiB266175

run_recipe.pyD03-May-20241.2 KiB4129

tasks.jsonD03-May-20244.2 MiB94,36594,364

test_utils.pyD03-May-20242 KiB7450

utils.pyD03-May-20246.6 KiB204145

zip_utils.pyD03-May-20242.5 KiB7960

zip_utils_test.pyD03-May-20241.9 KiB7545

README.md

1Skia Infrastructure
2===================
3
4This directory contains infrastructure elements.
5
6
7Tasks and Jobs
8--------------
9
10Files in this directory define a DAG of tasks which run at every Skia commit. A
11task is a small, self-contained unit which runs via Swarming on a machine in the
12pool. Tasks may be chained together, eg. one task to compile test binaries and
13another to actually run them.
14
15Jobs are collections of related tasks which help define sub-sections of the DAG,
16for example, to be used as try jobs. Each job is defined as an entry point into
17the DAG.
18
19The tasks.json file in this directory is the list of tasks and jobs for
20the repo. Note that tasks.json is NEVER edited by hand but generated via
21gen_task.go and the input files enumerated below. The
22[Task Scheduler](https://skia.googlesource.com/buildbot/+/main/task_scheduler/README.md)
23reads the tasks.json file at each commit to determine which jobs to run. For
24convenience, gen_tasks.go is provided to generate tasks.json and also to test it
25for correct syntax and detecting cycles and orphaned tasks. Always edit
26gen_tasks.go or one of the following input JSON files, rather than tasks.json
27itself:
28
29  * cfg.json - Basic configuration information for gen_tasks.go.
30  * jobs.json - The list of all jobs to run. Edit this to add or remove
31      bots.
32
33Whenever gen_tasks.go, any of the above JSON files, or assets are changed, you
34need to run gen_tasks.go to regenerate tasks.json:
35
36	$ go run infra/bots/gen_tasks.go
37
38Or:
39
40	$ make -C infra/bots train
41
42There is also a test mode which performs consistency checks and verifies that
43tasks.json is unchanged:
44
45	$ go run infra/bots/gen_tasks.go --test
46
47Or:
48
49	$ make -C infra/bots test
50
51
52Recipes
53-------
54
55Recipes are the framework used by Skia's infrastructure to perform work inside
56of Swarming tasks. The main elements are:
57
58  * recipes.py - Used for running and testing recipes.
59  * recipes - These are the entry points for each type of task, eg. compiling
60      or running tests.
61  * recipe_modules - Shared modules which are used by recipes.
62  * .recipe_deps - Recipes and modules may depend on modules from other repos.
63      The recipes.py script automatically syncs those dependencies in this
64      directory.
65
66
67Isolate Files
68-------------
69
70These files determine which parts of the repository are transferred to the bot
71when a Swarming task is triggered. The
72[Isolate tool](https://github.com/luci/luci-py/tree/main/appengine/isolate/doc)
73hashes each file and will upload any new/changed files. Bots maintain a cache so
74that they can efficiently download only the files they don't have.
75
76
77Assets
78------
79
80Artifacts used by the infrastructure are versioned here, along with scripts for
81recreating/uploading/downloading them. See the README in that directory for more
82information. Any time an asset used by the bots changes, you need to re-run
83gen_tasks.go.
84
85
86Tools
87-----
88
89Assorted other infrastructure-related tools, eg. isolate and CIPD binaries.
90
91
92CT
93--
94
95Helpers for running Skia tasks in Cluster Telemetry.
96
97

README.recipes.md

1<!--- AUTOGENERATED BY `./recipes.py test train` -->
2# Repo documentation for [skia]()
3## Table of Contents
4
5**[Recipe Modules](#Recipe-Modules)**
6  * [build](#recipe_modules-build) (Python3 ✅) &mdash; Build Skia for various platforms.
7  * [builder_name_schema](#recipe_modules-builder_name_schema) (Python3 ✅)
8  * [checkout](#recipe_modules-checkout) (Python3 ✅)
9  * [docker](#recipe_modules-docker) (Python3 ✅)
10  * [doxygen](#recipe_modules-doxygen) (Python3 ✅)
11  * [env](#recipe_modules-env) (Python3 ✅)
12  * [flavor](#recipe_modules-flavor) (Python3 ✅)
13  * [git](#recipe_modules-git) (Python3 ✅)
14  * [gold_upload](#recipe_modules-gold_upload) (Python3 ✅)
15  * [gsutil](#recipe_modules-gsutil) (Python3 ✅)
16  * [infra](#recipe_modules-infra) (Python3 ✅)
17  * [run](#recipe_modules-run) (Python3 ✅)
18  * [vars](#recipe_modules-vars) (Python3 ✅)
19
20**[Recipes](#Recipes)**
21  * [build:examples/full](#recipes-build_examples_full) (Python3 ✅)
22  * [builder_name_schema:examples/full](#recipes-builder_name_schema_examples_full) (Python3 ✅)
23  * [checkout:examples/full](#recipes-checkout_examples_full) (Python3 ✅)
24  * [compile](#recipes-compile) (Python3 ✅)
25  * [compute_buildstats](#recipes-compute_buildstats) (Python3 ✅)
26  * [docker:examples/full](#recipes-docker_examples_full) (Python3 ✅)
27  * [doxygen:examples/full](#recipes-doxygen_examples_full) (Python3 ✅)
28  * [env:examples/full](#recipes-env_examples_full) (Python3 ✅)
29  * [flavor:examples/full](#recipes-flavor_examples_full) (Python3 ✅)
30  * [git:examples/full](#recipes-git_examples_full) (Python3 ✅)
31  * [gold_upload:examples/full](#recipes-gold_upload_examples_full) (Python3 ✅)
32  * [gsutil:examples/full](#recipes-gsutil_examples_full) (Python3 ✅)
33  * [housekeeper](#recipes-housekeeper) (Python3 ✅)
34  * [infra](#recipes-infra) (Python3 ✅)
35  * [infra:examples/full](#recipes-infra_examples_full) (Python3 ✅)
36  * [perf](#recipes-perf) (Python3 ✅)
37  * [perf_pathkit](#recipes-perf_pathkit) (Python3 ✅)
38  * [perf_skottietrace](#recipes-perf_skottietrace) (Python3 ✅)
39  * [perf_skottiewasm_lottieweb](#recipes-perf_skottiewasm_lottieweb) (Python3 ✅)
40  * [run:examples/full](#recipes-run_examples_full) (Python3 ✅)
41  * [skpbench](#recipes-skpbench) (Python3 ✅)
42  * [sync_and_compile](#recipes-sync_and_compile) (Python3 ✅)
43  * [test](#recipes-test) (Python3 ✅)
44  * [test_canvaskit](#recipes-test_canvaskit) (Python3 ✅)
45  * [test_lottie_web](#recipes-test_lottie_web) (Python3 ✅)
46  * [test_pathkit](#recipes-test_pathkit) (Python3 ✅)
47  * [upload_buildstats_results](#recipes-upload_buildstats_results) (Python3 ✅)
48  * [upload_dm_results](#recipes-upload_dm_results) (Python3 ✅)
49  * [upload_nano_results](#recipes-upload_nano_results) (Python3 ✅)
50  * [vars:examples/full](#recipes-vars_examples_full) (Python3 ✅)
51## Recipe Modules
52
53### *recipe_modules* / [build](/infra/bots/recipe_modules/build)
54
55[DEPS](/infra/bots/recipe_modules/build/__init__.py#7): [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)
56
57PYTHON_VERSION_COMPATIBILITY: PY3
58
59Build Skia for various platforms.
60
61#### **class [BuildApi](/infra/bots/recipe_modules/build/api.py#20)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
62
63&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/build/api.py#47)(self, checkout_root, out_dir):**
64
65Compile the code.
66
67&mdash; **def [copy\_build\_products](/infra/bots/recipe_modules/build/api.py#51)(self, out_dir, dst):**
68
69Copy selected build products to dst.
70### *recipe_modules* / [builder\_name\_schema](/infra/bots/recipe_modules/builder_name_schema)
71
72PYTHON_VERSION_COMPATIBILITY: PY3
73
74#### **class [BuilderNameSchemaApi](/infra/bots/recipe_modules/builder_name_schema/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
75
76&mdash; **def [DictForBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#32)(self, \*args, \*\*kwargs):**
77
78&mdash; **def [MakeBuilderName](/infra/bots/recipe_modules/builder_name_schema/api.py#29)(self, \*\*kwargs):**
79### *recipe_modules* / [checkout](/infra/bots/recipe_modules/checkout)
80
81[DEPS](/infra/bots/recipe_modules/checkout/__init__.py#7): [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)
82
83PYTHON_VERSION_COMPATIBILITY: PY3
84
85#### **class [CheckoutApi](/infra/bots/recipe_modules/checkout/api.py#13)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
86
87&mdash; **def [assert\_git\_is\_from\_cipd](/infra/bots/recipe_modules/checkout/api.py#20)(self):**
88
89Fail if git is not obtained from CIPD.
90
91&mdash; **def [bot\_update](/infra/bots/recipe_modules/checkout/api.py#48)(self, checkout_root, gclient_cache=None, skip_patch=False, override_revision=None):**
92
93Run the steps to obtain a checkout using bot_update.
94
95Args:
96  checkout_root: Root directory where the code will be synced.
97  gclient_cache: Optional, directory of the gclient cache.
98  skip_patch: Ignore changelist/patchset when syncing the Skia repo.
99
100&emsp; **@property**<br>&mdash; **def [default\_checkout\_root](/infra/bots/recipe_modules/checkout/api.py#15)(self):**
101
102The default location for cached persistent checkouts.
103
104&mdash; **def [git](/infra/bots/recipe_modules/checkout/api.py#35)(self, checkout_root):**
105
106Run the steps to perform a pure-git checkout without DEPS.
107### *recipe_modules* / [docker](/infra/bots/recipe_modules/docker)
108
109[DEPS](/infra/bots/recipe_modules/docker/__init__.py#8): [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)
110
111PYTHON_VERSION_COMPATIBILITY: PY3
112
113#### **class [DockerApi](/infra/bots/recipe_modules/docker/api.py#15)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
114
115&mdash; **def [mount\_out](/infra/bots/recipe_modules/docker/api.py#27)(self):**
116
117&mdash; **def [mount\_src](/infra/bots/recipe_modules/docker/api.py#24)(self):**
118
119&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):**
120### *recipe_modules* / [doxygen](/infra/bots/recipe_modules/doxygen)
121
122[DEPS](/infra/bots/recipe_modules/doxygen/__init__.py#7): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run)
123
124PYTHON_VERSION_COMPATIBILITY: PY3
125
126#### **class [DoxygenApi](/infra/bots/recipe_modules/doxygen/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
127
128&mdash; **def [generate\_and\_upload](/infra/bots/recipe_modules/doxygen/api.py#10)(self, skia_dir):**
129### *recipe_modules* / [env](/infra/bots/recipe_modules/env)
130
131[DEPS](/infra/bots/recipe_modules/env/__init__.py#7): [recipe\_engine/context][recipe_engine/recipe_modules/context]
132
133PYTHON_VERSION_COMPATIBILITY: PY3
134
135#### **class [EnvApi](/infra/bots/recipe_modules/env/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
136### *recipe_modules* / [flavor](/infra/bots/recipe_modules/flavor)
137
138[DEPS](/infra/bots/recipe_modules/flavor/__init__.py#7): [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], [env](#recipe_modules-env), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
139
140PYTHON_VERSION_COMPATIBILITY: PY3
141
142#### **class [SkiaFlavorApi](/infra/bots/recipe_modules/flavor/api.py#55)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
143
144&mdash; **def [cleanup\_steps](/infra/bots/recipe_modules/flavor/api.py#125)(self):**
145
146&mdash; **def [copy\_directory\_contents\_to\_device](/infra/bots/recipe_modules/flavor/api.py#81)(self, host_dir, device_dir):**
147
148&mdash; **def [copy\_directory\_contents\_to\_host](/infra/bots/recipe_modules/flavor/api.py#84)(self, device_dir, host_dir):**
149
150&mdash; **def [copy\_file\_to\_device](/infra/bots/recipe_modules/flavor/api.py#87)(self, host_path, device_path):**
151
152&mdash; **def [create\_clean\_device\_dir](/infra/bots/recipe_modules/flavor/api.py#93)(self, path):**
153
154&mdash; **def [create\_clean\_host\_dir](/infra/bots/recipe_modules/flavor/api.py#90)(self, path):**
155
156&mdash; **def [device\_path\_join](/infra/bots/recipe_modules/flavor/api.py#78)(self, \*args):**
157
158&mdash; **def [get\_flavor](/infra/bots/recipe_modules/flavor/api.py#56)(self, vars_api, app_name):**
159
160Return a flavor utils object specific to the given builder.
161
162&mdash; **def [install](/infra/bots/recipe_modules/flavor/api.py#102)(self, skps=False, images=False, lotties=False, svgs=False, resources=False, mskps=False, texttraces=False):**
163
164&mdash; **def [read\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#96)(self, path, \*\*kwargs):**
165
166&mdash; **def [remove\_file\_on\_device](/infra/bots/recipe_modules/flavor/api.py#99)(self, path):**
167
168&mdash; **def [setup](/infra/bots/recipe_modules/flavor/api.py#69)(self, app_name):**
169
170&mdash; **def [step](/infra/bots/recipe_modules/flavor/api.py#75)(self, name, cmd, \*\*kwargs):**
171### *recipe_modules* / [git](/infra/bots/recipe_modules/git)
172
173[DEPS](/infra/bots/recipe_modules/git/__init__.py#7): [recipe\_engine/path][recipe_engine/recipe_modules/path], [env](#recipe_modules-env)
174
175PYTHON_VERSION_COMPATIBILITY: PY3
176
177#### **class [GitApi](/infra/bots/recipe_modules/git/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
178
179&mdash; **def [env](/infra/bots/recipe_modules/git/api.py#10)(self):**
180
181Add Git to PATH
182
183Requires the infra/git and infra/tools/git CIPD packages to be installed
184in the 'git' relative path.
185### *recipe_modules* / [gold\_upload](/infra/bots/recipe_modules/gold_upload)
186
187[DEPS](/infra/bots/recipe_modules/gold_upload/__init__.py#7): [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/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], [recipe\_engine/time][recipe_engine/recipe_modules/time], [flavor](#recipe_modules-flavor), [gsutil](#recipe_modules-gsutil), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
188
189PYTHON_VERSION_COMPATIBILITY: PY3
190
191#### **class [GoldUploadApi](/infra/bots/recipe_modules/gold_upload/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
192
193&mdash; **def [upload](/infra/bots/recipe_modules/gold_upload/api.py#12)(self):**
194
195Attempt to upload files to Gold.
196This module assumes setup has occurred for the vars and flavor modules.
197### *recipe_modules* / [gsutil](/infra/bots/recipe_modules/gsutil)
198
199[DEPS](/infra/bots/recipe_modules/gsutil/__init__.py#7): [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)
200
201PYTHON_VERSION_COMPATIBILITY: PY3
202
203#### **class [GSUtilApi](/infra/bots/recipe_modules/gsutil/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
204
205&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/gsutil/api.py#11)(self, step_name, \*args):**
206
207Run gsutil with the given args.
208
209This assumes there exists an executable called gsutil on the PATH.
210This probably only works for Linux/Mac, but those are the only
211hosts that we try to upload to GCS from anyway.
212
213&mdash; **def [cp](/infra/bots/recipe_modules/gsutil/api.py#20)(self, name, src, dst, extra_gsutil_args=None, extra_args=None, multithread=False):**
214
215Attempt to upload or download files to/from Google Cloud Storage (GCS).
216
217Args:
218  name: string. Will be used to fill out the step name.
219  src: string. Absolute path for a local file or gcs file (e.g. gs://...)
220  dst: string. Same as src.
221  extra_gsutil_args: optional list of args to be passed to gsutil before the
222    cp command.
223  extra_args: optional list of args to be passed to gsutil cp. e.g. [-Z]
224    asks all files be compressed with gzip after upload and before download.
225  multi_thread: if the -m argument should be used to copy multiple items
226    at once (e.g. gsutil -m cp foo* gs://bar/dir)
227
228If the operation fails, it will be retried multiple times.
229### *recipe_modules* / [infra](/infra/bots/recipe_modules/infra)
230
231[DEPS](/infra/bots/recipe_modules/infra/__init__.py#7): [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [run](#recipe_modules-run), [vars](#recipe_modules-vars)
232
233PYTHON_VERSION_COMPATIBILITY: PY3
234
235#### **class [InfraApi](/infra/bots/recipe_modules/infra/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
236
237&emsp; **@property**<br>&mdash; **def [go\_bin](/infra/bots/recipe_modules/infra/api.py#46)(self):**
238
239&emsp; **@property**<br>&mdash; **def [go\_env](/infra/bots/recipe_modules/infra/api.py#50)(self):**
240
241&emsp; **@property**<br>&mdash; **def [gopath](/infra/bots/recipe_modules/infra/api.py#60)(self):**
242
243&emsp; **@property**<br>&mdash; **def [goroot](/infra/bots/recipe_modules/infra/api.py#15)(self):**
244### *recipe_modules* / [run](/infra/bots/recipe_modules/run)
245
246[DEPS](/infra/bots/recipe_modules/run/__init__.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], [env](#recipe_modules-env), [vars](#recipe_modules-vars)
247
248PYTHON_VERSION_COMPATIBILITY: PY3
249
250#### **class [SkiaStepApi](/infra/bots/recipe_modules/run/api.py#14)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
251
252&mdash; **def [\_\_call\_\_](/infra/bots/recipe_modules/run/api.py#69)(self, steptype, name, abort_on_failure=True, fail_build_on_failure=True, \*\*kwargs):**
253
254Run a step. If it fails, keep going but mark the build status failed.
255
256&mdash; **def [\_\_init\_\_](/infra/bots/recipe_modules/run/api.py#16)(self, \*args, \*\*kwargs):**
257
258Initialize the recipe module.
259
260&mdash; **def [asset\_version](/infra/bots/recipe_modules/run/api.py#54)(self, asset_name, skia_dir, test_data=None):**
261
262Return the contents of VERSION for the given asset as a string.
263
264If test_data is not specified, reads the property
265'test_<asset_name>_version' or if not present, uses
266TEST_DEFAULT_ASSET_VERSION.
267
268&mdash; **def [check\_failure](/infra/bots/recipe_modules/run/api.py#25)(self):**
269
270Raise an exception if any step failed.
271
272&emsp; **@property**<br>&mdash; **def [failed\_steps](/infra/bots/recipe_modules/run/api.py#31)(self):**
273
274&mdash; **def [readfile](/infra/bots/recipe_modules/run/api.py#40)(self, filename, \*args, \*\*kwargs):**
275
276Convenience function for reading files.
277
278&mdash; **def [rmtree](/infra/bots/recipe_modules/run/api.py#50)(self, path):**
279
280Wrapper around api.file.rmtree.
281
282&mdash; **def [run\_once](/infra/bots/recipe_modules/run/api.py#35)(self, fn, \*args, \*\*kwargs):**
283
284&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):**
285
286&mdash; **def [writefile](/infra/bots/recipe_modules/run/api.py#45)(self, filename, contents):**
287
288Convenience function for writing files.
289### *recipe_modules* / [vars](/infra/bots/recipe_modules/vars)
290
291[DEPS](/infra/bots/recipe_modules/vars/__init__.py#7): [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)
292
293PYTHON_VERSION_COMPATIBILITY: PY3
294
295#### **class [SkiaVarsApi](/infra/bots/recipe_modules/vars/api.py#16)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
296
297&emsp; **@property**<br>&mdash; **def [is\_linux](/infra/bots/recipe_modules/vars/api.py#88)(self):**
298
299&mdash; **def [setup](/infra/bots/recipe_modules/vars/api.py#18)(self):**
300
301Prepare the variables.
302
303&emsp; **@property**<br>&mdash; **def [swarming\_bot\_id](/infra/bots/recipe_modules/vars/api.py#96)(self):**
304
305&emsp; **@property**<br>&mdash; **def [swarming\_task\_id](/infra/bots/recipe_modules/vars/api.py#108)(self):**
306## Recipes
307
308### *recipes* / [build:examples/full](/infra/bots/recipe_modules/build/examples/full.py)
309
310[DEPS](/infra/bots/recipe_modules/build/examples/full.py#7): [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)
311
312PYTHON_VERSION_COMPATIBILITY: PY3
313
314&mdash; **def [RunSteps](/infra/bots/recipe_modules/build/examples/full.py#18)(api):**
315### *recipes* / [builder\_name\_schema:examples/full](/infra/bots/recipe_modules/builder_name_schema/examples/full.py)
316
317[DEPS](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#7): [builder\_name\_schema](#recipe_modules-builder_name_schema)
318
319PYTHON_VERSION_COMPATIBILITY: PY3
320
321&mdash; **def [RunSteps](/infra/bots/recipe_modules/builder_name_schema/examples/full.py#12)(api):**
322### *recipes* / [checkout:examples/full](/infra/bots/recipe_modules/checkout/examples/full.py)
323
324[DEPS](/infra/bots/recipe_modules/checkout/examples/full.py#7): [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)
325
326PYTHON_VERSION_COMPATIBILITY: PY3
327
328&mdash; **def [RunSteps](/infra/bots/recipe_modules/checkout/examples/full.py#18)(api):**
329### *recipes* / [compile](/infra/bots/recipes/compile.py)
330
331[DEPS](/infra/bots/recipes/compile.py#10): [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)
332
333PYTHON_VERSION_COMPATIBILITY: PY3
334
335&mdash; **def [RunSteps](/infra/bots/recipes/compile.py#26)(api):**
336### *recipes* / [compute\_buildstats](/infra/bots/recipes/compute_buildstats.py)
337
338[DEPS](/infra/bots/recipes/compute_buildstats.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/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)
339
340PYTHON_VERSION_COMPATIBILITY: PY3
341
342&mdash; **def [RunSteps](/infra/bots/recipes/compute_buildstats.py#35)(api):**
343
344&mdash; **def [add\_binary\_size\_output\_property](/infra/bots/recipes/compute_buildstats.py#31)(result, source, binary_size):**
345
346&mdash; **def [analyze\_cpp\_lib](/infra/bots/recipes/compute_buildstats.py#167)(api, checkout_root, out_dir, files):**
347
348&mdash; **def [analyze\_flutter\_lib](/infra/bots/recipes/compute_buildstats.py#195)(api, checkout_root, out_dir, files):**
349
350&mdash; **def [analyze\_wasm\_file](/infra/bots/recipes/compute_buildstats.py#234)(api, checkout_root, out_dir, files):**
351
352&mdash; **def [analyze\_web\_file](/infra/bots/recipes/compute_buildstats.py#140)(api, checkout_root, out_dir, files):**
353
354&mdash; **def [keys\_and\_props](/infra/bots/recipes/compute_buildstats.py#116)(api):**
355
356&mdash; **def [make\_treemap](/infra/bots/recipes/compute_buildstats.py#266)(api, checkout_root, out_dir, files):**
357### *recipes* / [docker:examples/full](/infra/bots/recipe_modules/docker/examples/full.py)
358
359[DEPS](/infra/bots/recipe_modules/docker/examples/full.py#7): [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)
360
361PYTHON_VERSION_COMPATIBILITY: PY3
362
363&mdash; **def [RunSteps](/infra/bots/recipe_modules/docker/examples/full.py#16)(api):**
364### *recipes* / [doxygen:examples/full](/infra/bots/recipe_modules/doxygen/examples/full.py)
365
366[DEPS](/infra/bots/recipe_modules/doxygen/examples/full.py#7): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [doxygen](#recipe_modules-doxygen), [vars](#recipe_modules-vars)
367
368PYTHON_VERSION_COMPATIBILITY: PY3
369
370&mdash; **def [RunSteps](/infra/bots/recipe_modules/doxygen/examples/full.py#15)(api):**
371### *recipes* / [env:examples/full](/infra/bots/recipe_modules/env/examples/full.py)
372
373[DEPS](/infra/bots/recipe_modules/env/examples/full.py#7): [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/step][recipe_engine/recipe_modules/step], [env](#recipe_modules-env)
374
375PYTHON_VERSION_COMPATIBILITY: PY3
376
377&mdash; **def [RunSteps](/infra/bots/recipe_modules/env/examples/full.py#14)(api):**
378### *recipes* / [flavor:examples/full](/infra/bots/recipe_modules/flavor/examples/full.py)
379
380[DEPS](/infra/bots/recipe_modules/flavor/examples/full.py#7): [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)
381
382PYTHON_VERSION_COMPATIBILITY: PY3
383
384&mdash; **def [RunSteps](/infra/bots/recipe_modules/flavor/examples/full.py#32)(api):**
385
386&mdash; **def [test\_exceptions](/infra/bots/recipe_modules/flavor/examples/full.py#17)(api):**
387### *recipes* / [git:examples/full](/infra/bots/recipe_modules/git/examples/full.py)
388
389[DEPS](/infra/bots/recipe_modules/git/examples/full.py#7): [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/step][recipe_engine/recipe_modules/step], [git](#recipe_modules-git)
390
391PYTHON_VERSION_COMPATIBILITY: PY3
392
393&mdash; **def [RunSteps](/infra/bots/recipe_modules/git/examples/full.py#14)(api):**
394### *recipes* / [gold\_upload:examples/full](/infra/bots/recipe_modules/gold_upload/examples/full.py)
395
396[DEPS](/infra/bots/recipe_modules/gold_upload/examples/full.py#10): [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], [flavor](#recipe_modules-flavor), [gold\_upload](#recipe_modules-gold_upload), [run](#recipe_modules-run), [vars](#recipe_modules-vars)
397
398PYTHON_VERSION_COMPATIBILITY: PY3
399
400&mdash; **def [RunSteps](/infra/bots/recipe_modules/gold_upload/examples/full.py#23)(api):**
401### *recipes* / [gsutil:examples/full](/infra/bots/recipe_modules/gsutil/examples/full.py)
402
403[DEPS](/infra/bots/recipe_modules/gsutil/examples/full.py#10): [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)
404
405PYTHON_VERSION_COMPATIBILITY: PY3
406
407&mdash; **def [RunSteps](/infra/bots/recipe_modules/gsutil/examples/full.py#21)(api):**
408### *recipes* / [housekeeper](/infra/bots/recipes/housekeeper.py)
409
410[DEPS](/infra/bots/recipes/housekeeper.py#13): [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)
411
412PYTHON_VERSION_COMPATIBILITY: PY3
413
414&mdash; **def [RunSteps](/infra/bots/recipes/housekeeper.py#24)(api):**
415### *recipes* / [infra](/infra/bots/recipes/infra.py)
416
417[DEPS](/infra/bots/recipes/infra.py#10): [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)
418
419PYTHON_VERSION_COMPATIBILITY: PY3
420
421&mdash; **def [RunSteps](/infra/bots/recipes/infra.py#28)(api):**
422
423&mdash; **def [git\_init](/infra/bots/recipes/infra.py#20)(api, repo_root, env):**
424### *recipes* / [infra:examples/full](/infra/bots/recipe_modules/infra/examples/full.py)
425
426[DEPS](/infra/bots/recipe_modules/infra/examples/full.py#10): [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)
427
428PYTHON_VERSION_COMPATIBILITY: PY3
429
430&mdash; **def [RunSteps](/infra/bots/recipe_modules/infra/examples/full.py#23)(api):**
431### *recipes* / [perf](/infra/bots/recipes/perf.py)
432
433[DEPS](/infra/bots/recipes/perf.py#15): [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)
434
435PYTHON_VERSION_COMPATIBILITY: PY3
436
437&mdash; **def [RunSteps](/infra/bots/recipes/perf.py#104)(api):**
438
439&mdash; **def [perf\_steps](/infra/bots/recipes/perf.py#31)(api):**
440
441Run Skia benchmarks.
442### *recipes* / [perf\_pathkit](/infra/bots/recipes/perf_pathkit.py)
443
444[DEPS](/infra/bots/recipes/perf_pathkit.py#9): [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)
445
446PYTHON_VERSION_COMPATIBILITY: PY3
447
448&mdash; **def [RunSteps](/infra/bots/recipes/perf_pathkit.py#28)(api):**
449### *recipes* / [perf\_skottietrace](/infra/bots/recipes/perf_skottietrace.py)
450
451[DEPS](/infra/bots/recipes/perf_skottietrace.py#17): [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)
452
453PYTHON_VERSION_COMPATIBILITY: PY3
454
455&mdash; **def [RunSteps](/infra/bots/recipes/perf_skottietrace.py#238)(api):**
456
457&mdash; **def [get\_trace\_match](/infra/bots/recipes/perf_skottietrace.py#147)(lottie_filename, is_android):**
458
459Returns the DM regex to match the specified lottie file name.
460
461&mdash; **def [parse\_trace](/infra/bots/recipes/perf_skottietrace.py#162)(trace_json, lottie_filename, api):**
462
463parse_trace parses the specified trace JSON.
464
465Parses the trace JSON and calculates the time of a single frame. Frame time is
466considered the same as seek time + render time.
467Note: The first seek is ignored because it is a constructor call.
468
469A dictionary is returned that has the following structure:
470{
471  'frame_max_us': 100,
472  'frame_min_us': 90,
473  'frame_avg_us': 95,
474}
475
476&mdash; **def [perf\_steps](/infra/bots/recipes/perf_skottietrace.py#37)(api):**
477
478Run DM on lottie files with tracing turned on and then parse the output.
479### *recipes* / [perf\_skottiewasm\_lottieweb](/infra/bots/recipes/perf_skottiewasm_lottieweb.py)
480
481[DEPS](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#14): [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)
482
483PYTHON_VERSION_COMPATIBILITY: PY3
484
485&mdash; **def [RunSteps](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#84)(api):**
486
487&mdash; **def [parse\_trace](/infra/bots/recipes/perf_skottiewasm_lottieweb.py#205)(trace_json, lottie_filename, api, renderer):**
488
489parse_trace parses the specified trace JSON.
490
491Parses the trace JSON and calculates the time of a single frame.
492A dictionary is returned that has the following structure:
493{
494  'frame_max_us': 100,
495  'frame_min_us': 90,
496  'frame_avg_us': 95,
497}
498### *recipes* / [run:examples/full](/infra/bots/recipe_modules/run/examples/full.py)
499
500[DEPS](/infra/bots/recipe_modules/run/examples/full.py#7): [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)
501
502PYTHON_VERSION_COMPATIBILITY: PY3
503
504&mdash; **def [RunSteps](/infra/bots/recipe_modules/run/examples/full.py#22)(api):**
505
506&mdash; **def [myfunc](/infra/bots/recipe_modules/run/examples/full.py#18)(api, i):**
507### *recipes* / [skpbench](/infra/bots/recipes/skpbench.py)
508
509[DEPS](/infra/bots/recipes/skpbench.py#13): [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)
510
511PYTHON_VERSION_COMPATIBILITY: PY3
512
513&mdash; **def [RunSteps](/infra/bots/recipes/skpbench.py#163)(api):**
514
515&mdash; **def [skpbench\_steps](/infra/bots/recipes/skpbench.py#42)(api):**
516
517benchmark Skia using skpbench.
518### *recipes* / [sync\_and\_compile](/infra/bots/recipes/sync_and_compile.py)
519
520[DEPS](/infra/bots/recipes/sync_and_compile.py#10): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [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)
521
522PYTHON_VERSION_COMPATIBILITY: PY3
523
524&mdash; **def [RunSteps](/infra/bots/recipes/sync_and_compile.py#27)(api):**
525### *recipes* / [test](/infra/bots/recipes/test.py)
526
527[DEPS](/infra/bots/recipes/test.py#13): [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)
528
529PYTHON_VERSION_COMPATIBILITY: PY3
530
531&mdash; **def [RunSteps](/infra/bots/recipes/test.py#165)(api):**
532
533&mdash; **def [test\_steps](/infra/bots/recipes/test.py#31)(api):**
534
535Run the DM test.
536### *recipes* / [test\_canvaskit](/infra/bots/recipes/test_canvaskit.py)
537
538[DEPS](/infra/bots/recipes/test_canvaskit.py#9): [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)
539
540PYTHON_VERSION_COMPATIBILITY: PY3
541
542&mdash; **def [RunSteps](/infra/bots/recipes/test_canvaskit.py#29)(api):**
543### *recipes* / [test\_lottie\_web](/infra/bots/recipes/test_lottie_web.py)
544
545[DEPS](/infra/bots/recipes/test_lottie_web.py#9): [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)
546
547PYTHON_VERSION_COMPATIBILITY: PY3
548
549&mdash; **def [RunSteps](/infra/bots/recipes/test_lottie_web.py#29)(api):**
550### *recipes* / [test\_pathkit](/infra/bots/recipes/test_pathkit.py)
551
552[DEPS](/infra/bots/recipes/test_pathkit.py#9): [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)
553
554PYTHON_VERSION_COMPATIBILITY: PY3
555
556&mdash; **def [RunSteps](/infra/bots/recipes/test_pathkit.py#30)(api):**
557### *recipes* / [upload\_buildstats\_results](/infra/bots/recipes/upload_buildstats_results.py)
558
559[DEPS](/infra/bots/recipes/upload_buildstats_results.py#10): [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)
560
561PYTHON_VERSION_COMPATIBILITY: PY3
562
563&mdash; **def [RunSteps](/infra/bots/recipes/upload_buildstats_results.py#21)(api):**
564### *recipes* / [upload\_dm\_results](/infra/bots/recipes/upload_dm_results.py)
565
566[DEPS](/infra/bots/recipes/upload_dm_results.py#13): [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)
567
568PYTHON_VERSION_COMPATIBILITY: PY3
569
570&mdash; **def [RunSteps](/infra/bots/recipes/upload_dm_results.py#29)(api):**
571### *recipes* / [upload\_nano\_results](/infra/bots/recipes/upload_nano_results.py)
572
573[DEPS](/infra/bots/recipes/upload_nano_results.py#10): [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)
574
575PYTHON_VERSION_COMPATIBILITY: PY3
576
577&mdash; **def [RunSteps](/infra/bots/recipes/upload_nano_results.py#21)(api):**
578### *recipes* / [vars:examples/full](/infra/bots/recipe_modules/vars/examples/full.py)
579
580[DEPS](/infra/bots/recipe_modules/vars/examples/full.py#7): [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)
581
582PYTHON_VERSION_COMPATIBILITY: PY3
583
584&mdash; **def [RunSteps](/infra/bots/recipe_modules/vars/examples/full.py#16)(api):**
585
586[depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/f05fcf7051e12e5b561b8811e299096f332157f7/recipes/README.recipes.md#recipe_modules-bot_update
587[depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/f05fcf7051e12e5b561b8811e299096f332157f7/recipes/README.recipes.md#recipe_modules-gclient
588[depot_tools/recipe_modules/git]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/f05fcf7051e12e5b561b8811e299096f332157f7/recipes/README.recipes.md#recipe_modules-git
589[depot_tools/recipe_modules/gitiles]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/f05fcf7051e12e5b561b8811e299096f332157f7/recipes/README.recipes.md#recipe_modules-gitiles
590[depot_tools/recipe_modules/tryserver]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/f05fcf7051e12e5b561b8811e299096f332157f7/recipes/README.recipes.md#recipe_modules-tryserver
591[recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-context
592[recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-file
593[recipe_engine/recipe_modules/json]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-json
594[recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-path
595[recipe_engine/recipe_modules/platform]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-platform
596[recipe_engine/recipe_modules/properties]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-properties
597[recipe_engine/recipe_modules/python]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-python
598[recipe_engine/recipe_modules/raw_io]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-raw_io
599[recipe_engine/recipe_modules/step]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-step
600[recipe_engine/recipe_modules/time]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/README.recipes.md#recipe_modules-time
601[recipe_engine/wkt/RecipeApi]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/428eeaebf2e1de58ed1c7cae50daba3384d730cd/recipe_engine/recipe_api.py#886
602