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