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