• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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            "--strip",
32        ],
33        stdout=api.raw_io.output_text(name="Obtain release build output", add_output_log=True),
34    )
35
36    if release_build_result.stdout and json.loads(
37        release_build_result.stdout.strip().splitlines()[-1]
38    ):
39        binary_sizes = {}
40        builder_name = api.buildbucket.builder_name
41        release_build_result_dict = json.loads(release_build_result.stdout.strip().splitlines()[-1])
42        for target_name, binary_path in release_build_result_dict.items():
43            binary_size_result = api.crosvm.step_in_container(
44                "Get binary size for {}".format(target_name),
45                [
46                    "./tools/infra/binary_size",
47                    "--builder-name",
48                    builder_name,
49                    "--target-name",
50                    target_name,
51                    "--target-path",
52                    binary_path,
53                    "--base-dir",
54                    "/scratch/cargo_target/crosvm",
55                    # Only upload binary size in postsubmit
56                    *(("--upload",) if properties.profile == "postsubmit" else tuple()),
57                    "--builder-name",
58                    api.buildbucket.builder_name,
59                    "--log-url",
60                    api.buildbucket.build_url(),
61                    "--build-version",
62                    api.buildbucket.gitiles_commit.id,
63                ],
64                infra_step=True,
65                stdout=api.raw_io.output_text(),
66            )
67            binary_sizes.update(json.loads(binary_size_result.stdout.strip().splitlines()[-1]))
68
69        api.step("Write binary sizes into output", None, infra_step=True)
70        api.step.active_result.presentation.properties["binary_sizes"] = binary_sizes
71
72
73def RunSteps(api, properties):
74    with api.crosvm.container_build_context():
75        presubmit_group = (
76            f"linux_{properties.test_arch}_direct"
77            if properties.crosvm_direct
78            else f"linux_{properties.test_arch}"
79        )
80        result = api.step(
81            "List checks to run",
82            [
83                "vpython3",
84                api.crosvm.source_dir.join("tools/presubmit"),
85                "--list-checks",
86                presubmit_group,
87            ],
88            stdout=api.raw_io.output_text(),
89        )
90        check_list = result.stdout.strip().split("\n")
91        for check in check_list:
92            api.crosvm.step_in_container(
93                "tools/presubmit %s" % check, ["tools/presubmit", "--no-delta", check]
94            )
95
96        with api.step.nest("Collect binary sizes"):
97            collect_binary_sizes(api, properties)
98
99
100def GenTests(api):
101    yield (
102        api.test(
103            "build_x86_64",
104            api.buildbucket.ci_build(project="crosvm/crosvm"),
105        )
106        + api.properties(BuildLinuxProperties(test_arch="x86_64"))
107        + api.step_data(
108            "Collect binary sizes.Build crosvm releases",
109            stdout=api.raw_io.output_text(
110                """Using existing container (82e9d24cd4f0).
111$ docker exec 82e9d24cd4f0 /tools/entrypoint.sh ./tools/build_release --json --platform=x86_64
112{"crosvm": "/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm"}"""
113            ),
114        )
115        + api.step_data(
116            "Collect binary sizes.Get binary size for crosvm",
117            stdout=api.raw_io.output_text(
118                """Using existing container (291baf4496c5).
119{"/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm": 22783488}"""
120            ),
121        )
122        + api.step_data(
123            "List checks to run",
124            stdout=api.raw_io.output_text("check_a\ncheck_b"),
125        )
126        + api.post_process(
127            Filter("List checks to run")
128            .include_re(r"tools/presubmit .*")
129            .include_re(r"Collect binary sizes.*")
130        )
131    )
132