• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..--

assets/23-Nov-2023-7,4233,670

buildstats/23-Nov-2023-450295

gen_tasks_logic/23-Nov-2023-4,6353,612

recipe_modules/23-Nov-2023-41,41139,907

recipes/23-Nov-2023-26,31125,626

task_drivers/23-Nov-2023-3,9883,250

tools/luci-go/23-Nov-2023-1710

MakefileD23-Nov-202368 64

OWNERSD23-Nov-2023106 65

README.mdD23-Nov-20233 KiB9764

README.recipes.mdD23-Nov-202343.8 KiB541341

build_task_drivers.shD23-Nov-20231.1 KiB3723

bundle_recipes.shD23-Nov-2023284 146

cfg.jsonD23-Nov-20231.1 KiB2827

check_deps.pyD23-Nov-20231.8 KiB6844

gen_tasks.goD23-Nov-2023359 197

git_utils.pyD23-Nov-20235.8 KiB161129

infra_tests.pyD23-Nov-20231.9 KiB9264

jobs.jsonD23-Nov-202339.7 KiB629628

recipes.pyD23-Nov-20238.4 KiB265173

run_recipe.pyD23-Nov-20231.2 KiB4129

tasks.jsonD23-Nov-20233.2 MiB

test_utils.pyD23-Nov-20232 KiB7450

upload_skps.pyD23-Nov-20232.6 KiB7549

utils.pyD23-Nov-20236.6 KiB204145

zip_utils.pyD23-Nov-20232.5 KiB7960

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