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