xref: /aosp_15_r20/external/crosvm/infra/recipes/build_linux.py (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1# Copyright 2022 The ChromiumOS Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import json
6
7from recipe_engine.recipe_api import Property
8from recipe_engine.post_process import DropExpectation, StatusFailure, Filter
9from PB.recipes.crosvm.build_linux import BuildLinuxProperties
10
11DEPS = [
12    "crosvm",
13    "recipe_engine/buildbucket",
14    "recipe_engine/context",
15    "recipe_engine/json",
16    "recipe_engine/properties",
17    "recipe_engine/raw_io",
18    "recipe_engine/step",
19]
20
21PROPERTIES = BuildLinuxProperties
22
23
24def collect_binary_sizes(api, properties):
25    release_build_result = api.crosvm.step_in_container(
26        "Build crosvm releases",
27        [
28            "./tools/build_release",
29            "--json",
30            "--platform=" + str(properties.test_arch),
31            "--build-profile",
32            "chromeos",
33        ],
34        stdout=api.raw_io.output_text(name="Obtain release build output", add_output_log=True),
35    )
36
37    if release_build_result.stdout and json.loads(
38        release_build_result.stdout.strip().splitlines()[-1]
39    ):
40        binary_sizes = {}
41        builder_name = api.buildbucket.builder_name
42        release_build_result_dict = json.loads(release_build_result.stdout.strip().splitlines()[-1])
43        for target_name, binary_path in release_build_result_dict.items():
44            binary_size_result = api.crosvm.step_in_container(
45                "Get binary size for {}".format(target_name),
46                [
47                    "./tools/infra/binary_size",
48                    "--builder-name",
49                    builder_name,
50                    "--target-name",
51                    target_name,
52                    "--target-path",
53                    binary_path,
54                    "--base-dir",
55                    "/scratch/cargo_target/crosvm",
56                    # Only upload binary size in postsubmit
57                    *(("--upload",) if properties.profile == "postsubmit" else tuple()),
58                    "--builder-name",
59                    api.buildbucket.builder_name,
60                    "--log-url",
61                    api.buildbucket.build_url(),
62                    "--build-version",
63                    api.buildbucket.gitiles_commit.id,
64                ],
65                infra_step=True,
66                stdout=api.raw_io.output_text(),
67            )
68            binary_sizes.update(json.loads(binary_size_result.stdout.strip().splitlines()[-1]))
69
70        api.step("Write binary sizes into output", None, infra_step=True)
71        api.step.active_result.presentation.properties["binary_sizes"] = binary_sizes
72
73
74def RunSteps(api, properties):
75    with api.crosvm.container_build_context():
76        presubmit_group = f"linux_{properties.test_arch}"
77        result = api.step(
78            "List checks to run",
79            [
80                "vpython3",
81                api.crosvm.source_dir / "tools/presubmit",
82                "--list-checks",
83                presubmit_group,
84            ],
85            stdout=api.raw_io.output_text(),
86        )
87        check_list = result.stdout.strip().split("\n")
88        for check in check_list:
89            with api.context(env={"NEXTEST_PROFILE": properties.profile}):
90                api.crosvm.step_in_container(
91                    "tools/presubmit %s" % check, ["tools/presubmit", "--no-delta", check]
92                )
93
94        with api.step.nest("Collect binary sizes"):
95            collect_binary_sizes(api, properties)
96
97
98def GenTests(api):
99    yield (
100        api.test(
101            "build_x86_64",
102            api.buildbucket.ci_build(project="crosvm/crosvm"),
103        )
104        + api.properties(BuildLinuxProperties(test_arch="x86_64", profile="postsubmit"))
105        + api.step_data(
106            "Collect binary sizes.Build crosvm releases",
107            stdout=api.raw_io.output_text(
108                """Using existing container (82e9d24cd4f0).
109$ docker exec 82e9d24cd4f0 /tools/entrypoint.sh ./tools/build_release --json --platform=x86_64
110{"crosvm": "/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm"}"""
111            ),
112        )
113        + api.step_data(
114            "Collect binary sizes.Get binary size for crosvm",
115            stdout=api.raw_io.output_text(
116                """Using existing container (291baf4496c5).
117{"/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm": 22783488}"""
118            ),
119        )
120        + api.step_data(
121            "List checks to run",
122            stdout=api.raw_io.output_text("check_a\ncheck_b"),
123        )
124        + api.post_process(
125            Filter("List checks to run")
126            .include_re(r"tools/presubmit .*")
127            .include_re(r"Collect binary sizes.*")
128        )
129    )
130