# Copyright 2022 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import json from recipe_engine.recipe_api import Property from recipe_engine.post_process import DropExpectation, StatusFailure, Filter from PB.recipes.crosvm.build_linux import BuildLinuxProperties DEPS = [ "crosvm", "recipe_engine/buildbucket", "recipe_engine/context", "recipe_engine/json", "recipe_engine/properties", "recipe_engine/raw_io", "recipe_engine/step", ] PROPERTIES = BuildLinuxProperties def collect_binary_sizes(api, properties): release_build_result = api.crosvm.step_in_container( "Build crosvm releases", [ "./tools/build_release", "--json", "--platform=" + str(properties.test_arch), "--build-profile", "chromeos", ], stdout=api.raw_io.output_text(name="Obtain release build output", add_output_log=True), ) if release_build_result.stdout and json.loads( release_build_result.stdout.strip().splitlines()[-1] ): binary_sizes = {} builder_name = api.buildbucket.builder_name release_build_result_dict = json.loads(release_build_result.stdout.strip().splitlines()[-1]) for target_name, binary_path in release_build_result_dict.items(): binary_size_result = api.crosvm.step_in_container( "Get binary size for {}".format(target_name), [ "./tools/infra/binary_size", "--builder-name", builder_name, "--target-name", target_name, "--target-path", binary_path, "--base-dir", "/scratch/cargo_target/crosvm", # Only upload binary size in postsubmit *(("--upload",) if properties.profile == "postsubmit" else tuple()), "--builder-name", api.buildbucket.builder_name, "--log-url", api.buildbucket.build_url(), "--build-version", api.buildbucket.gitiles_commit.id, ], infra_step=True, stdout=api.raw_io.output_text(), ) binary_sizes.update(json.loads(binary_size_result.stdout.strip().splitlines()[-1])) api.step("Write binary sizes into output", None, infra_step=True) api.step.active_result.presentation.properties["binary_sizes"] = binary_sizes def RunSteps(api, properties): with api.crosvm.container_build_context(): presubmit_group = f"linux_{properties.test_arch}" result = api.step( "List checks to run", [ "vpython3", api.crosvm.source_dir / "tools/presubmit", "--list-checks", presubmit_group, ], stdout=api.raw_io.output_text(), ) check_list = result.stdout.strip().split("\n") for check in check_list: with api.context(env={"NEXTEST_PROFILE": properties.profile}): api.crosvm.step_in_container( "tools/presubmit %s" % check, ["tools/presubmit", "--no-delta", check] ) with api.step.nest("Collect binary sizes"): collect_binary_sizes(api, properties) def GenTests(api): yield ( api.test( "build_x86_64", api.buildbucket.ci_build(project="crosvm/crosvm"), ) + api.properties(BuildLinuxProperties(test_arch="x86_64", profile="postsubmit")) + api.step_data( "Collect binary sizes.Build crosvm releases", stdout=api.raw_io.output_text( """Using existing container (82e9d24cd4f0). $ docker exec 82e9d24cd4f0 /tools/entrypoint.sh ./tools/build_release --json --platform=x86_64 {"crosvm": "/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm"}""" ), ) + api.step_data( "Collect binary sizes.Get binary size for crosvm", stdout=api.raw_io.output_text( """Using existing container (291baf4496c5). {"/scratch/cargo_target/crosvm/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/release/crosvm": 22783488}""" ), ) + api.step_data( "List checks to run", stdout=api.raw_io.output_text("check_a\ncheck_b"), ) + api.post_process( Filter("List checks to run") .include_re(r"tools/presubmit .*") .include_re(r"Collect binary sizes.*") ) )