diff --git a/.gitignore b/.gitignore
index 536df2dad9..e456a7c8d4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ target/
**/*.sw[po]
**/*.orig
**/Cargo.lock
+**/*.pyc
lcov.info
.idea
.vscode
diff --git a/infra/README.md b/infra/README.md
index a5f87fb181..0a2907637e 100644
--- a/infra/README.md
+++ b/infra/README.md
@@ -7,3 +7,16 @@ See [Kokoro](../ci/kokoro) configs for the actively used presubmit system.
Note: Luci applies config and recipes changes asynchronously. Do not submit changes to this
directory in the same commit as changes to other crosvm source.
+
+## Recipe Documentation
+
+A few links to relevant documentation needed to write recipes:
+
+- [Recipe Engine](https://chromium.googlesource.com/infra/luci/recipes-py.git/+/HEAD/README.recipes.md)
+- [Depot Tools Recipes](https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/HEAD/README.recipes.md))
+- [ChromiumOS Recipes](https://chromium.googlesource.com/chromiumos/infra/recipes.git/+/HEAD/README.recipes.md)
+
+Luci also provides a
+[User Guide](https://chromium.googlesource.com/infra/luci/recipes-py/+/master/doc/user_guide.md) and
+[Walkthrough](https://chromium.googlesource.com/infra/luci/recipes-py/+/refs/heads/main/doc/walkthrough.md)
+for getting started with recipes.
diff --git a/infra/README.recipes.md b/infra/README.recipes.md
index 963f70ce27..54fe80fa35 100644
--- a/infra/README.recipes.md
+++ b/infra/README.recipes.md
@@ -2,29 +2,73 @@
# Repo documentation for [crosvm](https://chromium.googlesource.com/crosvm/crosvm.git)
## Table of Contents
+**[Recipe Modules](#Recipe-Modules)**
+ * [crosvm](#recipe_modules-crosvm) (Python3 ✅)
+
**[Recipes](#Recipes)**
- * [hello_world](#recipes-hello_world)
- * [verify_cl](#recipes-verify_cl) (Python3 ✅)
-## Recipes
+ * [build_linux](#recipes-build_linux) (Python3 ✅)
+ * [crosvm:examples/prepare_source](#recipes-crosvm_examples_prepare_source) (Python3 ✅)
+ * [crosvm:examples/step_in_container](#recipes-crosvm_examples_step_in_container) (Python3 ✅)
+## Recipe Modules
-### *recipes* / [hello\_world](/infra/recipes/hello_world.py)
+### *recipe_modules* / [crosvm](/infra/recipe_modules/crosvm)
-[DEPS](/infra/recipes/hello_world.py#7): [recipe\_engine/step][recipe_engine/recipe_modules/step]
-
-PYTHON_VERSION_COMPATIBILITY: PY2
-
-— **def [RunSteps](/infra/recipes/hello_world.py#12)(api):**
-### *recipes* / [verify\_cl](/infra/recipes/verify_cl.py)
-
-[DEPS](/infra/recipes/verify_cl.py#3): [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/path][recipe_engine/recipe_modules/path]
+[DEPS](/infra/recipe_modules/crosvm/__init__.py#7): [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/path][recipe_engine/recipe_modules/path], [recipe\_engine/step][recipe_engine/recipe_modules/step]
PYTHON_VERSION_COMPATIBILITY: PY3
-— **def [RunSteps](/infra/recipes/verify_cl.py#12)(api):**
+#### **class [CrosvmApi](/infra/recipe_modules/crosvm/api.py#10)([RecipeApi][recipe_engine/wkt/RecipeApi]):**
+
+Crosvm specific functionality shared between recipes.
+
+ **@property**
— **def [builder\_dir](/infra/recipe_modules/crosvm/api.py#17)(self):**
+
+— **def [prepare\_source](/infra/recipe_modules/crosvm/api.py#21)(self):**
+
+Prepares the local crosvm source for testing in `self.source_dir`
+
+CI jobs will check out the revision to be tested, try jobs will check out the gerrit
+change to be tested.
+
+ **@property**
— **def [source\_dir](/infra/recipe_modules/crosvm/api.py#13)(self):**
+
+— **def [step\_in\_container](/infra/recipe_modules/crosvm/api.py#41)(self, step_name, command):**
+
+Runs a luci step inside the crosvm dev container.
+## Recipes
+
+### *recipes* / [build\_linux](/infra/recipes/build_linux.py)
+
+[DEPS](/infra/recipes/build_linux.py#11): [crosvm](#recipe_modules-crosvm), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket], [recipe\_engine/context][recipe_engine/recipe_modules/context], [recipe\_engine/properties][recipe_engine/recipe_modules/properties], [recipe\_engine/step][recipe_engine/recipe_modules/step]
+
+PYTHON_VERSION_COMPATIBILITY: PY3
+
+— **def [RunSteps](/infra/recipes/build_linux.py#35)(api, properties):**
+
+— **def [get\_test\_args](/infra/recipes/build_linux.py#22)(api, test_arch):**
+
+Returns architecture specific arguments for ./tools/run_tests
+### *recipes* / [crosvm:examples/prepare\_source](/infra/recipe_modules/crosvm/examples/prepare_source.py)
+
+[DEPS](/infra/recipe_modules/crosvm/examples/prepare_source.py#12): [crosvm](#recipe_modules-crosvm), [recipe\_engine/buildbucket][recipe_engine/recipe_modules/buildbucket]
+
+PYTHON_VERSION_COMPATIBILITY: PY3
+
+— **def [RunSteps](/infra/recipe_modules/crosvm/examples/prepare_source.py#18)(api):**
+### *recipes* / [crosvm:examples/step\_in\_container](/infra/recipe_modules/crosvm/examples/step_in_container.py)
+
+[DEPS](/infra/recipe_modules/crosvm/examples/step_in_container.py#7): [crosvm](#recipe_modules-crosvm)
+
+PYTHON_VERSION_COMPATIBILITY: PY3
+
+— **def [RunSteps](/infra/recipe_modules/crosvm/examples/step_in_container.py#12)(api):**
[depot_tools/recipe_modules/bot_update]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/8a87603683bda769d437e48cc1a7494a2e237ead/recipes/README.recipes.md#recipe_modules-bot_update
[depot_tools/recipe_modules/gclient]: https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/8a87603683bda769d437e48cc1a7494a2e237ead/recipes/README.recipes.md#recipe_modules-gclient
[recipe_engine/recipe_modules/buildbucket]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-buildbucket
[recipe_engine/recipe_modules/context]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-context
+[recipe_engine/recipe_modules/file]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-file
[recipe_engine/recipe_modules/path]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-path
+[recipe_engine/recipe_modules/properties]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-properties
[recipe_engine/recipe_modules/step]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/README.recipes.md#recipe_modules-step
+[recipe_engine/wkt/RecipeApi]: https://chromium.googlesource.com/infra/luci/recipes-py.git/+/7b42800366a15f34b28e62f6bcb1cddcb2206db0/recipe_engine/recipe_api.py#883
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg
index ca1d42f578..838e7f19aa 100644
--- a/infra/config/generated/commit-queue.cfg
+++ b/infra/config/generated/commit-queue.cfg
@@ -6,7 +6,7 @@
cq_status_host: "chromium-cq-status.appspot.com"
config_groups {
- name: "main_repo"
+ name: "main"
gerrit {
url: "https://chromium-review.googlesource.com"
projects {
@@ -20,7 +20,13 @@ config_groups {
}
tryjob {
builders {
- name: "crosvm/try/Verify CL"
+ name: "crosvm/try/crosvm_linux_aarch64"
+ }
+ builders {
+ name: "crosvm/try/crosvm_linux_armhf"
+ }
+ builders {
+ name: "crosvm/try/crosvm_linux_x86_64"
}
retry_config {
single_quota: 1
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 94df5c2758..3df37bb365 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -15,25 +15,7 @@ buckets {
}
swarming {
builders {
- name: "Example Builder"
- swarming_host: "chromium-swarm.appspot.com"
- exe {
- cipd_package: "infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm"
- cipd_version: "refs/heads/main"
- cmd: "luciexe"
- }
- properties:
- '{'
- ' "recipe": "hello_world"'
- '}'
- service_account: "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com"
- experiments {
- key: "luci.recipes.use_python3"
- value: 100
- }
- }
- builders {
- name: "Verify CL"
+ name: "crosvm_linux_aarch64"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "cpu:x86-64"
dimensions: "os:Ubuntu"
@@ -45,7 +27,52 @@ buckets {
}
properties:
'{'
- ' "recipe": "verify_cl"'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "aarch64"'
+ '}'
+ service_account: "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com"
+ experiments {
+ key: "luci.recipes.use_python3"
+ value: 100
+ }
+ }
+ builders {
+ name: "crosvm_linux_armhf"
+ swarming_host: "chromium-swarm.appspot.com"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu"
+ dimensions: "pool:luci.crosvm.ci"
+ exe {
+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm"
+ cipd_version: "refs/heads/main"
+ cmd: "luciexe"
+ }
+ properties:
+ '{'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "armhf"'
+ '}'
+ service_account: "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com"
+ experiments {
+ key: "luci.recipes.use_python3"
+ value: 100
+ }
+ }
+ builders {
+ name: "crosvm_linux_x86_64"
+ swarming_host: "chromium-swarm.appspot.com"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu"
+ dimensions: "pool:luci.crosvm.ci"
+ exe {
+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm"
+ cipd_version: "refs/heads/main"
+ cmd: "luciexe"
+ }
+ properties:
+ '{'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "x86_64"'
'}'
service_account: "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com"
experiments {
@@ -68,7 +95,7 @@ buckets {
}
swarming {
builders {
- name: "Verify CL"
+ name: "crosvm_linux_aarch64"
swarming_host: "chromium-swarm.appspot.com"
dimensions: "cpu:x86-64"
dimensions: "os:Ubuntu"
@@ -80,7 +107,52 @@ buckets {
}
properties:
'{'
- ' "recipe": "verify_cl"'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "aarch64"'
+ '}'
+ service_account: "crosvm-luci-try-builder@crosvm-infra.iam.gserviceaccount.com"
+ experiments {
+ key: "luci.recipes.use_python3"
+ value: 100
+ }
+ }
+ builders {
+ name: "crosvm_linux_armhf"
+ swarming_host: "chromium-swarm.appspot.com"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu"
+ dimensions: "pool:luci.crosvm.try"
+ exe {
+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm"
+ cipd_version: "refs/heads/main"
+ cmd: "luciexe"
+ }
+ properties:
+ '{'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "armhf"'
+ '}'
+ service_account: "crosvm-luci-try-builder@crosvm-infra.iam.gserviceaccount.com"
+ experiments {
+ key: "luci.recipes.use_python3"
+ value: 100
+ }
+ }
+ builders {
+ name: "crosvm_linux_x86_64"
+ swarming_host: "chromium-swarm.appspot.com"
+ dimensions: "cpu:x86-64"
+ dimensions: "os:Ubuntu"
+ dimensions: "pool:luci.crosvm.try"
+ exe {
+ cipd_package: "infra/recipe_bundles/chromium.googlesource.com/crosvm/crosvm"
+ cipd_version: "refs/heads/main"
+ cmd: "luciexe"
+ }
+ properties:
+ '{'
+ ' "recipe": "build_linux",'
+ ' "test_arch": "x86_64"'
'}'
service_account: "crosvm-luci-try-builder@crosvm-infra.iam.gserviceaccount.com"
experiments {
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg
index 11f63a7938..4d3ec72abb 100644
--- a/infra/config/generated/luci-milo.cfg
+++ b/infra/config/generated/luci-milo.cfg
@@ -5,12 +5,21 @@
# https://luci-config.appspot.com/schemas/projects:luci-milo.cfg
consoles {
- id: "CI builders"
- name: "CI builders"
+ id: "CI Console"
+ name: "CI Console"
repo_url: "https://chromium.googlesource.com/crosvm/crosvm"
refs: "regexp:refs/heads/main"
manifest_name: "REVISION"
builders {
- name: "buildbucket/luci.crosvm.ci/Verify CL"
+ name: "buildbucket/luci.crosvm.ci/crosvm_linux_x86_64"
+ category: "linux"
+ }
+ builders {
+ name: "buildbucket/luci.crosvm.ci/crosvm_linux_aarch64"
+ category: "linux"
+ }
+ builders {
+ name: "buildbucket/luci.crosvm.ci/crosvm_linux_armhf"
+ category: "linux"
}
}
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg
index bfbbc1b364..e5fdffe461 100644
--- a/infra/config/generated/luci-scheduler.cfg
+++ b/infra/config/generated/luci-scheduler.cfg
@@ -4,10 +4,43 @@
# For the schema of this file, see ProjectConfig message:
# https://luci-config.appspot.com/schemas/projects:luci-scheduler.cfg
+job {
+ id: "crosvm_linux_aarch64"
+ realm: "ci"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "ci"
+ builder: "crosvm_linux_aarch64"
+ }
+}
+job {
+ id: "crosvm_linux_armhf"
+ realm: "ci"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "ci"
+ builder: "crosvm_linux_armhf"
+ }
+}
+job {
+ id: "crosvm_linux_x86_64"
+ realm: "ci"
+ acl_sets: "ci"
+ buildbucket {
+ server: "cr-buildbucket.appspot.com"
+ bucket: "ci"
+ builder: "crosvm_linux_x86_64"
+ }
+}
trigger {
id: "main source"
realm: "ci"
acl_sets: "ci"
+ triggers: "crosvm_linux_aarch64"
+ triggers: "crosvm_linux_armhf"
+ triggers: "crosvm_linux_x86_64"
gitiles {
repo: "https://chromium.googlesource.com/crosvm/crosvm"
refs: "regexp:refs/heads/main"
diff --git a/infra/config/main.star b/infra/config/main.star
index 83d46f5698..63f6a7f90f 100755
--- a/infra/config/main.star
+++ b/infra/config/main.star
@@ -114,66 +114,91 @@ luci.bucket(name = "prod")
# as the recipe bundler compiles them from your refs/heads/main branch.
cipd_version = "refs/heads/main"
-# Example builder to verify configuration
-luci.builder(
- name = "Example Builder",
- bucket = "ci",
- executable = luci.recipe(
- name = "hello_world",
- ),
- schedule = None,
- service_account = "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com",
-)
-
-# Create builders for change verifier
-def verify_builder(bucket):
- luci.builder(
- name = "Verify CL",
- bucket = bucket,
- executable = luci.recipe(
- name = "verify_cl",
- ),
- service_account = "crosvm-luci-%s-builder@crosvm-infra.iam.gserviceaccount.com" % bucket,
- dimensions = {
- "os": "Ubuntu",
- "cpu": "x86-64",
- "pool": "luci.crosvm.%s" % bucket,
- },
- )
-
-verify_builder("try")
-verify_builder("ci")
-
# Configure Change Verifier to watch crosvm
luci.cq(
status_host = "chromium-cq-status.appspot.com",
)
-
luci.cq_group(
- name = "main_repo",
+ name = "main",
watch = cq.refset(
repo = "https://chromium.googlesource.com/crosvm/crosvm",
refs = ["refs/heads/.+"], # will watch all branches
),
)
-# Attach our "Verify CL" builder to this CQ group.
-luci.cq_tryjob_verifier(
- builder = "try/Verify CL",
- cq_group = "main_repo",
+# Configure postsubmit tests running in ci pool
+luci.console_view(
+ name = "CI Console",
+ repo = "https://chromium.googlesource.com/crosvm/crosvm",
)
-# Configure postsubmit tests running in ci pool
-luci.gitiles_poller(
- name = "main source",
- bucket = "ci",
- repo = "https://chromium.googlesource.com/crosvm/crosvm",
- # triggers = ["ci/Verify CL"],
-)
-luci.console_view(
- name = "CI builders",
- repo = "https://chromium.googlesource.com/crosvm/crosvm",
- entries = [
- luci.console_view_entry(builder = "ci/Verify CL"),
- ],
-)
+def verify_builder(name, dimensions, **args):
+ """Creates both a CI and try builder with the same properties.
+
+ The CI builder is attached to the gitlies poller and console view, and the try builder
+ is added to the change verifier.
+
+ Args:
+ name: Name of the builder
+ dimensions: Passed to luci.builder
+ **args: Passed to luci.builder
+ """
+
+ # CI builder
+ luci.builder(
+ name = name,
+ bucket = "ci",
+ service_account = "crosvm-luci-ci-builder@crosvm-infra.iam.gserviceaccount.com",
+ dimensions = dict(pool = "luci.crosvm.ci", **dimensions),
+ **args
+ )
+ luci.gitiles_poller(
+ name = "main source",
+ bucket = "ci",
+ repo = "https://chromium.googlesource.com/crosvm/crosvm",
+ triggers = ["ci/%s" % name],
+ )
+ luci.console_view_entry(
+ console_view = "CI Console",
+ builder = "ci/%s" % name,
+ category = "linux",
+ )
+
+ # Try builder
+ luci.builder(
+ name = name,
+ bucket = "try",
+ service_account = "crosvm-luci-try-builder@crosvm-infra.iam.gserviceaccount.com",
+ dimensions = dict(pool = "luci.crosvm.try", **dimensions),
+ **args
+ )
+
+ # Attach try builder to Change Verifier
+ luci.cq_tryjob_verifier(
+ builder = "try/%s" % name,
+ cq_group = "main",
+ )
+
+def verify_linux_builder(arch):
+ """Creates a verify builder that builds crosvm on linux
+
+ Args:
+ arch: Architecture to build and test
+ """
+ verify_builder(
+ name = "crosvm_linux_%s" % arch,
+ dimensions = {
+ "os": "Ubuntu",
+ "cpu": "x86-64",
+ },
+ executable = luci.recipe(
+ name = "build_linux",
+ ),
+ properties = {
+ "test_arch": arch,
+ },
+ )
+
+verify_linux_builder("x86_64")
+verify_linux_builder("aarch64")
+verify_linux_builder("armhf")
diff --git a/infra/recipe_modules/crosvm/__init__.py b/infra/recipe_modules/crosvm/__init__.py
new file mode 100644
index 0000000000..5ac3c00767
--- /dev/null
+++ b/infra/recipe_modules/crosvm/__init__.py
@@ -0,0 +1,15 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+PYTHON_VERSION_COMPATIBILITY = "PY3"
+
+DEPS = [
+ "depot_tools/bot_update",
+ "depot_tools/gclient",
+ "recipe_engine/buildbucket",
+ "recipe_engine/context",
+ "recipe_engine/file",
+ "recipe_engine/path",
+ "recipe_engine/step",
+]
diff --git a/infra/recipe_modules/crosvm/api.py b/infra/recipe_modules/crosvm/api.py
new file mode 100644
index 0000000000..f4ef497975
--- /dev/null
+++ b/infra/recipe_modules/crosvm/api.py
@@ -0,0 +1,53 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from recipe_engine import recipe_api
+
+CROSVM_REPO_URL = "https://chromium.googlesource.com/crosvm/crosvm"
+
+
+class CrosvmApi(recipe_api.RecipeApi):
+ "Crosvm specific functionality shared between recipes."
+
+ @property
+ def source_dir(self):
+ return self.builder_dir.join("crosvm")
+
+ @property
+ def builder_dir(self):
+ return self.m.path["cache"].join("builder")
+
+ def prepare_source(self):
+ """
+ Prepares the local crosvm source for testing in `self.source_dir`
+
+ CI jobs will check out the revision to be tested, try jobs will check out the gerrit
+ change to be tested.
+ """
+ self.m.file.ensure_directory("Ensure builder_dir exists", self.builder_dir)
+
+ with self.m.context(cwd=self.builder_dir):
+ gclient_config = self.m.gclient.make_config()
+ s = gclient_config.solutions.add()
+ s.url = CROSVM_REPO_URL
+ s.name = "crosvm"
+ gclient_config.got_revision_mapping[s.name] = "got_revision"
+ self.m.bot_update.ensure_checkout(gclient_config=gclient_config)
+
+ with self.m.context(cwd=self.source_dir):
+ self.m.step("Sync Submodules", ["git", "submodule", "update", "--init"])
+
+ def step_in_container(self, step_name, command):
+ """
+ Runs a luci step inside the crosvm dev container.
+ """
+ self.m.step(
+ step_name,
+ [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ ]
+ + command,
+ )
diff --git a/infra/recipe_modules/crosvm/examples/prepare_source.py b/infra/recipe_modules/crosvm/examples/prepare_source.py
new file mode 100644
index 0000000000..e2438e00bf
--- /dev/null
+++ b/infra/recipe_modules/crosvm/examples/prepare_source.py
@@ -0,0 +1,41 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from recipe_engine.post_process import (
+ DropExpectation,
+ StepCommandContains,
+)
+
+PYTHON_VERSION_COMPATIBILITY = "PY3"
+
+DEPS = [
+ "crosvm",
+ "recipe_engine/buildbucket",
+]
+
+
+def RunSteps(api):
+ api.crosvm.prepare_source()
+
+
+def GenTests(api):
+ REPO = "https://chromium.googlesource.com/crosvm/crosvm"
+ REVISION = "2d72510e447ab60a9728aeea2362d8be2cbd7789"
+
+ yield (
+ api.test(
+ "prepare_source_for_try",
+ api.buildbucket.try_build(project="crosvm", git_repo=REPO),
+ )
+ + api.post_process(StepCommandContains, "bot_update", ["--patch_ref"])
+ + api.post_process(DropExpectation)
+ )
+ yield (
+ api.test(
+ "prepare_source_for_ci",
+ api.buildbucket.ci_build(project="crosvm", git_repo=REPO, revision=REVISION),
+ )
+ + api.post_process(StepCommandContains, "bot_update", ["--revision", "crosvm@" + REVISION])
+ + api.post_process(DropExpectation)
+ )
diff --git a/infra/recipe_modules/crosvm/examples/step_in_container.expected/simple_step.json b/infra/recipe_modules/crosvm/examples/step_in_container.expected/simple_step.json
new file mode 100644
index 0000000000..e58c20c1aa
--- /dev/null
+++ b/infra/recipe_modules/crosvm/examples/step_in_container.expected/simple_step.json
@@ -0,0 +1,15 @@
+[
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "echo",
+ "success"
+ ],
+ "name": "Foo"
+ },
+ {
+ "name": "$result"
+ }
+]
\ No newline at end of file
diff --git a/infra/recipe_modules/crosvm/examples/step_in_container.py b/infra/recipe_modules/crosvm/examples/step_in_container.py
new file mode 100644
index 0000000000..40deb0fefd
--- /dev/null
+++ b/infra/recipe_modules/crosvm/examples/step_in_container.py
@@ -0,0 +1,17 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+PYTHON_VERSION_COMPATIBILITY = "PY3"
+
+DEPS = [
+ "crosvm",
+]
+
+
+def RunSteps(api):
+ api.crosvm.step_in_container("Foo", ["echo", "success"])
+
+
+def GenTests(api):
+ yield api.test("simple_step")
diff --git a/infra/recipes/build_linux.expected/build_aarch64.json b/infra/recipes/build_linux.expected/build_aarch64.json
new file mode 100644
index 0000000000..6bfafb63d3
--- /dev/null
+++ b/infra/recipes/build_linux.expected/build_aarch64.json
@@ -0,0 +1,73 @@
+[
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "true"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Download container image"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--build-only",
+ "--target=vm:aarch64"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Build crosvm tests"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--target=vm:aarch64"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Run crosvm tests"
+ }
+]
\ No newline at end of file
diff --git a/infra/recipes/build_linux.expected/build_armhf.json b/infra/recipes/build_linux.expected/build_armhf.json
new file mode 100644
index 0000000000..1498caee27
--- /dev/null
+++ b/infra/recipes/build_linux.expected/build_armhf.json
@@ -0,0 +1,75 @@
+[
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "true"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Download container image"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--build-only",
+ "--target=vm:aarch64",
+ "--arch=armhf"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Build crosvm tests"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--target=vm:aarch64",
+ "--arch=armhf"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Run crosvm tests"
+ }
+]
\ No newline at end of file
diff --git a/infra/recipes/build_linux.expected/build_x86_64.json b/infra/recipes/build_linux.expected/build_x86_64.json
new file mode 100644
index 0000000000..65fe84e8fc
--- /dev/null
+++ b/infra/recipes/build_linux.expected/build_x86_64.json
@@ -0,0 +1,73 @@
+[
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "true"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Download container image"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--build-only",
+ "--target=host"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Build crosvm tests"
+ },
+ {
+ "cmd": [
+ "./tools/dev_container",
+ "--verbose",
+ "--hermetic",
+ "./tools/run_tests",
+ "--verbose",
+ "--target=host"
+ ],
+ "cwd": "[CACHE]/builder/crosvm",
+ "luci_context": {
+ "realm": {
+ "name": "crosvm/crosvm:ci"
+ },
+ "resultdb": {
+ "current_invocation": {
+ "name": "invocations/build:8945511751514863184",
+ "update_token": "token"
+ },
+ "hostname": "rdbhost"
+ }
+ },
+ "name": "Run crosvm tests"
+ }
+]
\ No newline at end of file
diff --git a/infra/recipes/build_linux.proto b/infra/recipes/build_linux.proto
new file mode 100644
index 0000000000..8ba11dab33
--- /dev/null
+++ b/infra/recipes/build_linux.proto
@@ -0,0 +1,12 @@
+// Copyright 2022 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto3";
+
+package recipes.crosvm.build_linux;
+
+message BuildLinuxProperties {
+ // Architecture to test. See `crosvm/tools/run_tests`
+ optional string test_arch = 1;
+}
diff --git a/infra/recipes/build_linux.py b/infra/recipes/build_linux.py
new file mode 100644
index 0000000000..c486e8e0b6
--- /dev/null
+++ b/infra/recipes/build_linux.py
@@ -0,0 +1,94 @@
+# Copyright 2022 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from recipe_engine.recipe_api import Property
+from recipe_engine.post_process import DropExpectation, StatusFailure, Filter
+from PB.recipes.crosvm.build_linux import BuildLinuxProperties
+
+PYTHON_VERSION_COMPATIBILITY = "PY3"
+
+DEPS = [
+ "crosvm",
+ "recipe_engine/buildbucket",
+ "recipe_engine/context",
+ "recipe_engine/properties",
+ "recipe_engine/step",
+]
+
+PROPERTIES = BuildLinuxProperties
+
+
+def get_test_args(api, test_arch):
+ "Returns architecture specific arguments for ./tools/run_tests"
+ # TODO(denniskempin): Move this logic into ./tools/presubmit
+ if test_arch == "" or test_arch == "x86_64":
+ return ["--target=host"]
+ elif test_arch == "aarch64":
+ return ["--target=vm:aarch64"]
+ elif test_arch == "armhf":
+ return ["--target=vm:aarch64", "--arch=armhf"]
+ else:
+ raise api.step.StepFailure("Unknown test_arch " + test_arch)
+
+
+def RunSteps(api, properties):
+ api.crosvm.prepare_source()
+ with api.context(cwd=api.crosvm.source_dir):
+ # Run a no-op command in the container which will ensure the image is downloaded.
+ api.crosvm.step_in_container("Download container image", ["true"])
+
+ api.crosvm.step_in_container(
+ "Build crosvm tests",
+ [
+ "./tools/run_tests",
+ "--verbose",
+ "--build-only",
+ ]
+ + get_test_args(api, properties.test_arch),
+ )
+ api.crosvm.step_in_container(
+ "Run crosvm tests",
+ [
+ "./tools/run_tests",
+ "--verbose",
+ ]
+ + get_test_args(api, properties.test_arch),
+ )
+
+
+def GenTests(api):
+ filter_steps = Filter("Download container image", "Build crosvm tests", "Run crosvm tests")
+ yield (
+ api.test(
+ "build_x86_64",
+ api.buildbucket.ci_build(project="crosvm/crosvm"),
+ )
+ + api.properties(BuildLinuxProperties(test_arch="x86_64"))
+ + api.post_process(filter_steps)
+ )
+ yield (
+ api.test(
+ "build_aarch64",
+ api.buildbucket.ci_build(project="crosvm/crosvm"),
+ )
+ + api.properties(BuildLinuxProperties(test_arch="aarch64"))
+ + api.post_process(filter_steps)
+ )
+ yield (
+ api.test(
+ "build_armhf",
+ api.buildbucket.ci_build(project="crosvm/crosvm"),
+ )
+ + api.properties(BuildLinuxProperties(test_arch="armhf"))
+ + api.post_process(filter_steps)
+ )
+ yield (
+ api.test(
+ "build_unknown",
+ api.buildbucket.ci_build(project="crosvm/crosvm"),
+ )
+ + api.properties(BuildLinuxProperties(test_arch="foobar"))
+ + api.post_process(StatusFailure)
+ + api.post_process(DropExpectation)
+ )
diff --git a/infra/recipes/hello_world.expected/basic.json b/infra/recipes/hello_world.expected/basic.json
deleted file mode 100644
index b692cbbbc4..0000000000
--- a/infra/recipes/hello_world.expected/basic.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[
- {
- "cmd": [],
- "name": "Hello world"
- },
- {
- "name": "$result"
- }
-]
\ No newline at end of file
diff --git a/infra/recipes/hello_world.py b/infra/recipes/hello_world.py
deleted file mode 100644
index 3d3e231c83..0000000000
--- a/infra/recipes/hello_world.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Enumerates the recipe modules that this recipe uses.
-#
-# "recipe_engine" is the "repo_name" for the recipes-py repo, and "step"
-# is the name of the "step" recipe module within that repo. The
-# "recipe_engine/step" module will be the most frequently-used module in your
-# recipes as it allows you to run executables within your build.
-DEPS = [
- "recipe_engine/step",
-]
-
-
-def RunSteps(api):
- # Creates an 'empty' (i.e. no-op) step in the UI with the name "Hello world".
- api.step.empty("Hello world")
-
-
-def GenTests(api):
- # Tells the recipe engine to generate an expectation file (JSON simulation
- # output) for this recipe when it is run without any input properties.
- yield api.test("basic")
diff --git a/infra/recipes/verify_cl.expected/basic ci.json b/infra/recipes/verify_cl.expected/basic ci.json
deleted file mode 100644
index 3715eaf07b..0000000000
--- a/infra/recipes/verify_cl.expected/basic ci.json
+++ /dev/null
@@ -1,91 +0,0 @@
-[
- {
- "cmd": [
- "vpython3",
- "-u",
- "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
- "--spec-path",
- "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src', 'url': 'http://chromium.googlesource.com/crosvm/crosvm'}]",
- "--revision_mapping_file",
- "{\"got_revision\": \"src\"}",
- "--git-cache-dir",
- "[CACHE]/git",
- "--cleanup-dir",
- "[CLEANUP]/bot_update",
- "--output_json",
- "/path/to/tmp/json",
- "--revision",
- "src@2d72510e447ab60a9728aeea2362d8be2cbd7789",
- "--refs",
- "refs/heads/main"
- ],
- "cwd": "[CACHE]/builder",
- "env": {
- "DEPOT_TOOLS_REPORT_BUILD": "crosvm/ci/builder/8945511751514863184",
- "GIT_HTTP_LOW_SPEED_LIMIT": "102400",
- "GIT_HTTP_LOW_SPEED_TIME": "1800"
- },
- "env_suffixes": {
- "DEPOT_TOOLS_UPDATE": [
- "0"
- ],
- "PATH": [
- "RECIPE_REPO[depot_tools]"
- ]
- },
- "infra_step": true,
- "luci_context": {
- "realm": {
- "name": "crosvm:ci"
- },
- "resultdb": {
- "current_invocation": {
- "name": "invocations/build:8945511751514863184",
- "update_token": "token"
- },
- "hostname": "rdbhost"
- }
- },
- "name": "bot_update",
- "~followup_annotations": [
- "@@@STEP_TEXT@Some step text@@@",
- "@@@STEP_LOG_LINE@json.output@{@@@",
- "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src.git\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"revision\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/main@{#170242}\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"source_manifest\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"directories\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"git_checkout\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"repo_url\": \"https://fake.org/src.git\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"revision\": \"2d72510e447ab60a9728aeea2362d8be2cbd7789\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"version\": 0@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
- "@@@STEP_LOG_LINE@json.output@}@@@",
- "@@@STEP_LOG_END@json.output@@@",
- "@@@SET_BUILD_PROPERTY@got_revision@\"2d72510e447ab60a9728aeea2362d8be2cbd7789\"@@@",
- "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/main@{#170242}\"@@@"
- ]
- },
- {
- "name": "$result"
- }
-]
\ No newline at end of file
diff --git a/infra/recipes/verify_cl.expected/basic try.json b/infra/recipes/verify_cl.expected/basic try.json
deleted file mode 100644
index 01524c582e..0000000000
--- a/infra/recipes/verify_cl.expected/basic try.json
+++ /dev/null
@@ -1,151 +0,0 @@
-[
- {
- "cmd": [
- "vpython",
- "-u",
- "RECIPE_REPO[depot_tools]/gerrit_client.py",
- "changes",
- "--host",
- "https://chromium-review.googlesource.com",
- "--json_file",
- "/path/to/tmp/json",
- "--limit",
- "1",
- "-p",
- "change=123456",
- "-o",
- "ALL_REVISIONS",
- "-o",
- "DOWNLOAD_COMMANDS"
- ],
- "cwd": "[CACHE]/builder",
- "env": {
- "PATH": ":RECIPE_REPO[depot_tools]"
- },
- "infra_step": true,
- "luci_context": {
- "realm": {
- "name": "crosvm:try"
- },
- "resultdb": {
- "current_invocation": {
- "name": "invocations/build:8945511751514863184",
- "update_token": "token"
- },
- "hostname": "rdbhost"
- }
- },
- "name": "gerrit fetch current CL info",
- "timeout": 60,
- "~followup_annotations": [
- "@@@STEP_LOG_LINE@json.output@[@@@",
- "@@@STEP_LOG_LINE@json.output@ {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"branch\": \"main\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"owner\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"name\": \"John Doe\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"revisions\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"184ebe53805e102605d11f6b143486d15c23a09c\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"_number\": \"7\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"ref\": \"refs/changes/56/123456/7\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@]@@@",
- "@@@STEP_LOG_END@json.output@@@"
- ]
- },
- {
- "cmd": [
- "vpython3",
- "-u",
- "RECIPE_MODULE[depot_tools::bot_update]/resources/bot_update.py",
- "--spec-path",
- "cache_dir = '[CACHE]/git'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src', 'url': 'http://chromium.googlesource.com/crosvm/crosvm'}]",
- "--patch_root",
- "src",
- "--revision_mapping_file",
- "{\"got_revision\": \"src\"}",
- "--git-cache-dir",
- "[CACHE]/git",
- "--cleanup-dir",
- "[CLEANUP]/bot_update",
- "--output_json",
- "/path/to/tmp/json",
- "--patch_ref",
- "https://chromium.googlesource.com/crosvm/crosvm@refs/heads/main:refs/changes/56/123456/7",
- "--revision",
- "src@refs/heads/main",
- "--refs",
- "refs/heads/main"
- ],
- "cwd": "[CACHE]/builder",
- "env": {
- "DEPOT_TOOLS_REPORT_BUILD": "crosvm/try/builder/8945511751514863184",
- "GIT_HTTP_LOW_SPEED_LIMIT": "102400",
- "GIT_HTTP_LOW_SPEED_TIME": "1800"
- },
- "env_suffixes": {
- "DEPOT_TOOLS_UPDATE": [
- "0"
- ],
- "PATH": [
- "RECIPE_REPO[depot_tools]"
- ]
- },
- "infra_step": true,
- "luci_context": {
- "realm": {
- "name": "crosvm:try"
- },
- "resultdb": {
- "current_invocation": {
- "name": "invocations/build:8945511751514863184",
- "update_token": "token"
- },
- "hostname": "rdbhost"
- }
- },
- "name": "bot_update",
- "~followup_annotations": [
- "@@@STEP_TEXT@Some step text@@@",
- "@@@STEP_LOG_LINE@json.output@{@@@",
- "@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src.git\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"got_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"got_revision_cp\": \"refs/heads/main@{#170242}\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"source_manifest\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"directories\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"src\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"git_checkout\": {@@@",
- "@@@STEP_LOG_LINE@json.output@ \"repo_url\": \"https://fake.org/src.git\", @@@",
- "@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"version\": 0@@@",
- "@@@STEP_LOG_LINE@json.output@ }, @@@",
- "@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
- "@@@STEP_LOG_LINE@json.output@}@@@",
- "@@@STEP_LOG_END@json.output@@@",
- "@@@SET_BUILD_PROPERTY@got_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
- "@@@SET_BUILD_PROPERTY@got_revision_cp@\"refs/heads/main@{#170242}\"@@@"
- ]
- },
- {
- "name": "$result"
- }
-]
\ No newline at end of file
diff --git a/infra/recipes/verify_cl.py b/infra/recipes/verify_cl.py
deleted file mode 100644
index ee10c2c612..0000000000
--- a/infra/recipes/verify_cl.py
+++ /dev/null
@@ -1,62 +0,0 @@
-PYTHON_VERSION_COMPATIBILITY = "PY3"
-
-DEPS = [
- "depot_tools/bot_update",
- "depot_tools/gclient",
- "recipe_engine/buildbucket",
- "recipe_engine/context",
- "recipe_engine/path",
-]
-
-
-def RunSteps(api):
- # TODO(denniskempin): Consider using git directly for simpler config
- gitilies = api.buildbucket.build.input.gitiles_commit
- if gitilies.host:
- url = "http://%s/%s" % (gitilies.host, gitilies.project)
- else:
- cl = api.buildbucket.build.input.gerrit_changes[0]
- gs_suffix = "-review.googlesource.com"
- host = cl.host
- if host.endswith(gs_suffix):
- host = "%s.googlesource.com" % host[: -len(gs_suffix)]
- url = "http://%s/%s" % (host, cl.project)
-
- gclient_config = api.gclient.make_config()
- s = gclient_config.solutions.add()
- s.url = url
- s.name = "src"
- gclient_config.got_revision_mapping[s.name] = "got_revision"
-
- with api.context(cwd=api.path["cache"].join("builder")):
- update_result = api.bot_update.ensure_checkout(gclient_config=gclient_config)
-
- # At this point the code for the Gerrit CL is checked out at
- # `api.path['cache'].join('builder')`, which by default is preserved locally
- # on the bot machine and re-used between different builds for the same
- # builder.
-
- # TODO(denniskempin): Add some sort of build and/or verification step(s).
-
-
-def GenTests(api):
- yield api.test(
- "basic try",
- # These are just to make the JSON expectation file data look closer to
- # reality. Project and git_repo will be filled in "for real" by the LUCI
- # Change Verifier service when it creates your build.
- api.buildbucket.try_build(
- project="crosvm",
- git_repo="https://chromium.googlesource.com/crosvm/crosvm",
- ),
- )
- yield api.test(
- "basic ci",
- # These are just to make the JSON expectation file data look closer to
- # reality. Project and git_repo will be filled in "for real" by the LUCI
- # Change Verifier service when it creates your build.
- api.buildbucket.ci_build(
- project="crosvm",
- git_repo="https://chromium.googlesource.com/crosvm/crosvm",
- ),
- )