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