blob: 5cde6a63d9c36b8e625c970f917ce9b102fe6296 [file] [log] [blame] [view]
<!--- AUTOGENERATED BY `./recipes.py test train` -->
# Repo documentation for [infra](https://chromium.googlesource.com/infra/infra.git)
## Table of Contents
**[Recipe Modules](#Recipe-Modules)**
* [buildenv](#recipe_modules-buildenv) &mdash; A helper for bootstrapping Go and Node environments.
* [cloudbuildhelper](#recipe_modules-cloudbuildhelper) &mdash; API for calling 'cloudbuildhelper' tool.
* [cloudkms](#recipe_modules-cloudkms)
* [codesearch](#recipe_modules-codesearch)
* [docker](#recipe_modules-docker)
* [infra_checkout](#recipe_modules-infra_checkout)
* [infra_cipd](#recipe_modules-infra_cipd)
* [omahaproxy](#recipe_modules-omahaproxy)
* [powershell](#recipe_modules-powershell)
* [qemu](#recipe_modules-qemu)
* [recipe_autoroller](#recipe_modules-recipe_autoroller)
* [support_3pp](#recipe_modules-support_3pp) &mdash; Allows uniform cross-compiliation, version tracking and archival for third-party software packages (libs+tools) for distribution via CIPD.
* [windows_adk](#recipe_modules-windows_adk)
* [windows_scripts_executor](#recipe_modules-windows_scripts_executor)
* [windows_sdk](#recipe_modules-windows_sdk)
* [zip](#recipe_modules-zip)
**[Recipes](#Recipes)**
* [3pp](#recipes-3pp) &mdash; This recipe builds and packages third party software, such as Git.
* [build_from_tarball](#recipes-build_from_tarball)
* [build_wheels](#recipes-build_wheels)
* [buildenv:examples/simple](#recipes-buildenv_examples_simple)
* [chromium_bootstrap/test](#recipes-chromium_bootstrap_test) &mdash; This recipe verifies importing of chromium bootstrap protos.
* [cloudbuildhelper:examples/discover](#recipes-cloudbuildhelper_examples_discover)
* [cloudbuildhelper:examples/full](#recipes-cloudbuildhelper_examples_full)
* [cloudbuildhelper:examples/roll](#recipes-cloudbuildhelper_examples_roll)
* [cloudbuildhelper:examples/version_label](#recipes-cloudbuildhelper_examples_version_label)
* [cloudkms:examples/usage](#recipes-cloudkms_examples_usage)
* [codesearch:examples/full](#recipes-codesearch_examples_full)
* [codesearch:tests/checkout_generated_files_repo_and_sync](#recipes-codesearch_tests_checkout_generated_files_repo_and_sync)
* [codesearch:tests/clone_and_run_clang_tool](#recipes-codesearch_tests_clone_and_run_clang_tool)
* [codesearch:tests/configs](#recipes-codesearch_tests_configs)
* [codesearch:tests/create_and_upload_kythe_index_pack](#recipes-codesearch_tests_create_and_upload_kythe_index_pack)
* [cv_testing/tryjob](#recipes-cv_testing_tryjob) &mdash; Recipe to test LUCI CQ/CV itself.
* [depot_tools_builder](#recipes-depot_tools_builder) &mdash; Recipe to build windows depot_tools bootstrap zipfile.
* [docker:examples/full](#recipes-docker_examples_full)
* [docker_image_builder](#recipes-docker_image_builder)
* [fleet_systems/dhcp](#recipes-fleet_systems_dhcp) &mdash; Test chrome-golo repo DHCP configs using dhcpd binaries via docker.
* [gae_tarball_uploader](#recipes-gae_tarball_uploader)
* [gerrit_hello_world](#recipes-gerrit_hello_world) &mdash; Pushes a trivial CL to Gerrit to verify git authentication works on LUCI.
* [gerrit_plugins](#recipes-gerrit_plugins)
* [git_cache_updater](#recipes-git_cache_updater) &mdash; Updates the Git Cache zip files.
* [gsutil_hello_world](#recipes-gsutil_hello_world) &mdash; Pushes a trivial CL to Gerrit to verify git authentication works on LUCI.
* [images_builder](#recipes-images_builder)
* [images_pins_roller](#recipes-images_pins_roller)
* [infra_checkout:examples/ci](#recipes-infra_checkout_examples_ci)
* [infra_checkout:examples/try](#recipes-infra_checkout_examples_try)
* [infra_cipd:examples/usage](#recipes-infra_cipd_examples_usage)
* [infra_continuous](#recipes-infra_continuous)
* [infra_frontend_tester](#recipes-infra_frontend_tester)
* [infra_repo_trybot](#recipes-infra_repo_trybot)
* [luci_go](#recipes-luci_go)
* [luci_py](#recipes-luci_py)
* [powershell:examples/test](#recipes-powershell_examples_test)
* [qemu:examples/basic](#recipes-qemu_examples_basic)
* [qemu:examples/create_disk](#recipes-qemu_examples_create_disk)
* [qemu:examples/mount_disk_image](#recipes-qemu_examples_mount_disk_image)
* [qemu:examples/powerdown_vm](#recipes-qemu_examples_powerdown_vm)
* [qemu:examples/quit_vm](#recipes-qemu_examples_quit_vm)
* [qemu:examples/start_vm](#recipes-qemu_examples_start_vm)
* [qemu:examples/status_vm](#recipes-qemu_examples_status_vm)
* [recipe_autoroller](#recipes-recipe_autoroller) &mdash; Rolls recipes.
* [recipe_autoroller:examples/full](#recipes-recipe_autoroller_examples_full)
* [recipe_bundler](#recipes-recipe_bundler)
* [recipe_roll_tryjob](#recipes-recipe_roll_tryjob)
* [recipe_simulation](#recipes-recipe_simulation) &mdash; A continuous builder which runs recipe tests.
* [recipes_py_continuous](#recipes-recipes_py_continuous)
* [support_3pp:tests/full](#recipes-support_3pp_tests_full)
* [tricium_infra](#recipes-tricium_infra)
* [update_submodules_mirror](#recipes-update_submodules_mirror)
* [windows_adk:examples/ensure](#recipes-windows_adk_examples_ensure)
* [windows_image_builder/offline](#recipes-windows_image_builder_offline)
* [windows_image_builder/online_windows_customization](#recipes-windows_image_builder_online_windows_customization)
* [windows_image_builder/winpe_customization](#recipes-windows_image_builder_winpe_customization)
* [windows_scripts_executor:examples/add_windows_driver](#recipes-windows_scripts_executor_examples_add_windows_driver)
* [windows_scripts_executor:examples/add_windows_package](#recipes-windows_scripts_executor_examples_add_windows_package)
* [windows_scripts_executor:examples/cipd_test](#recipes-windows_scripts_executor_examples_cipd_test)
* [windows_scripts_executor:examples/customization_mode](#recipes-windows_scripts_executor_examples_customization_mode)
* [windows_scripts_executor:examples/edit_offline_registry_test](#recipes-windows_scripts_executor_examples_edit_offline_registry_test)
* [windows_scripts_executor:examples/execute_online_customization](#recipes-windows_scripts_executor_examples_execute_online_customization)
* [windows_scripts_executor:examples/gcs_test](#recipes-windows_scripts_executor_examples_gcs_test)
* [windows_scripts_executor:examples/get_executable_configs](#recipes-windows_scripts_executor_examples_get_executable_configs)
* [windows_scripts_executor:examples/git_test](#recipes-windows_scripts_executor_examples_git_test)
* [windows_scripts_executor:examples/online_windows_customization](#recipes-windows_scripts_executor_examples_online_windows_customization)
* [windows_scripts_executor:examples/powershell_expression](#recipes-windows_scripts_executor_examples_powershell_expression)
* [windows_scripts_executor:examples/process_customizations](#recipes-windows_scripts_executor_examples_process_customizations)
* [windows_scripts_executor:examples/shutdown_vm](#recipes-windows_scripts_executor_examples_shutdown_vm)
* [windows_scripts_executor:examples/test](#recipes-windows_scripts_executor_examples_test)
* [windows_scripts_executor:examples/trim_uploads](#recipes-windows_scripts_executor_examples_trim_uploads)
* [windows_scripts_executor:examples/windows_iso](#recipes-windows_scripts_executor_examples_windows_iso)
* [windows_sdk:examples/full](#recipes-windows_sdk_examples_full)
* [zip:examples/full](#recipes-zip_examples_full)
## Recipe Modules
### *recipe_modules* / [buildenv](/recipes/recipe_modules/buildenv)
[DEPS](/recipes/recipe_modules/buildenv/__init__.py#5): [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/golang][recipe_engine/recipe_modules/golang], [recipe\_engine/nodejs][recipe_engine/recipe_modules/nodejs], [recipe\_engine/path][recipe_engine/recipe_modules/path]
A helper for bootstrapping Go and Node environments.
#### **class [BuildEnvApi](/recipes/recipe_modules/buildenv/api.py#13)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for bootstrapping Go and Node environments.
&emsp; **@contextlib.contextmanager**<br>&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/buildenv/api.py#16)(self, root, go_version_file: Optional[str]=None, nodejs_version_file: Optional[str]=None):**
A context manager that activates the build environment.
Used to build code in a standalone git repositories that don't have Go
or Node.js available via some other mechanism (like via gclient DEPS).
It reads the Golang version from `<root>/<go_version_file>` and Node.js
version from `<root>/<nodejs_version_file>`, bootstraps the corresponding
versions in cache directories, adjusts PATH and other environment variables
and yields to the user code.
Let's assume the requested Go version is '1.16.10' and Node.js version
is '16.13.0', then this call will use following cache directories (notice
that '.' is replace with '_' since '.' is not allowed in cache names):
* `go1_16_10`: to install Go under.
* `gocache`: for Go cache directories.
* `nodejs16_13_0`: to install Node.js under.
* `npmcache`: for NPM cache directories.
For best performance the builder must map these directories as named
caches using e.g.
luci.builder(
...
caches = [
swarming.cache("go1_16_10"),
swarming.cache("gocache"),
swarming.cache("nodejs16_13_0"),
swarming.cache("npmcache"),
],
)
Args:
root (Path) - path to the checkout root.
go_version_file (str) - path within the checkout to a text file with Go
version to bootstrap or None to skip bootstrapping Go.
nodejs_version_file (str) - path within the checkout to a text file with
Node.js version to bootstrap or None to skip bootstrapping Node.js.
### *recipe_modules* / [cloudbuildhelper](/recipes/recipe_modules/cloudbuildhelper)
[DEPS](/recipes/recipe_modules/cloudbuildhelper/__init__.py#5): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/git\_cl][depot_tools/recipe_modules/git_cl], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/commit\_position][recipe_engine/recipe_modules/commit_position], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
API for calling 'cloudbuildhelper' tool.
See https://chromium.googlesource.com/infra/infra/+/main/build/images/.
#### **class [CloudBuildHelperApi](/recipes/recipe_modules/cloudbuildhelper/api.py#22)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for calling 'cloudbuildhelper' tool.
&mdash; **def [build](/recipes/recipe_modules/cloudbuildhelper/api.py#129)(self, manifest, canonical_tag=None, build_id=None, infra=None, restrictions=None, labels=None, tags=None, checkout_metadata=None, step_test_image=None, cost=None):**
Calls `cloudbuildhelper build <manifest>` interpreting the result.
Args:
* manifest (Path) - path to YAML file with definition of what to build.
* canonical_tag (str) - tag to push the image to if we built a new image.
* build_id (str) - identifier of the CI build to put into metadata.
* infra (str) - what section to pick from 'infra' field in the YAML.
* restrictions (Restrictions) - restrictions to apply to manifests.
* labels ({str: str}) - labels to attach to the docker image.
* tags ([str]) - tags to unconditionally push the image to.
* checkout_metadata (CheckoutMetadata) - to get revisions.
* step_test_image (Image) - image to produce in training mode.
* cost (ResourceCost) - an estimated resource cost of this call.
Returns:
Image instance or NotUploadedImage if the YAML doesn't specify a registry.
Raises:
StepFailure on failures.
&emsp; **@command.setter**<br>&mdash; **def [command](/recipes/recipe_modules/cloudbuildhelper/api.py#104)(self, val):**
Can be used to tell the module to use an existing binary.
&mdash; **def [discover\_manifests](/recipes/recipe_modules/cloudbuildhelper/api.py#487)(self, root, entries, test_data=None):**
Returns a list with paths to all manifests we need to build.
Each entry is either a directory to scan recursively, or a reference to
a concrete manifest (if ends with ".yaml").
Args:
* root (Path) - gclient solution root.
* entries ([str]) - paths relative to the solution root to scan.
* test_data ([str]) - paths to put into each `dirs` in training mode.
Returns:
[Path].
&mdash; **def [do\_roll](/recipes/recipe_modules/cloudbuildhelper/api.py#515)(self, repo_url, root, callback, ref='main'):**
Checks out a repo, calls the callback to modify it, uploads the result.
Args:
* repo_url (str) - repo to checkout.
* root (Path) - where to check it out too (can be a cache).
* callback (func(Path)) - will be called as `callback(root)` with cwd also
set to `root`. It can modify files there and either return None to
skip the roll or RollCL to attempt the roll. If no files are modified,
the roll will be skipped regardless of the return value.
* ref (str) - a ref to update (e.g. "main").
Returns:
* (None, None) if didn't create a CL (because nothing has changed).
* (Issue number, Issue URL) if created a CL.
&mdash; **def [get\_version\_label](/recipes/recipe_modules/cloudbuildhelper/api.py#585)(self, path, revision, ref=None, commit_position=None, template=None):**
Computes a version string identifying a commit.
To calculate a commit position it either uses `Cr-Commit-Position` footer,
if available, or falls back to `git number <rev>`.
Uses the given `template` string to format the label. It is a Python format
string, with following placeholders available:
{rev}: a string with the short git revision hash.
{ref}: a string with the last component of the commit ref (e.g. 'main').
{cp}: an integer with the commit position number.
{date}: "YYYY.MM.DD" UTC date when the build started.
{build}: an integer build number or 0 if not available.
Defaults to `{cp}-{rev}`.
This label is used as a version name for artifacts produced based on this
checked out commit.
Args:
* path (Path) - path to the git checkout root.
* revision (str) - checked out revision.
* ref (str) - checked out git ref if known.
* commit_position (str) - `Cr-Commit-Position` footer value if available.
* template (str) - a Python format string to use to format the version.
Returns:
A version string.
&mdash; **def [report\_version](/recipes/recipe_modules/cloudbuildhelper/api.py#109)(self):**
Reports the version of cloudbuildhelper tool via the step text.
Returns:
None.
&mdash; **def [update\_pins](/recipes/recipe_modules/cloudbuildhelper/api.py#463)(self, path):**
Calls `cloudbuildhelper pins-update <path>`.
Updates the file at `path` in place if some docker tags mentioned there have
moved since the last pins update.
Args:
* path (Path) - path to a `pins.yaml` file to update.
Returns:
List of strings with updated "<image>:<tag>" pairs, if any.
&mdash; **def [upload](/recipes/recipe_modules/cloudbuildhelper/api.py#364)(self, manifest, canonical_tag, build_id=None, infra=None, restrictions=None, checkout_metadata=None, step_test_tarball=None, cost=None):**
Calls `cloudbuildhelper upload <manifest>` interpreting the result.
Args:
* manifest (Path) - path to YAML file with definition of what to build.
* canonical_tag (str) - tag to apply to a tarball if we built a new one.
* build_id (str) - identifier of the CI build to put into metadata.
* infra (str) - what section to pick from 'infra' field in the YAML.
* restrictions (Restrictions) - restrictions to apply to manifests.
* checkout_metadata (CheckoutMetadata) - to get revisions.
* step_test_tarball (Tarball) - tarball to produce in training mode.
* cost (ResourceCost) - an estimated resource cost of this call.
Returns:
Tarball instance.
Raises:
StepFailure on failures.
### *recipe_modules* / [cloudkms](/recipes/recipe_modules/cloudkms)
[DEPS](/recipes/recipe_modules/cloudkms/__init__.py#7): [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [CloudKMSApi](/recipes/recipe_modules/cloudkms/api.py#8)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for interacting with CloudKMS using the LUCI cloudkms tool.
&emsp; **@property**<br>&mdash; **def [cloudkms\_path](/recipes/recipe_modules/cloudkms/api.py#15)(self):**
Returns the path to LUCI cloudkms binary.
When the property is accessed the first time, cloudkms will be installed
using cipd.
&mdash; **def [decrypt](/recipes/recipe_modules/cloudkms/api.py#30)(self, kms_crypto_key, input_file, output_file):**
Decrypt a ciphertext file with a CloudKMS key.
Args:
* kms_crypto_key (str) - The name of the encryption key, e.g.
projects/chops-kms/locations/global/keyRings/[KEYRING]/cryptoKeys/[KEY]
* input_file (Path) - The path to the input (ciphertext) file.
* output_file (Path) - The path to the output (plaintext) file. It is
recommended that this is inside api.path.cleanup_dir to ensure the
plaintext file will be cleaned up by recipe.
&mdash; **def [sign](/recipes/recipe_modules/cloudkms/api.py#48)(self, kms_crypto_key, input_file, output_file, service_account_creds_file=None):**
Processes a plaintext and uploads the digest for signing by Cloud KMS.
Args:
* kms_crypto_key (str) - The name of the cryptographic key, e.g.
projects/[PROJECT]/locations/[LOC]/keyRings/[KEYRING]/cryptoKeys/[KEY]
* input_file (Path) - Path to file with data to operate on. Data for sign
and verify cannot be larger than 64KiB.
* output_file (Path) - Path to write output signature to a json file.
* service_account_creds_file (str) - Path to JSON file with service
account credentials to use.
&mdash; **def [verify](/recipes/recipe_modules/cloudkms/api.py#80)(self, kms_crypto_key, input_file, signature_file, output_file='-', service_account_creds_file=None):**
Verifies a signature that was previously created with a key stored in
CloudKMS.
Args:
* kms_crypto_key (str)- The name of the cryptographic public key,
e.g.
projects/[PROJECT]/locations/[LOC]/keyRings/[KEYRING]/cryptoKeys/[KEY]
* input_file (Path) - Path to file with data to operate on. Data for sign
and verify cannot be larger than 64KiB.
* signature_file (Path) - Path to read signature from.
* output_file (Path) - Path to write operation results
(successful verification or signature mismatch)to (use '-' for stdout).
* service_account_creds_file (str) - Path to JSON file with service
account credentials to use.
### *recipe_modules* / [codesearch](/recipes/recipe_modules/codesearch)
[DEPS](/recipes/recipe_modules/codesearch/__init__.py#5): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/commit\_position][recipe_engine/recipe_modules/commit_position], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [CodesearchApi](/recipes/recipe_modules/codesearch/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [add\_kythe\_metadata](/recipes/recipe_modules/codesearch/api.py#71)(self):**
Adds inline Kythe metadata to Mojom generated files.
This metadata is used to connect things in the generated file to the thing
in the Mojom file which generated it. This is made possible by annotations
added to the generated file by the Mojo compiler.
&mdash; **def [checkout\_generated\_files\_repo\_and\_sync](/recipes/recipe_modules/codesearch/api.py#353)(self, copy, revision, kzip_path=None, ignore=None):**
Check out the generated files repo and sync the generated files
into this checkout.
Args:
copy: A dict that describes how generated files should be synced. Keys are
paths to local directories and values are where they are copied to in
the generated files repo.
{
'/path/to/foo': 'foo',
'/path/to/bar': 'baz/bar',
}
The above copy config would result in a generated files repo like:
repo/
repo/foo/
repo/baz/bar/
kzip_path: Path to kzip that will be used to prune uploaded files.
ignore: List of paths that shouldn't be synced.
revision: A commit hash to be used in the commit message.
&mdash; **def [cleanup\_old\_generated](/recipes/recipe_modules/codesearch/api.py#26)(self, age_days: int=7, checkout_dir: Optional[config_types.Path]=None):**
Clean up generated files older than the specified number of days.
Args:
age_days: Minimum age in days for files to delete (integer).
checkout_dir: The directory where code is checked out. If not specified,
use checkout_dir initialized in path module by default
&mdash; **def [clone\_clang\_tools](/recipes/recipe_modules/codesearch/api.py#86)(self, clone_dir):**
Clone chromium/src clang tools.
&mdash; **def [create\_and\_upload\_kythe\_index\_pack](/recipes/recipe_modules/codesearch/api.py#188)(self, commit_hash: str, commit_timestamp: int, commit_position: Optional[str]=None, clang_target_arch: Optional[str]=None, checkout_dir: Optional[config_types.Path]=None):**
Create the kythe index pack and upload it to google storage.
Args:
commit_hash: Hash of the commit at which we're creating the index pack,
if None use got_revision.
commit_timestamp: Timestamp of the commit at which we're creating the
index pack, in integer seconds since the UNIX epoch.
clang_target_arch: Target architecture to cross-compile for.
checkout_dir: The directory where code is checked out. If not specified,
use checkout_dir initialized in path module by default.
Returns:
Path to the generated index pack.
&mdash; **def [get\_config\_defaults](/recipes/recipe_modules/codesearch/api.py#21)(self):**
&mdash; **def [run\_clang\_tool](/recipes/recipe_modules/codesearch/api.py#95)(self, clang_dir: Optional[config_types.Path]=None, run_dirs: Optional[Iterable[config_types.Path]]=None, target_architecture: Optional[str]=None):**
Download and run the clang tool.
Args:
clang_dir: Path to clone clang into.
run_dirs: Dirs in which to run the clang tool.
target_architecture: If given, the architecture to transpile for.
### *recipe_modules* / [docker](/recipes/recipe_modules/docker)
[DEPS](/recipes/recipe_modules/docker/__init__.py#7): [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/service\_account][recipe_engine/recipe_modules/service_account], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [DockerApi](/recipes/recipe_modules/docker/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
Provides steps to connect and run Docker images.
&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/docker/api.py#161)(self, \*args, \*\*kwargs):**
Executes specified docker command.
Please make sure to use api.docker.login method before if specified command
requires authentication.
Args:
args: arguments passed to the 'docker' command including subcommand name,
e.g. api.docker('push', 'my_image:latest').
kwargs: arguments passed down to api.step module.
&mdash; **def [ensure\_installed](/recipes/recipe_modules/docker/api.py#22)(self, \*\*kwargs):**
Checks that the docker binary is in the PATH.
Raises StepFailure if binary is not found.
&mdash; **def [get\_version](/recipes/recipe_modules/docker/api.py#34)(self):**
Returns Docker version installed or None if failed to detect.
&mdash; **def [login](/recipes/recipe_modules/docker/api.py#51)(self, server='gcr.io', project='chromium-container-registry', service_account=None, step_name=None, \*\*kwargs):**
Connect to a Docker registry.
This step must be executed before any other step in this module that
requires authentication.
Args:
server: GCP container registry to pull images from. Defaults to 'gcr.io'.
project: Name of the Cloud project where Docker images are hosted.
service_account: service_account.api.ServiceAccount used for
authenticating with the container registry. Defaults to the task's
associated service account.
step_name: Override step name. Default is 'docker login'.
&mdash; **def [pull](/recipes/recipe_modules/docker/api.py#93)(self, image, step_name=None):**
Pull a docker image from a remote repository.
Args:
image: Name of the image to pull.
step_name: Override step name. Default is 'docker pull'.
&mdash; **def [python](/recipes/recipe_modules/docker/api.py#19)(self, name, script, args, \*\*kwargs):**
&mdash; **def [run](/recipes/recipe_modules/docker/api.py#109)(self, image, step_name=None, cmd_args=None, dir_mapping=None, env=None, inherit_luci_context=False, \*\*kwargs):**
Run a command in a Docker image as the current user:group.
Args:
image: Name of the image to run.
step_name: Override step name. Default is 'docker run'.
cmd_args: Used to specify command to run in an image as a list of
arguments. If not specified, then the default command embedded into
the image is executed.
dir_mapping: List of tuples (host_dir, docker_dir) mapping host
directories to directories in a Docker container. Directories are
mapped as read-write.
env: dict of env variables.
inherit_luci_context: Inherit current LUCI Context (including auth).
CAUTION: removes network isolation between the container and the
docker host. Read more https://docs.docker.com/network/host/.
### *recipe_modules* / [infra\_checkout](/recipes/recipe_modules/infra_checkout)
[DEPS](/recipes/recipe_modules/infra_checkout/__init__.py#7): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/presubmit][depot_tools/recipe_modules/presubmit], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/tricium][recipe_engine/recipe_modules/tricium]
#### **class [InfraCheckoutApi](/recipes/recipe_modules/infra_checkout/api.py#13)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
Stateless API for using public infra gclient checkout.
&mdash; **def [apply\_golangci\_lint](/recipes/recipe_modules/infra_checkout/api.py#256)(self, co, go_module_root=None):**
Apply golangci-lint to existing diffs and emit lint warnings via tricium.
`go_module_root` is an absolute path to the root of a Go module to lint. It
should be under `patch_root_path`. If None, `patch_root_path` itself will be
used.
&mdash; **def [checkout](/recipes/recipe_modules/infra_checkout/api.py#16)(self, gclient_config_name, patch_root=None, path=None, internal=False, generate_py2_env=False, go_version_variant=None, \*\*kwargs):**
Fetches infra gclient checkout into a given path OR named_cache.
Arguments:
* gclient_config_name (string) - name of gclient config.
* patch_root (path or string) - path **inside** infra checkout to git repo
in which to apply the patch. For example, 'infra/luci' for luci-py repo.
If None (default), no patches will be applied.
* path (path or string) - path to where to create/update infra checkout.
If None (default) - path is cache with customizable name (see below).
* internal (bool) - by default, False, meaning infra gclient checkout
layout is assumed, else infra_internal.
This has an effect on named_cache default and inside which repo's
go corner the ./go/env.py command is run.
* generate_py2_env uses the "infra/3pp/tools/cpython" package to create
the infra/ENV python 2.7 virtual environment. This is only needed in
specific situations such as running tests for python 2.7 GAE apps.
* go_version_variant can be set go "legacy" or "bleeding_edge" to force
the builder to use a non-default Go version. What exact Go versions
correspond to "legacy" and "bleeding_edge" and default is defined in
bootstrap.py in infra.git.
* kwargs - passed as is to bot_update.ensure_checkout.
Returns:
a Checkout object with commands for common actions on infra checkout.
&mdash; **def [get\_footer\_infra\_deps\_overrides](/recipes/recipe_modules/infra_checkout/api.py#229)(self, gerrit_change, step_test_data=None):**
Returns revision overrides for infra repos parsed from the gerrit footer.
Checks the commit message for lines like: Try-<deps_name>: <revision>.
e.g. 'Try-infra: 123abc456def'
Allowed values for <deps_name> are:
'infra' for infra/infra,
'infra_internal' for infra/infra_internal,
'.' for infra/infra_superproject
These deps names are based what's found in infra/infra_superproject/DEPS
### *recipe_modules* / [infra\_cipd](/recipes/recipe_modules/infra_cipd)
[DEPS](/recipes/recipe_modules/infra_cipd/__init__.py#7): [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [InfraCIPDApi](/recipes/recipe_modules/infra_cipd/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for building packages defined in infra's public and intenral repos.
Essentially a shim around scripts in
https://chromium.googlesource.com/infra/infra.git/+/main/build/
and its internal counterpart.
&mdash; **def [build](/recipes/recipe_modules/infra_cipd/api.py#63)(self, sign_id=None):**
Builds packages.
&emsp; **@contextlib.contextmanager**<br>&mdash; **def [context](/recipes/recipe_modules/infra_cipd/api.py#23)(self, path_to_repo, goos=None, goarch=None):**
Sets context building CIPD packages.
Arguments:
path_to_repo (path): path infra or infra_internal repo root dir.
Expects to find `build/build.py` inside provided dir.
goos, goarch (str): allows for setting GOOS and GOARCH
for cross-compiling Go code.
Doesn't support nesting.
&mdash; **def [tags](/recipes/recipe_modules/infra_cipd/api.py#114)(self, git_repo_url, revision):**
Returns tags to be attached to uploaded CIPD packages.
&mdash; **def [test](/recipes/recipe_modules/infra_cipd/api.py#79)(self):**
Tests previously built packages integrity.
&mdash; **def [upload](/recipes/recipe_modules/infra_cipd/api.py#86)(self, tags, step_test_data=None):**
Uploads previously built packages.
### *recipe_modules* / [omahaproxy](/recipes/recipe_modules/omahaproxy)
[DEPS](/recipes/recipe_modules/omahaproxy/__init__.py#3): [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/url][recipe_engine/recipe_modules/url]
#### **class [OmahaproxyApi](/recipes/recipe_modules/omahaproxy/api.py#11)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
APIs for interacting with omahaproxy.
&mdash; **def [history](/recipes/recipe_modules/omahaproxy/api.py#20)(self, min_major_version=None, exclude_platforms=None):**
&emsp; **@staticmethod**<br>&mdash; **def [split\_version](/recipes/recipe_modules/omahaproxy/api.py#14)(text):**
### *recipe_modules* / [powershell](/recipes/recipe_modules/powershell)
[DEPS](/recipes/recipe_modules/powershell/__init__.py#5): [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [PowershellAPI](/recipes/recipe_modules/powershell/api.py#9)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API to execute powershell scripts
&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/powershell/api.py#12)(self, name, command, logs=None, args=None, ret_codes=None):**
Execute a command through powershell.
Args:
* name (str) - name of the step being run
* command (str|path) - powershell command or windows script/exe to run
* logs ([]str) - List of logs to read on completion. Specifying dir reads
all logs in dir
* args ([]str) - List of args supplied to the command
* ret_codes ([]int) - List of return codes to be treated as success
Returns:
Dict containing 'results' as a key
Raises:
StepFailure if the failure is detected. See resources/psinvoke.py
### *recipe_modules* / [qemu](/recipes/recipe_modules/qemu)
[DEPS](/recipes/recipe_modules/qemu/__init__.py#5): [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [QEMUAPI](/recipes/recipe_modules/qemu/api.py#25)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API to manage qemu VMs
&mdash; **def [cleanup\_disks](/recipes/recipe_modules/qemu/api.py#65)(self):**
cleanup_disks deletes all the disks in the disks dir. This is meant to
be used for cleanup after using the VM
&mdash; **def [create\_disk](/recipes/recipe_modules/qemu/api.py#72)(self, disk_name, fs_format='fat', min_size=0, include=None):**
create_disk creates a virtual disk with the given name, format and size.
Optionally it is possible to specify a list of paths to copy to the disk.
If the size is deemed to be too small to copy the files it might be
increased to fit all the files.
Args:
* disk_name: name of the disk image file
* fs_format: one of [exfat, ext3, fat, msdos, vfat, ext2, ext4, ntfs]
* min_size: minimum size of the disk in Megabytes(1048576 bytes)
(bigger size used if required)
* include: sequence of files and directories to copy to image
&mdash; **def [create\_empty\_disk](/recipes/recipe_modules/qemu/api.py#173)(self, disk_name, fs_format, size):**
create_empty_disk creates an empty disk image and formats it
Args:
* disk_name: name of the disk image file
* fs_format: one of [ext3, fat, ntfs]
* size: size of the disk image in bytes
&emsp; **@property**<br>&mdash; **def [disks](/recipes/recipe_modules/qemu/api.py#37)(self):**
&mdash; **def [init](/recipes/recipe_modules/qemu/api.py#41)(self, version):**
Initialize the module, ensure that qemu exists on the system
Note:
- QEMU is installed in cache/qemu
- Virtual disks are stored in cleanup/qemu/disks
Args:
* version: the cipd version tag for qemu
&mdash; **def [mount\_disk\_image](/recipes/recipe_modules/qemu/api.py#223)(self, disk, partitions=[1]):**
mount_disk_image mounts the given image and returns the mount location
and loop file used for mounting
Args:
* disk: name of the disk image file
* partitions: list of partitions to mount, If None attempt to mount the
whole image
Returns: loop file used for the disk and list of mount locations
&emsp; **@property**<br>&mdash; **def [path](/recipes/recipe_modules/qemu/api.py#33)(self):**
&mdash; **def [powerdown\_vm](/recipes/recipe_modules/qemu/api.py#369)(self, name):**
powerdown_vm sends a shutdown signal to the given VM. Similar to power
button on a physical device
Args:
* name: name of the vm to shutdown
Returns: True if powerdown signal was sent to VM. False otherwise
&mdash; **def [quit\_vm](/recipes/recipe_modules/qemu/api.py#410)(self, name):**
quit_vm sends a quit signal to the qemu process. Use this if your VM
doesn't respond to powerdown signal.
Args:
* name: name of the vm to quit
Returns: True if quit signal was sent to VM. False otherwise
&mdash; **def [start\_vm](/recipes/recipe_modules/qemu/api.py#297)(self, arch, qemu_vm, kvm=False):**
start_vm starts a qemu vm
QEMU is started with qemu_monitor running a qmp service. It also connects
the serial port of the machine to a tcp port.
Args:
* arch: The arch that the VM should be based on
* qemu_vm: QEMU_VM proto object containing all the config for starting
the vm
* kvm: If true then VM is run on hardware. It's emulated otherwise
&mdash; **def [unmount\_disk\_image](/recipes/recipe_modules/qemu/api.py#274)(self, loop_file, partitions=[1]):**
unmount_disk_image unmounts the disk mounted using the given loop_file
Args:
* loop_file: Loop device used to mount the image
&mdash; **def [vm\_status](/recipes/recipe_modules/qemu/api.py#451)(self, name):**
vm_status returns a dict describing the status of the vm. The return
value is the QMP response to `query-status`
Args:
* name: name of the vm
Returns: QMP json response for status query
### *recipe_modules* / [recipe\_autoroller](/recipes/recipe_modules/recipe_autoroller)
[DEPS](/recipes/recipe_modules/recipe_autoroller/__init__.py#7): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/git\_cl][depot_tools/recipe_modules/git_cl], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/futures][recipe_engine/recipe_modules/futures], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/led][recipe_engine/recipe_modules/led], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/proto][recipe_engine/recipe_modules/proto], [recipe\_engine/random][recipe_engine/recipe_modules/random], [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]
#### **class [RecipeAutorollerApi](/recipes/recipe_modules/recipe_autoroller/api.py#151)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [roll\_projects](/recipes/recipe_modules/recipe_autoroller/api.py#152)(self, projects):**
Attempts to roll each project from the provided list.
If rolling any of the projects leads to failures, other
projects are not affected.
Args:
projects: list of tuples of
project_id (string): id as found in recipes.cfg.
project_url (string): Git repository URL of the project.
### *recipe_modules* / [support\_3pp](/recipes/recipe_modules/support_3pp)
[DEPS](/recipes/recipe_modules/support_3pp/__init__.py#7): [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [depot\_tools/windows\_sdk][depot_tools/recipe_modules/windows_sdk], [recipe\_engine/archive][recipe_engine/recipe_modules/archive], [recipe\_engine/bcid\_reporter][recipe_engine/recipe_modules/bcid_reporter], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/defer][recipe_engine/recipe_modules/defer], [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/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/url][recipe_engine/recipe_modules/url]
Allows uniform cross-compiliation, version tracking and archival for
third-party software packages (libs+tools) for distribution via CIPD.
The purpose of the Third Party Packages (3pp) recipe/module is to generate CIPD
packages of statically-compiled software for distribution in our continuous
integration fleets, as well as software distributed to our develepers (e.g.
via depot_tools).
Target os and architecture uses the CIPD "${os}-${arch}" (a.k.a. "${platform}")
nomenclature, which is currently defined in terms of Go's GOOS and GOARCH
runtime variables (with the unfortunate exception that CIPD uses 'mac' instead
of 'darwin'). This is somewhat arbitrary, but has worked well so far for us.
#### Package Definitions
The 3pp module loads package definitions from a folder containing subfolders.
Each subfolder defines a single software package to fetch, build and upload.
For example, you might have a folder in your repo like this:
my_repo.git/
3pp/ # "root folder"
.vpython3 # common vpython file for all package scripts
zlib/ # zlib "package folder"
3pp.pb # REQUIRED: the Spec.proto definition for zlib
install.sh # a script to build zlib from source
extra_resource_file
other_package/
3pp.pb # REQUIRED
fetch.py # a script to fetch `other_package` in a custom way
install.sh
install-win.sh # windows-specific build script
...
This defines two packages (`zlib`, and `other_package`). The 3pp.pb files have
references to the fetch/build scripts, and describe what dependencies the
packages have (if any).
*** promo
NOTE: Only one layer of package folders is supported currently.
***
Packages are named by the folder that contains their definition file (3pp.pb)
and build scripts. It's preferable to have package named after software that it
contains. However, sometimes you want multiple major versions of the software to
exist side-by-side (e.g. pcre and pcre2, python and python3, etc.). In this
case, have two separate package definition folders.
Each package folder contains a package spec (3pp.pb), as well as scripts,
patches and/or utility tools to build the software from source.
The spec is a Text Proto document specified by the [spec.proto] schema.
The spec is broken up into two main sections, "create" and "upload". The
create section allows you to specify how the package software gets created, and
allows specifying differences in how it's fetched/built/tested on a per-target
basis, and the upload section has some details on how the final result gets
uploaded to CIPD.
[spec.proto]: /recipes/recipe_modules/support_3pp/spec.proto
#### Creation Stages
The 3pp.pb spec begins with a series of `create` messages, each with details on
on how to fetch+build+test the package. Each create message contains
a "platform_re" field which works as a regex on the ${platform} value. All
matching patterns apply in order, and non-matching patterns are skipped. Each
create message is applied with a dict.update for each member message (i.e.
['source'].update, ['build'].update, etc.) to build a singular create message
for the current target platform. For list values (e.g. 'tool', 'dep' in the
Build message), you can clear them by providing a new empty value
(e.g. `tool: ""`)
Once all the create messages are merged (see schema for all keys that can be
present), the actual creation takes place.
Note that "source" is REQUIRED in the final merged instruction set. All other
messages are optional and have defaults as documented in [spec.proto].
The creation process is broken up into 4 different stages:
* Source
* Build
* Package
* Verify
##### Envvars
All scripts described below are invoked with the following environment variables
set:
* $_3PP_PACKAGE_NAME - the name of the package currently building
* $_3PP_PATCH_VERSION - the `patch_version` set for the version we're building
(if any patch version was set).
* $_3PP_PLATFORM - the platform we're targeting
* $_3PP_TOOL_PLATFORM - the platform that we're building on (will be different
than _3PP_PLATFORM if we're cross-compiling)
* $_3PP_VERSION - the version we're building, e.g. 1.2.3
* $GOOS - The golang OS name we're targeting
* $GOARCH - The golang architecture we're targeting
* $MACOSX_DEPLOYMENT_TARGET - On OS X, set to 10.10, for your
semi-up-to-date OS X building needs. This needs to be consistently
set for all packages or it will cause linker warnings/errors when
linking in static libs that were targeting a newer version (e.g.
if it was left unset). Binaries built with this set to 10.10 will not
run on 10.9 or older systems.
Additionally, on cross-compile environments, the $CROSS_TRIPLE environment
variable is set to a GCC cross compile target triplet of cpu-vendor-os.
##### Source
The source is used to fetch the raw sources for assembling the package. In some
cases the sources may actually be binary artifacts (e.g. prebuilt windows
installers).
The source is unpacked to a checkout directory, possibly in some specified
subdirectory. Sources can either produce the actual source files, or they can
produce a single archive file (e.g. zip or tarball), which can be unpacked with
the 'unpack_archive' option. In addition, patches can be applied to the source
with the 'patch_dir' option (the patches should be in `git format-patch` format,
and will be applied with `git apply`).
* `git` - This checks out a semver tag in the repo.
* `cipd` - This fetches data from a CIPD package.
* `url` - This is used for packages that do not provide a stable distribution
like git for their source code. An original download url will be passed in
this method to download the source artifact from third party distribution.
* `script` - Used for "weird" packages which are distributed via e.g.
an HTML download page or an API. The script must be able to return the
'latest' version of its source, as well as to actually fetch a specified
version. Python fetch scripts will be executed with `vpython3`, and so
may have a .vpython3 file (or similar) in the usual manner to pull in
dependencies like `requests`.
Additionally the Source message contains a `patch_version` field to allow symver
disambiguation of the built packages when they contain patches or other
alterations which need to be versioned. This string will be joined with a '.' to
the source version being built when uploading the result to CIPD.
##### Build
The build message allows you to specify `deps`, and `tools`, as well as a script
`install` which contains your logic to transform the source into the result
package.
Deps are libraries built for the target `${platform}` and are typically used for
linking your package.
Tools are binaries built for the host; they're things like `automake` or `sed`
that are used during the configure/make phase of your build, but aren't linked
into the built product. These tools will be available on $PATH (both '$tools'
and '$tools/bin' are added to $PATH, because many packages are set up with their
binaries at the base of the package, and some are set up with them in a /bin
folder)
Installation occurs by invoking the script indicated by the 'install' field
(with the appropriate interpreter, depending on the file extension) like:
<interpreter> "$install[*]" "$PREFIX" "$DEPS_PREFIX"
Where:
* The current working directory is the base of the source checkout w/o subdir.
* `$install[*]` are all of the tokens in the 'install' field.
* `$PREFIX` is the directory which the script should install everything to;
this directory will be archived into CIPD verbatim.
* `$DEPS_PREFIX` is the path to a prefix directory containing the union of all
of your packages' transitive deps. For example, all of the headers of your
deps are located at `$DEPS_PREFIX/include`.
* All `tools` are in $PATH
If the 'install' script is omitted, it is assumed to be 'install.sh'.
If the ENTIRE build message is omitted, no build takes place. Instead the
result of the 'source' stage will be packaged.
During the execution of the build phase, the package itself and its dependent
packages (e.g. "dep" and "tool" in PB file) will be copied into the source
checkout in the .3pp directory, and the script will be invoked as
`/path/to/checkout/.3pp/<cipd_pkg_name>/$script_name`. If the package has
shared resources (like `.vpython3` files or helper scripts) which are outside of
the package directory, you would need to create a symbolic link for it. See
chromium.googlesource.com/infra/infra/+/main/3pp/cpython_common/ssl_suffix.py as
an example.
##### Package
Once the build stage is complete, all files in the $PREFIX folder passed to the
install script will be zipped into a CIPD package.
It is strongly recommended that if your package is a library or tool with many
files that it be packaged in the standard POSIXey PREFIX format (e.g. bin, lib,
include, etc.). If your package is a collection of one or more standalone
binaries, it's permissible to just have the binaries in the root of the output
$PREFIX.
If the build stage is skipped (i.e. the build message is omitted) then the
output of the source stage will be packaged instead (this is mostly useful when
using a 'script' source).
##### Verify
After the package is built it can be optionally tested. The recipe will run your
test script in an empty directory with the path to the
packaged-but-not-yet-uploaded cipd package file and it can do whatever testing
it needs to it (exiting non-zero if something is wrong). You can use the `cipd
pkg-deploy` command to deploy it (or whatever cipd commands you like, though
I wouldn't recommend uploading it to CIPD, as the 3pp recipe will do that after
the test exits 0).
Additionally, vpython3 for the tool platform will be guaranteed to be in $PATH.
##### Upload
Once the test comes back positive, the CIPD package will be uploaded to the CIPD
server and registered with the prefix indicated in the upload message. The full
CIPD package name is constructed as:
<prefix>/<pkg_name>/${platform}
So for example with the prefix `infra`, the `bzip2` package on linux-amd64 would
be uploaded to `infra/bzip2/linux-amd64` and tagged with the version that was
built (e.g. `version:1.2.3.patch_version1`).
You can also mark the upload as a `universal` package, which will:
* Omit the `${platform}` suffix from the upload name
* Only build the package on the `linux-amd64' platform. This was chosen
to ensure that "universal" packages build consistently.
#### Versions
Every package will try to build the latest identifiable semver of its source, or
will attempt to build the semver requested as an input property to the
`3pp` recipe. This semver is also used to tag the uploaded artifacts in CIPD.
Because some of the packages here are used as dependencies for others (e.g.
curl and zlib are dependencies of git, and zlib is a dependency of curl), each
package used as a dependency for others should specify its version explicitly
(currently this is only possible to do with the 'cipd' source type). So e.g.
zlib and curl specify their source versions, but git and python float at 'head',
always building the latest tagged version fetched from git.
When building a floating package (e.g. python, git) you may explicitly
state the symver that you wish to build as part of the recipe invocation.
The symver of a package (either specified in the package definition, in the
recipe properties or discovered while fetching its source code (e.g. latest git
tag)) is also used to tag the package when it's uploaded to CIPD (plus the
patch_version in the source message).
#### Cross Compilation
Third party packages are currently compiled on linux using the
'infra.tools.dockerbuild' tool from the infra.git repo. This uses a slightly
modified version of the [dockcross] Docker cross-compile environment. Windows
and OS X targets are built using the 'osx_sdk' and 'windows_sdk' recipe modules,
each of which provides a hermetic (native) build toolchain for those platforms.
For linux, we can support all the architectures implied by dockerbuild,
including:
* linux-arm64
* linux-armv6l
* linux-mips32
* linux-mips64
* linux-amd64
[dockcross]: https://github.com/dockcross/dockcross
#### Dry runs / experiments
If the recipe is run with `force_build` it will always build all packages
indicated. Dependencies will be built if they do not exist in CIPD. None
of the built packages will be uploaded to CIPD.
The recipe must always be run with a package_prefix (by assigning to the
.package_prefix property on the Support3ppApi). If the recipe is run in
experimental mode, 'experimental/' will be prepended to this. Additionally, you
may specify `experimental: true` in the Create message for a package, which will
have the same effect when running the recipe in production (to allow adding new
packages or package/platform combintations experimentally).
#### Examples
As an example of the package definition layout in action, take a look at the
[3pp](/3pp) folder in this infra.git repo.
#### Caches
This module uses the following named caches:
* `3pp_cipd` - Caches all downloaded and uploaded CIPD packages. Currently
tag lookups are performed every time against the CIPD server, but this will
hold the actual package files.
* `osx_sdk` - Cache for `depot_tools/osx_sdk`. Only on Mac.
* `windows_sdk` - Cache for `depot_tools/windows_sdk`. Only on Windows.
#### **class [Support3ppApi](/recipes/recipe_modules/support_3pp/api.py#387)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
&mdash; **def [ensure\_uploaded](/recipes/recipe_modules/support_3pp/api.py#798)(self, packages=(), platform='', force_build=False, tryserver_affected_files=(), use_pkgbuild=False):**
Executes entire {fetch,build,package,verify,upload} pipeline for all the
packages listed, targeting the given platform.
Args:
* packages (seq[str]) - A sequence of packages to ensure are
uploaded. Packages must be listed as either 'pkgname' or
'pkgname@version'. If empty, builds all loaded packages.
* platform (str) - If specified, the CIPD ${platform} to build for.
If unspecified, this will be the appropriate CIPD ${platform} for the
current host machine.
* force_build (bool) - If True, all applicable packages and their
dependencies will be built, regardless of the presence in CIPD.
The source and built packages will not be uploaded to CIPD.
* tryserver_affected_files (seq[Path]) - If given, run in tryserver mode
where the specified files (which must correspond to paths that were
passed to load_packages_from_path) have been modified in the CL. All
affected packages, and any that depend on them (recursively) are built.
If any files are modified which cannot be mapped to a specific package,
all packages are rebuilt. Overrides 'packages', and forces
force_build=True (packages are never uploaded in this mode).
* use_pkgbuild (bool) - If True, use the experimental pkgbuild to build
3pp packages and skip the rest of the 3pp recipe. This will not upload
packages in any case.
Returns (list[(cipd_pkg, cipd_version)], set[str]) of built CIPD packages
and their tagged versions, as well as a list of unsupported packages.
&mdash; **def [initialize](/recipes/recipe_modules/support_3pp/api.py#421)(self):**
&mdash; **def [load\_packages\_from\_path](/recipes/recipe_modules/support_3pp/api.py#619)(self, base_path, glob_pattern='\*\*/3pp.pb', check_dup=True):**
Loads all package definitions from the given base_path and glob pattern
inside the git repository.
To include package definitions across multiple git repository or git
submodules, load_packages_from_path need to be called for each of the
repository.
This will parse and intern all the 3pp.pb package definition files so that
packages can be identified by their cipd package name.
For example, if you pass:
path/
pkgname/
3pp.pb
install.sh
And the file "path/pkgname/3pp.pb" has the following content:
upload { pkg_prefix: "my_pkg_prefix" }
Its cipd package name will be "my_pkg_prefix/pkgname".
Args:
* base_path (Path) - A path of a directory where the glob_pattern will be
applied to.
* glob_pattern (str) - A glob pattern to look for package definition files
"3pp.pb" whose behavior is defined by 3pp.proto. Default to "**/3pp.pb".
* check_dup (bool): When set, it will raise DuplicatePackage error if
a package spec is already loaded. Default to True.
Returns a set(str) containing the cipd package names of the packages which
were loaded.
Raises a DuplicatePackage exception if this function encounters a cipd
package name which is already registered. This could occur if you call
load_packages_from_path multiple times, and one of the later calls tries to
load a package which was registered under one of the earlier calls.
&mdash; **def [package\_prefix](/recipes/recipe_modules/support_3pp/api.py#426)(self, experimental=False):**
Returns the CIPD package name prefix (str), if any is set.
This will prepend 'experimental/' to the currently set prefix if:
* The recipe is running in experimental mode; OR
* You pass experimental=True
&mdash; **def [set\_experimental](/recipes/recipe_modules/support_3pp/api.py#454)(self, experimental):**
Set the experimental mode (bool).
&mdash; **def [set\_package\_prefix](/recipes/recipe_modules/support_3pp/api.py#439)(self, prefix):**
Set the CIPD package name prefix (str).
All CIPDSpecs for built packages (not sources) will have this string
prepended to them.
&mdash; **def [set\_source\_cache\_prefix](/recipes/recipe_modules/support_3pp/api.py#448)(self, prefix):**
Set the CIPD namespace (str) to store the source of the packages.
### *recipe_modules* / [windows\_adk](/recipes/recipe_modules/windows_adk)
[DEPS](/recipes/recipe_modules/windows_adk/__init__.py#5): [powershell](#recipe_modules-powershell), [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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]
#### **class [WindowsADKApi](/recipes/recipe_modules/windows_adk/api.py#15)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for using Windows ADK distributed via CIPD.
&mdash; **def [cleanup](/recipes/recipe_modules/windows_adk/api.py#115)(self):**
Remove the ADK and WinPE.
&mdash; **def [cleanup\_win\_adk](/recipes/recipe_modules/windows_adk/api.py#83)(self):**
Cleanup the Windows ADK.
&mdash; **def [cleanup\_winpe](/recipes/recipe_modules/windows_adk/api.py#99)(self):**
Cleanup WinPE.
&mdash; **def [ensure](/recipes/recipe_modules/windows_adk/api.py#26)(self, install=True):**
Ensure the presence of the Windows ADK.
&mdash; **def [ensure\_win\_adk](/recipes/recipe_modules/windows_adk/api.py#42)(self, refs):**
Downloads & Installs the Windows ADK.
&mdash; **def [ensure\_win\_adk\_winpe](/recipes/recipe_modules/windows_adk/api.py#63)(self, refs):**
Ensures that the WinPE add-on is available.
### *recipe_modules* / [windows\_scripts\_executor](/recipes/recipe_modules/windows_scripts_executor)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/__init__.py#6): [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/gitiles][depot_tools/recipe_modules/gitiles], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [powershell](#recipe_modules-powershell), [qemu](#recipe_modules-qemu), [recipe\_engine/archive][recipe_engine/recipe_modules/archive], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [WindowsPSExecutorAPI](/recipes/recipe_modules/windows_scripts_executor/api.py#28)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for using Windows PowerShell scripts.
&mdash; **def [download\_all\_packages](/recipes/recipe_modules/windows_scripts_executor/api.py#308)(self, custs):**
download_all_packages downloads all the packages referenced by given
custs.
Args:
* custs: List of Customizations object from customizations.py
&mdash; **def [execute\_customizations](/recipes/recipe_modules/windows_scripts_executor/api.py#319)(self, custs):**
Executes the windows image builder user config.
Args:
* custs: List of Customizations object from customizations.py
&mdash; **def [filter\_executable\_customizations](/recipes/recipe_modules/windows_scripts_executor/api.py#295)(self, customizations):**
filter_executable_customizations generates a list of customizations
that need to be executed.
Args:
* customizations: List of Customizations object from customizations.py
&mdash; **def [gen\_canonical\_configs](/recipes/recipe_modules/windows_scripts_executor/api.py#186)(self, customizations):**
gen_canonical_configs strips all the names in the config and returns
individual configs containing one customization per image.
Example:
Given an Image
Image{
arch: x86,
name: "windows10_x86_GCE",
customizations: [
Customization{
OfflineWinPECustomization{
name: "winpe_networking"
image_dest: GCSSrc{
bucket: "chrome-win-wim"
source: "rel/win10_networking.wim"
}
...
}
},
Customization{
OfflineWinPECustomization{
name: "winpe_diskpart"
image_src: Src{
gcs_src: GCSSrc{
bucket: "chrome-win-wim"
source: "rel/win10_networking.wim"
}
}
...
}
}
]
}
Writes two configs: windows10_x86_GCE-winpe_networking.cfg with
Image{
arch: x86,
name: "",
customizations: [
Customization{
OfflineWinPECustomization{
name: ""
image_dest: GCSSrc{
bucket: "chrome-win-wim"
source: "rel/win10_networking.wim"
}
...
}
}
]
}
and windows10_x86_GCE-winpe_diskpart.cfg with
Image{
arch: x86,
name: "",
customizations: [
Customization{
OfflineWinPECustomization{
name: ""
image_src: Src{
gcs_src: GCSSrc{
bucket: "chrome-win-wim"
source: "rel/win10_networking.wim"
}
}
...
}
}
]
}
to disk, calculates the hash for each config and sets the key for each
of them. The strings representing name of the image, customization,...
etc,. are set to empty before calculating the hash to maintain the
uniqueness of the hash.
Args:
* customizations: List of Customizations object from customizations.py
&mdash; **def [gen\_executable\_configs](/recipes/recipe_modules/windows_scripts_executor/api.py#354)(self, custs):**
gen_executable_configs generates wib.Image configs that can be executed.
Given a list of custs that can be run on a builder. Generates wib.Image
proto configs making sure that they can be executed independently. Some
customizations are dependent on others for inputs and can only be executed
if the dependent input is generated in the same wib.Image proto or is
already available.
Args:
* custs: list of customization objects from customizations.py that can be
executed on the same builder
Returns a list of tuples containing config and set of customization hash
that can be executed at the time
&mdash; **def [get\_executable\_configs](/recipes/recipe_modules/windows_scripts_executor/api.py#329)(self, custs):**
get_executable_configs returns a list of images that can be executed at
this time.
image is generated after determining what customizations can be executed as
part of the image. A list of keys representing the customizations to be
executed are also returned with the image.
Args:
* custs: List of customizations to be processed.
Returns a dict mapping builder name to the image-key_list tuple
&mdash; **def [init](/recipes/recipe_modules/windows_scripts_executor/api.py#47)(self, try_job=False):**
init initializes all the dirs and sub modules required.
&mdash; **def [init\_customizations](/recipes/recipe_modules/windows_scripts_executor/api.py#56)(self, config):**
init_customizations initializes the given config and returns
list of customizations
Args:
* config: wib.Image proto config
&mdash; **def [pin\_customizations](/recipes/recipe_modules/windows_scripts_executor/api.py#155)(self, customizations, ctx):**
pin_customizations pins all the sources in the customizations
Args:
* customizations: List of Customizations object from customizations.py
* ctx: dict containing the context for the customization
&mdash; **def [process\_customizations](/recipes/recipe_modules/windows_scripts_executor/api.py#111)(self, custs, ctx, inputs=()):**
process_customizations pins all the volatile srcs and generates
canonnical configs.
Args:
* custs: List of customizations from customization.py
* ctx: dict containing the context for the customization
* inputs: List of inputs that are required
Returns list of customizations in order that they were processed
&mdash; **def [trim\_uploads](/recipes/recipe_modules/windows_scripts_executor/api.py#166)(self, customizations):**
trim_uploads removes the user specified uploads from a config.
&mdash; **def [update\_context](/recipes/recipe_modules/windows_scripts_executor/api.py#172)(self, custs, ctx):**
update_context returns an updated dict with all the contexts
updated
Args:
* custs: List of customizations from customization.py
* ctx: Current context
Returns updated context dict
### *recipe_modules* / [windows\_sdk](/recipes/recipe_modules/windows_sdk)
[DEPS](/recipes/recipe_modules/windows_sdk/__init__.py#7): [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/step][recipe_engine/recipe_modules/step]
#### **class [WindowsSDKApi](/recipes/recipe_modules/windows_sdk/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
API for using Windows SDK distributed via CIPD.
&emsp; **@contextmanager**<br>&mdash; **def [\_\_call\_\_](/recipes/recipe_modules/windows_sdk/api.py#18)(self, path=None, version=None, enabled=True):**
Setups the SDK environment when enabled.
Args:
path (path): Path to a directory where to install the SDK
(default is '[start_dir]/cipd/windows_sdk')
version (str): CIPD instance ID, tag or ref of the SDK
(default is set via $infra/windows_sdk.version property)
enabled (bool): Whether the SDK should be used or not.
Raises:
StepFailure or InfraFailure.
### *recipe_modules* / [zip](/recipes/recipe_modules/zip)
[DEPS](/recipes/recipe_modules/zip/__init__.py#7): [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
#### **class [ZipApi](/recipes/recipe_modules/zip/api.py#8)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
Provides steps to zip and unzip files.
&mdash; **def [directory](/recipes/recipe_modules/zip/api.py#50)(self, step_name, directory, output, comment=None):**
Step to compress a single directory.
Args:
step_name: display name of the step.
directory: path to a directory to compress, it would become the root of
an archive, i.e. |directory|/file.txt would be named 'file.txt' in
the archive.
output: path to a zip file to create.
comment: the archive comment to set on the created ZIP file.
&mdash; **def [get\_comment](/recipes/recipe_modules/zip/api.py#93)(self, step_name, zip_file):**
Returns the archive comment from |zip_file|.
Args:
step_name: display name of a step.
zip_file: path to a zip file to read, should exist.
&mdash; **def [make\_package](/recipes/recipe_modules/zip/api.py#11)(self, root, output):**
Returns ZipPackage object that can be used to compress a set of files.
Usage:
pkg = api.zip.make_package(root, output)
pkg.add_file(root / 'file')
pkg.add_directory(root / 'directory')
yield pkg.zip('zipping step')
Args:
root: a directory that would become root of a package, all files added to
an archive will have archive paths relative to this directory.
output: path to a zip file to create.
Returns:
ZipPackage object.
&mdash; **def [unzip](/recipes/recipe_modules/zip/api.py#67)(self, step_name, zip_file, output, quiet=False):**
Step to uncompress |zip_file| into |output| directory.
Zip package will be unpacked to |output| so that root of an archive is in
|output|, i.e. archive.zip/file.txt will become |output|/file.txt.
Step will FAIL if |output| already exists.
Args:
step_name: display name of a step.
zip_file: path to a zip file to uncompress, should exist.
output: path to a directory to unpack to, it should NOT exist.
quiet (bool): If True, print terse output instead of the name
of each unzipped file.
&mdash; **def [update\_package](/recipes/recipe_modules/zip/api.py#30)(self, root, output):**
Returns ZipPackage object that can be used to update an existing package.
Usage:
pkg = api.zip.update_package(root, output)
pkg.add_file(root / 'file')
pkg.add_directory(root / 'directory')
yield pkg.zip('updating zip step')
Args:
root: the root directory for adding new files/dirs to the package; all
files/dirs added to an archive will have archive paths relative to
this directory.
output: path to a zip file to update.
Returns:
ZipPackage object.
## Recipes
### *recipes* / [3pp](/recipes/recipes/3pp.py)
[DEPS](/recipes/recipes/3pp.py#18): [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [support\_3pp](#recipe_modules-support_3pp), [recipe\_engine/bcid\_reporter][recipe_engine/recipe_modules/bcid_reporter], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
This recipe builds and packages third party software, such as Git.
&mdash; **def [RunSteps](/recipes/recipes/3pp.py#98)(api, package_locations, to_build, platform, force_build, package_prefix, source_cache_prefix, use_pkgbuild):**
### *recipes* / [build\_from\_tarball](/recipes/recipes/build_from_tarball.py)
[DEPS](/recipes/recipes/build_from_tarball.py#9): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/build_from_tarball.py#21)(api):**
### *recipes* / [build\_wheels](/recipes/recipes/build_wheels.py)
[DEPS](/recipes/recipes/build_wheels.py#17): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [depot\_tools/windows\_sdk][depot_tools/recipe_modules/windows_sdk], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&emsp; **@contextmanager**<br>&mdash; **def [PlatformSdk](/recipes/recipes/build_wheels.py#176)(api, platforms):**
&mdash; **def [RunSteps](/recipes/recipes/build_wheels.py#60)(api, platforms, dry_run, rebuild):**
### *recipes* / [buildenv:examples/simple](/recipes/recipe_modules/buildenv/examples/simple.py)
[DEPS](/recipes/recipe_modules/buildenv/examples/simple.py#7): [buildenv](#recipe_modules-buildenv), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/buildenv/examples/simple.py#14)(api):**
### *recipes* / [chromium\_bootstrap/test](/recipes/recipes/chromium_bootstrap/test.py)
This recipe verifies importing of chromium bootstrap protos.
The protos are exported via a symlink in
//recipe/recipe_proto/infra/chromium.
&mdash; **def [RunSteps](/recipes/recipes/chromium_bootstrap/test.py#16)(api):**
### *recipes* / [cloudbuildhelper:examples/discover](/recipes/recipe_modules/cloudbuildhelper/examples/discover.py)
[DEPS](/recipes/recipe_modules/cloudbuildhelper/examples/discover.py#7): [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [recipe\_engine/path][recipe_engine/recipe_modules/path]
&mdash; **def [RunSteps](/recipes/recipe_modules/cloudbuildhelper/examples/discover.py#13)(api):**
### *recipes* / [cloudbuildhelper:examples/full](/recipes/recipe_modules/cloudbuildhelper/examples/full.py)
[DEPS](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#7): [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#15)(api):**
&mdash; **def [build](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#60)(api):**
&mdash; **def [repo\_checkout\_metadata](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#40)(api):**
&mdash; **def [restrictions](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#29)(api):**
&mdash; **def [upload](/recipes/recipe_modules/cloudbuildhelper/examples/full.py#142)(api):**
### *recipes* / [cloudbuildhelper:examples/roll](/recipes/recipe_modules/cloudbuildhelper/examples/roll.py)
[DEPS](/recipes/recipe_modules/cloudbuildhelper/examples/roll.py#9): [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/cloudbuildhelper/examples/roll.py#21)(api, commit):**
### *recipes* / [cloudbuildhelper:examples/version\_label](/recipes/recipe_modules/cloudbuildhelper/examples/version_label.py)
[DEPS](/recipes/recipe_modules/cloudbuildhelper/examples/version_label.py#7): [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/cloudbuildhelper/examples/version_label.py#23)(api, commit_position):**
### *recipes* / [cloudkms:examples/usage](/recipes/recipe_modules/cloudkms/examples/usage.py)
[DEPS](/recipes/recipe_modules/cloudkms/examples/usage.py#7): [cloudkms](#recipe_modules-cloudkms), [recipe\_engine/path][recipe_engine/recipe_modules/path]
&mdash; **def [RunSteps](/recipes/recipe_modules/cloudkms/examples/usage.py#13)(api):**
### *recipes* / [codesearch:examples/full](/recipes/recipe_modules/codesearch/examples/full.py)
[DEPS](/recipes/recipe_modules/codesearch/examples/full.py#7): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [codesearch](#recipe_modules-codesearch), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/codesearch/examples/full.py#47)(api):**
### *recipes* / [codesearch:tests/checkout\_generated\_files\_repo\_and\_sync](/recipes/recipe_modules/codesearch/tests/checkout_generated_files_repo_and_sync.py)
[DEPS](/recipes/recipe_modules/codesearch/tests/checkout_generated_files_repo_and_sync.py#9): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [codesearch](#recipe_modules-codesearch), [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/codesearch/tests/checkout_generated_files_repo_and_sync.py#17)(api):**
### *recipes* / [codesearch:tests/clone\_and\_run\_clang\_tool](/recipes/recipe_modules/codesearch/tests/clone_and_run_clang_tool.py)
[DEPS](/recipes/recipe_modules/codesearch/tests/clone_and_run_clang_tool.py#11): [codesearch](#recipe_modules-codesearch), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/codesearch/tests/clone_and_run_clang_tool.py#20)(api, properties):**
### *recipes* / [codesearch:tests/configs](/recipes/recipe_modules/codesearch/tests/configs.py)
[DEPS](/recipes/recipe_modules/codesearch/tests/configs.py#7): [codesearch](#recipe_modules-codesearch), [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/codesearch/tests/configs.py#13)(api):**
### *recipes* / [codesearch:tests/create\_and\_upload\_kythe\_index\_pack](/recipes/recipe_modules/codesearch/tests/create_and_upload_kythe_index_pack.py)
[DEPS](/recipes/recipe_modules/codesearch/tests/create_and_upload_kythe_index_pack.py#10): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [codesearch](#recipe_modules-codesearch), [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/codesearch/tests/create_and_upload_kythe_index_pack.py#18)(api):**
### *recipes* / [cv\_testing/tryjob](/recipes/recipes/cv_testing/tryjob.py)
[DEPS](/recipes/recipes/cv_testing/tryjob.py#11): [recipe\_engine/cv][recipe_engine/recipe_modules/cv], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
Recipe to test LUCI CQ/CV itself.
&mdash; **def [RunSteps](/recipes/recipes/cv_testing/tryjob.py#20)(api, properties):**
### *recipes* / [depot\_tools\_builder](/recipes/recipes/depot_tools_builder.py)
[DEPS](/recipes/recipes/depot_tools_builder.py#9): [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [zip](#recipe_modules-zip), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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 to build windows depot_tools bootstrap zipfile.
&mdash; **def [RunSteps](/recipes/recipes/depot_tools_builder.py#27)(api):**
### *recipes* / [docker:examples/full](/recipes/recipe_modules/docker/examples/full.py)
[DEPS](/recipes/recipe_modules/docker/examples/full.py#10): [docker](#recipe_modules-docker), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/docker/examples/full.py#18)(api):**
### *recipes* / [docker\_image\_builder](/recipes/recipes/docker_image_builder.py)
[DEPS](/recipes/recipes/docker_image_builder.py#10): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [docker](#recipe_modules-docker), [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/service\_account][recipe_engine/recipe_modules/service_account], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
&mdash; **def [RunSteps](/recipes/recipes/docker_image_builder.py#36)(api, arch_type):**
### *recipes* / [fleet\_systems/dhcp](/recipes/recipes/fleet_systems/dhcp.py)
[DEPS](/recipes/recipes/fleet_systems/dhcp.py#10): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [docker](#recipe_modules-docker), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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]
Test chrome-golo repo DHCP configs using dhcpd binaries via docker.
&mdash; **def [RunSteps](/recipes/recipes/fleet_systems/dhcp.py#153)(api):**
### *recipes* / [gae\_tarball\_uploader](/recipes/recipes/gae_tarball_uploader.py)
[DEPS](/recipes/recipes/gae_tarball_uploader.py#16): [depot\_tools/git][depot_tools/recipe_modules/git], [buildenv](#recipe_modules-buildenv), [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/futures][recipe_engine/recipe_modules/futures], [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]
&mdash; **def [RunSteps](/recipes/recipes/gae_tarball_uploader.py#45)(api, properties):**
### *recipes* / [gerrit\_hello\_world](/recipes/recipes/gerrit_hello_world.py)
[DEPS](/recipes/recipes/gerrit_hello_world.py#11): [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
Pushes a trivial CL to Gerrit to verify git authentication works on LUCI.
&mdash; **def [RunSteps](/recipes/recipes/gerrit_hello_world.py#26)(api):**
### *recipes* / [gerrit\_plugins](/recipes/recipes/gerrit_plugins.py)
[DEPS](/recipes/recipes/gerrit_plugins.py#5): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [zip](#recipe_modules-zip), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/gerrit_plugins.py#58)(api):**
### *recipes* / [git\_cache\_updater](/recipes/recipes/git_cache_updater.py)
[DEPS](/recipes/recipes/git_cache_updater.py#18): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/git][depot_tools/recipe_modules/git], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/futures][recipe_engine/recipe_modules/futures], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/url][recipe_engine/recipe_modules/url]
Updates the Git Cache zip files.
&mdash; **def [RunSteps](/recipes/recipes/git_cache_updater.py#164)(api, inputs):**
### *recipes* / [gsutil\_hello\_world](/recipes/recipes/gsutil_hello_world.py)
[DEPS](/recipes/recipes/gsutil_hello_world.py#9): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [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/step][recipe_engine/recipe_modules/step], [recipe\_engine/time][recipe_engine/recipe_modules/time]
Pushes a trivial CL to Gerrit to verify git authentication works on LUCI.
&mdash; **def [RunSteps](/recipes/recipes/gsutil_hello_world.py#20)(api):**
### *recipes* / [images\_builder](/recipes/recipes/images_builder.py)
[DEPS](/recipes/recipes/images_builder.py#12): [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [depot\_tools/git][depot_tools/recipe_modules/git], [buildenv](#recipe_modules-buildenv), [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/futures][recipe_engine/recipe_modules/futures], [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]
&mdash; **def [RunSteps](/recipes/recipes/images_builder.py#44)(api, properties):**
### *recipes* / [images\_pins\_roller](/recipes/recipes/images_pins_roller.py)
[DEPS](/recipes/recipes/images_pins_roller.py#9): [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/git\_cl][depot_tools/recipe_modules/git_cl], [cloudbuildhelper](#recipe_modules-cloudbuildhelper), [infra\_checkout](#recipe_modules-infra_checkout), [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]
&mdash; **def [RunSteps](/recipes/recipes/images_pins_roller.py#26)(api, properties):**
### *recipes* / [infra\_checkout:examples/ci](/recipes/recipe_modules/infra_checkout/examples/ci.py)
[DEPS](/recipes/recipe_modules/infra_checkout/examples/ci.py#7): [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/infra_checkout/examples/ci.py#18)(api):**
### *recipes* / [infra\_checkout:examples/try](/recipes/recipe_modules/infra_checkout/examples/try.py)
[DEPS](/recipes/recipe_modules/infra_checkout/examples/try.py#13): [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/infra_checkout/examples/try.py#22)(api):**
### *recipes* / [infra\_cipd:examples/usage](/recipes/recipe_modules/infra_cipd/examples/usage.py)
[DEPS](/recipes/recipe_modules/infra_cipd/examples/usage.py#11): [infra\_cipd](#recipe_modules-infra_cipd), [recipe\_engine/assertions][recipe_engine/recipe_modules/assertions], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/infra_cipd/examples/usage.py#24)(api):**
### *recipes* / [infra\_continuous](/recipes/recipes/infra_continuous.py)
[DEPS](/recipes/recipes/infra_continuous.py#10): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [infra\_checkout](#recipe_modules-infra_checkout), [infra\_cipd](#recipe_modules-infra_cipd), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/defer][recipe_engine/recipe_modules/defer], [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/resultdb][recipe_engine/recipe_modules/resultdb], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/infra_continuous.py#185)(api):**
&mdash; **def [build\_main](/recipes/recipes/infra_continuous.py#229)(api, checkout, buildername, project_name, repo_url, rev):**
&mdash; **def [run\_python\_tests](/recipes/recipes/infra_continuous.py#296)(api, checkout, project_name):**
&mdash; **def [should\_run\_python\_tests](/recipes/recipes/infra_continuous.py#177)(api, builder_name):**
### *recipes* / [infra\_frontend\_tester](/recipes/recipes/infra_frontend_tester.py)
[DEPS](/recipes/recipes/infra_frontend_tester.py#9): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/file][recipe_engine/recipe_modules/file], [recipe\_engine/nodejs][recipe_engine/recipe_modules/nodejs], [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]
&mdash; **def [RunFrontendTests](/recipes/recipes/infra_frontend_tester.py#107)(api, cwd, app_name):**
&mdash; **def [RunInfraFrontendTests](/recipes/recipes/infra_frontend_tester.py#80)(api, root_path):**
This function runs the UI tests in `infra` project.
&mdash; **def [RunInfraInternalFrontendTests](/recipes/recipes/infra_frontend_tester.py#62)(api, root_path):**
This function runs UI tests in `infra_internal` project.
&mdash; **def [RunLuciGoTests](/recipes/recipes/infra_frontend_tester.py#96)(api, root_path):**
This function runs UI tests in the `luci-go` project.
&mdash; **def [RunSteps](/recipes/recipes/infra_frontend_tester.py#24)(api):**
### *recipes* / [infra\_repo\_trybot](/recipes/recipes/infra_repo_trybot.py)
[DEPS](/recipes/recipes/infra_repo_trybot.py#11): [depot\_tools/depot\_tools][depot_tools/recipe_modules/depot_tools], [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/defer][recipe_engine/recipe_modules/defer], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/resultdb][recipe_engine/recipe_modules/resultdb], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/infra_repo_trybot.py#50)(api, go_version_variant, run_lint, skip_python_tests):**
&mdash; **def [should\_run\_python\_tests](/recipes/recipes/infra_repo_trybot.py#46)(api):**
### *recipes* / [luci\_go](/recipes/recipes/luci_go.py)
[DEPS](/recipes/recipes/luci_go.py#11): [depot\_tools/osx\_sdk][depot_tools/recipe_modules/osx_sdk], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/resultdb][recipe_engine/recipe_modules/resultdb], [recipe\_engine/step][recipe_engine/recipe_modules/step], [recipe\_engine/tricium][recipe_engine/recipe_modules/tricium]
&mdash; **def [RunSteps](/recipes/recipes/luci_go.py#49)(api, GOARCH, go_version_variant, run_integration_tests, run_lint):**
### *recipes* / [luci\_py](/recipes/recipes/luci_py.py)
[DEPS](/recipes/recipes/luci_py.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], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/luci_py.py#27)(api):**
### *recipes* / [powershell:examples/test](/recipes/recipe_modules/powershell/examples/test.py)
[DEPS](/recipes/recipe_modules/powershell/examples/test.py#7): [powershell](#recipe_modules-powershell), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/powershell/examples/test.py#16)(api):**
### *recipes* / [qemu:examples/basic](/recipes/recipe_modules/qemu/examples/basic.py)
[DEPS](/recipes/recipe_modules/qemu/examples/basic.py#7): [qemu](#recipe_modules-qemu), [recipe\_engine/path][recipe_engine/recipe_modules/path]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/basic.py#12)(api):**
### *recipes* / [qemu:examples/create\_disk](/recipes/recipe_modules/qemu/examples/create_disk.py)
[DEPS](/recipes/recipe_modules/qemu/examples/create_disk.py#10): [qemu](#recipe_modules-qemu), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/create_disk.py#15)(api):**
### *recipes* / [qemu:examples/mount\_disk\_image](/recipes/recipe_modules/qemu/examples/mount_disk_image.py)
[DEPS](/recipes/recipe_modules/qemu/examples/mount_disk_image.py#8): [qemu](#recipe_modules-qemu), [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/mount_disk_image.py#19)(api, inputs):**
### *recipes* / [qemu:examples/powerdown\_vm](/recipes/recipe_modules/qemu/examples/powerdown_vm.py)
[DEPS](/recipes/recipe_modules/qemu/examples/powerdown_vm.py#8): [qemu](#recipe_modules-qemu), [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/powerdown_vm.py#15)(api):**
### *recipes* / [qemu:examples/quit\_vm](/recipes/recipe_modules/qemu/examples/quit_vm.py)
[DEPS](/recipes/recipe_modules/qemu/examples/quit_vm.py#8): [qemu](#recipe_modules-qemu), [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/quit_vm.py#15)(api):**
### *recipes* / [qemu:examples/start\_vm](/recipes/recipe_modules/qemu/examples/start_vm.py)
[DEPS](/recipes/recipe_modules/qemu/examples/start_vm.py#12): [qemu](#recipe_modules-qemu), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/start_vm.py#22)(api, qemu_vm):**
### *recipes* / [qemu:examples/status\_vm](/recipes/recipe_modules/qemu/examples/status_vm.py)
[DEPS](/recipes/recipe_modules/qemu/examples/status_vm.py#9): [qemu](#recipe_modules-qemu), [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipe_modules/qemu/examples/status_vm.py#16)(api):**
### *recipes* / [recipe\_autoroller](/recipes/recipes/recipe_autoroller.py)
[DEPS](/recipes/recipes/recipe_autoroller.py#9): [recipe\_autoroller](#recipe_modules-recipe_autoroller), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/proto][recipe_engine/recipe_modules/proto], [recipe\_engine/time][recipe_engine/recipe_modules/time]
Rolls recipes.cfg dependencies for public projects.
&mdash; **def [RunSteps](/recipes/recipes/recipe_autoroller.py#26)(api, projects):**
### *recipes* / [recipe\_autoroller:examples/full](/recipes/recipe_modules/recipe_autoroller/examples/full.py)
[DEPS](/recipes/recipe_modules/recipe_autoroller/examples/full.py#9): [recipe\_autoroller](#recipe_modules-recipe_autoroller), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/json][recipe_engine/recipe_modules/json], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/proto][recipe_engine/recipe_modules/proto], [recipe\_engine/time][recipe_engine/recipe_modules/time]
&mdash; **def [RunSteps](/recipes/recipe_modules/recipe_autoroller/examples/full.py#30)(api, projects):**
### *recipes* / [recipe\_bundler](/recipes/recipes/recipe_bundler.py)
[DEPS](/recipes/recipes/recipe_bundler.py#10): [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/recipe_bundler.py#49)(api, recipe_bundler_pkg, recipe_bundler_vers, repo_specs, repo_specs_optional, package_name_prefix, package_name_internal_prefix):**
### *recipes* / [recipe\_roll\_tryjob](/recipes/recipes/recipe_roll_tryjob.py)
[DEPS](/recipes/recipes/recipe_roll_tryjob.py#15): [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/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/recipe_roll_tryjob.py#413)(api, upstream_id, upstream_url, downstream_id, downstream_url):**
### *recipes* / [recipe\_simulation](/recipes/recipes/recipe_simulation.py)
[DEPS](/recipes/recipes/recipe_simulation.py#13): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
A continuous builder which runs recipe tests.
&mdash; **def [RunSteps](/recipes/recipes/recipe_simulation.py#40)(api, git_repo):**
### *recipes* / [recipes\_py\_continuous](/recipes/recipes/recipes_py_continuous.py)
[DEPS](/recipes/recipes/recipes_py_continuous.py#9): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [recipe\_engine/path][recipe_engine/recipe_modules/path], [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipes/recipes_py_continuous.py#19)(api):**
### *recipes* / [support\_3pp:tests/full](/recipes/recipe_modules/support_3pp/tests/full.py)
[DEPS](/recipes/recipe_modules/support_3pp/tests/full.py#16): [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [support\_3pp](#recipe_modules-support_3pp), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/cipd][recipe_engine/recipe_modules/cipd], [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/support_3pp/tests/full.py#47)(api, GOOS, GOARCH, experimental, load_dupe, package_prefix, source_cache_prefix, to_build, tryserver_affected_files, use_pkgbuild):**
### *recipes* / [tricium\_infra](/recipes/recipes/tricium_infra.py)
[DEPS](/recipes/recipes/tricium_infra.py#11): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gerrit][depot_tools/recipe_modules/gerrit], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [infra\_checkout](#recipe_modules-infra_checkout), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/step][recipe_engine/recipe_modules/step], [recipe\_engine/tricium][recipe_engine/recipe_modules/tricium]
&mdash; **def [RunSteps](/recipes/recipes/tricium_infra.py#29)(api, inputs):**
This recipe runs legacy analyzers for the infra repo.
### *recipes* / [update\_submodules\_mirror](/recipes/recipes/update_submodules_mirror.py)
[DEPS](/recipes/recipes/update_submodules_mirror.py#12): [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/git][depot_tools/recipe_modules/git], [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [GetSubmodules](/recipes/recipes/update_submodules_mirror.py#274)(api, deps, source_checkout_name, overlays):**
&mdash; **def [RefToRemoteRef](/recipes/recipes/update_submodules_mirror.py#268)(ref):**
&mdash; **def [RunSteps](/recipes/recipes/update_submodules_mirror.py#84)(api, source_repo, target_repo, extra_submodules, cache_name, overlays, internal, with_tags, ref_patterns, refs_to_skip, push_to_refs_cs):**
### *recipes* / [windows\_adk:examples/ensure](/recipes/recipe_modules/windows_adk/examples/ensure.py)
[DEPS](/recipes/recipe_modules/windows_adk/examples/ensure.py#7): [windows\_adk](#recipe_modules-windows_adk), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_adk/examples/ensure.py#16)(api):**
### *recipes* / [windows\_image\_builder/offline](/recipes/recipes/windows_image_builder/offline.py)
[DEPS](/recipes/recipes/windows_image_builder/offline.py#34): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [windows\_adk](#recipe_modules-windows_adk), [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/proto][recipe_engine/recipe_modules/proto], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipes/windows_image_builder/offline.py#204)(api, inputs):**
This recipe runs image builder for a given user config.
&mdash; **def [mock\_lsdir](/recipes/recipes/windows_image_builder/offline.py#186)(path):**
&mdash; **def [mock\_tests](/recipes/recipes/windows_image_builder/offline.py#180)(config):**
&mdash; **def [url\_title](/recipes/recipes/windows_image_builder/offline.py#195)(build):**
url_title is a helper function to display the customization
name over the build link in schedule process.
Returns string formatted with builder name and customization
### *recipes* / [windows\_image\_builder/online\_windows\_customization](/recipes/recipes/windows_image_builder/online_windows_customization.py)
[DEPS](/recipes/recipes/windows_image_builder/online_windows_customization.py#20): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [windows\_adk](#recipe_modules-windows_adk), [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipes/windows_image_builder/online_windows_customization.py#36)(api, image):**
This recipe executes offline_winpe_customization.
### *recipes* / [windows\_image\_builder/winpe\_customization](/recipes/recipes/windows_image_builder/winpe_customization.py)
[DEPS](/recipes/recipes/windows_image_builder/winpe_customization.py#16): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [depot\_tools/tryserver][depot_tools/recipe_modules/tryserver], [windows\_adk](#recipe_modules-windows_adk), [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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/raw\_io][recipe_engine/recipe_modules/raw_io]
&mdash; **def [RunSteps](/recipes/recipes/windows_image_builder/winpe_customization.py#32)(api, image):**
This recipe executes offline_winpe_customization.
### *recipes* / [windows\_scripts\_executor:examples/add\_windows\_driver](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_driver.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_driver.py#15): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_driver.py#33)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/add\_windows\_package](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_package.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_package.py#15): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/add_windows_package.py#33)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/cipd\_test](/recipes/recipe_modules/windows_scripts_executor/examples/cipd_test.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/cipd_test.py#16): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/cipd_test.py#34)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/customization\_mode](/recipes/recipe_modules/windows_scripts_executor/examples/customization_mode.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/customization_mode.py#10): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/customization_mode.py#30)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/edit\_offline\_registry\_test](/recipes/recipe_modules/windows_scripts_executor/examples/edit_offline_registry_test.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/edit_offline_registry_test.py#12): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/edit_offline_registry_test.py#31)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/execute\_online\_customization](/recipes/recipe_modules/windows_scripts_executor/examples/execute_online_customization.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/execute_online_customization.py#19): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/execute_online_customization.py#34)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/gcs\_test](/recipes/recipe_modules/windows_scripts_executor/examples/gcs_test.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/gcs_test.py#17): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/gcs_test.py#36)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/get\_executable\_configs](/recipes/recipe_modules/windows_scripts_executor/examples/get_executable_configs.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/get_executable_configs.py#27): [depot\_tools/bot\_update][depot_tools/recipe_modules/bot_update], [depot\_tools/gclient][depot_tools/recipe_modules/gclient], [windows\_adk](#recipe_modules-windows_adk), [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [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/proto][recipe_engine/recipe_modules/proto], [recipe\_engine/raw\_io][recipe_engine/recipe_modules/raw_io], [recipe\_engine/runtime][recipe_engine/recipe_modules/runtime], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/get_executable_configs.py#201)(api, config):**
&mdash; **def [lsdir](/recipes/recipe_modules/windows_scripts_executor/examples/get_executable_configs.py#194)(path):**
&mdash; **def [tests](/recipes/recipe_modules/windows_scripts_executor/examples/get_executable_configs.py#190)(config):**
### *recipes* / [windows\_scripts\_executor:examples/git\_test](/recipes/recipe_modules/windows_scripts_executor/examples/git_test.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/git_test.py#16): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/git_test.py#36)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/online\_windows\_customization](/recipes/recipe_modules/windows_scripts_executor/examples/online_windows_customization.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/online_windows_customization.py#16): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/online_windows_customization.py#31)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/powershell\_expression](/recipes/recipe_modules/windows_scripts_executor/examples/powershell_expression.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/powershell_expression.py#19): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/powershell_expression.py#34)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/process\_customizations](/recipes/recipe_modules/windows_scripts_executor/examples/process_customizations.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/process_customizations.py#13): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/process_customizations.py#23)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/shutdown\_vm](/recipes/recipe_modules/windows_scripts_executor/examples/shutdown_vm.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/shutdown_vm.py#19): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/shutdown_vm.py#34)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/test](/recipes/recipe_modules/windows_scripts_executor/examples/test.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/test.py#16): [depot\_tools/gitiles][depot_tools/recipe_modules/gitiles], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/test.py#37)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/trim\_uploads](/recipes/recipe_modules/windows_scripts_executor/examples/trim_uploads.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/trim_uploads.py#13): [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/trim_uploads.py#24)(api, config):**
### *recipes* / [windows\_scripts\_executor:examples/windows\_iso](/recipes/recipe_modules/windows_scripts_executor/examples/windows_iso.py)
[DEPS](/recipes/recipe_modules/windows_scripts_executor/examples/windows_iso.py#19): [depot\_tools/gsutil][depot_tools/recipe_modules/gsutil], [windows\_scripts\_executor](#recipe_modules-windows_scripts_executor), [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]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_scripts_executor/examples/windows_iso.py#34)(api, config):**
### *recipes* / [windows\_sdk:examples/full](/recipes/recipe_modules/windows_sdk/examples/full.py)
[DEPS](/recipes/recipe_modules/windows_sdk/examples/full.py#7): [windows\_sdk](#recipe_modules-windows_sdk), [recipe\_engine/platform][recipe_engine/recipe_modules/platform], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/windows_sdk/examples/full.py#15)(api):**
### *recipes* / [zip:examples/full](/recipes/recipe_modules/zip/examples/full.py)
[DEPS](/recipes/recipe_modules/zip/examples/full.py#7): [zip](#recipe_modules-zip), [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/step][recipe_engine/recipe_modules/step]
&mdash; **def [RunSteps](/recipes/recipe_modules/zip/examples/full.py#17)(api):**
[depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-bot_update
[depot_tools/recipe_modules/depot_tools]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-depot_tools
[depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-gclient
[depot_tools/recipe_modules/gerrit]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-gerrit
[depot_tools/recipe_modules/git]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-git
[depot_tools/recipe_modules/git_cl]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-git_cl
[depot_tools/recipe_modules/gitiles]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-gitiles
[depot_tools/recipe_modules/gsutil]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-gsutil
[depot_tools/recipe_modules/osx_sdk]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-osx_sdk
[depot_tools/recipe_modules/presubmit]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-presubmit
[depot_tools/recipe_modules/tryserver]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-tryserver
[depot_tools/recipe_modules/windows_sdk]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/66df2a3ec70d0628d47df1fdba69838a870a1303/recipes/README.recipes.md#recipe_modules-windows_sdk
[recipe_engine/recipe_modules/archive]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-archive
[recipe_engine/recipe_modules/assertions]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-assertions
[recipe_engine/recipe_modules/bcid_reporter]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-bcid_reporter
[recipe_engine/recipe_modules/buildbucket]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-buildbucket
[recipe_engine/recipe_modules/cipd]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-cipd
[recipe_engine/recipe_modules/commit_position]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-commit_position
[recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-context
[recipe_engine/recipe_modules/cv]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-cv
[recipe_engine/recipe_modules/defer]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-defer
[recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-file
[recipe_engine/recipe_modules/futures]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-futures
[recipe_engine/recipe_modules/golang]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-golang
[recipe_engine/recipe_modules/json]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-json
[recipe_engine/recipe_modules/led]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-led
[recipe_engine/recipe_modules/nodejs]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-nodejs
[recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-path
[recipe_engine/recipe_modules/platform]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-platform
[recipe_engine/recipe_modules/properties]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-properties
[recipe_engine/recipe_modules/proto]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-proto
[recipe_engine/recipe_modules/random]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-random
[recipe_engine/recipe_modules/raw_io]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-raw_io
[recipe_engine/recipe_modules/resultdb]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-resultdb
[recipe_engine/recipe_modules/runtime]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-runtime
[recipe_engine/recipe_modules/service_account]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-service_account
[recipe_engine/recipe_modules/step]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-step
[recipe_engine/recipe_modules/time]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-time
[recipe_engine/recipe_modules/tricium]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-tricium
[recipe_engine/recipe_modules/url]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/README.recipes.md#recipe_modules-url
[recipe_engine/wkt/RecipeApi]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/e22ed0d40a479510c01a22a82790fa4eabe83c6f/recipe_engine/recipe_api.py#433