beetmover_geckoview.py (6202B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 """ 5 Transform the beetmover task into an actual task description. 6 """ 7 8 from taskgraph.transforms.base import TransformSequence 9 from taskgraph.util.copy import deepcopy 10 from taskgraph.util.dependencies import get_primary_dependency 11 from taskgraph.util.schema import Schema, optionally_keyed_by, resolve_keyed_by 12 from voluptuous import Optional, Required 13 14 from gecko_taskgraph.transforms.beetmover import ( 15 craft_release_properties as beetmover_craft_release_properties, 16 ) 17 from gecko_taskgraph.transforms.task import task_description_schema 18 from gecko_taskgraph.util.attributes import ( 19 copy_attributes_from_dependent_job, 20 release_level, 21 ) 22 from gecko_taskgraph.util.declarative_artifacts import ( 23 get_geckoview_artifact_id, 24 get_geckoview_artifact_map, 25 get_geckoview_upstream_artifacts, 26 ) 27 28 beetmover_description_schema = Schema({ 29 Required("label"): str, 30 Required("dependencies"): task_description_schema["dependencies"], 31 Optional("treeherder"): task_description_schema["treeherder"], 32 Required("run-on-projects"): task_description_schema["run-on-projects"], 33 Required("run-on-hg-branches"): task_description_schema["run-on-hg-branches"], 34 Optional("bucket-scope"): optionally_keyed_by("release-level", str), 35 Optional("shipping-phase"): optionally_keyed_by( 36 "project", task_description_schema["shipping-phase"] 37 ), 38 Optional("shipping-product"): task_description_schema["shipping-product"], 39 Optional("attributes"): task_description_schema["attributes"], 40 Optional("task-from"): task_description_schema["task-from"], 41 Optional("run-on-repo-type"): task_description_schema["run-on-repo-type"], 42 }) 43 44 transforms = TransformSequence() 45 46 47 @transforms.add 48 def remove_name(config, jobs): 49 for job in jobs: 50 if "name" in job: 51 del job["name"] 52 yield job 53 54 55 transforms.add_validate(beetmover_description_schema) 56 57 58 @transforms.add 59 def resolve_keys(config, jobs): 60 for job in jobs: 61 resolve_keyed_by( 62 job, 63 "run-on-hg-branches", 64 item_name=job["label"], 65 project=config.params["project"], 66 ) 67 resolve_keyed_by( 68 job, 69 "shipping-phase", 70 item_name=job["label"], 71 project=config.params["project"], 72 ) 73 resolve_keyed_by( 74 job, 75 "bucket-scope", 76 item_name=job["label"], 77 **{"release-level": release_level(config.params)}, 78 ) 79 yield job 80 81 82 @transforms.add 83 def split_maven_packages(config, jobs): 84 for job in jobs: 85 dep_job = get_primary_dependency(config, job) 86 assert dep_job 87 88 attributes = copy_attributes_from_dependent_job(dep_job) 89 for package in attributes["maven_packages"]: 90 package_job = deepcopy(job) 91 package_job["maven-package"] = package 92 yield package_job 93 94 95 @transforms.add 96 def make_task_description(config, jobs): 97 for job in jobs: 98 dep_job = get_primary_dependency(config, job) 99 assert dep_job 100 101 attributes = copy_attributes_from_dependent_job(dep_job) 102 attributes.update(job.get("attributes", {})) 103 104 treeherder = job.get("treeherder", {}) 105 dep_th_platform = ( 106 dep_job.task.get("extra", {}) 107 .get("treeherder", {}) 108 .get("machine", {}) 109 .get("platform", "") 110 ) 111 dep_symbol = dep_job.task.get("extra", {}).get("treeherder", {}).get("symbol") 112 assert not dep_symbol or ( 113 dep_symbol.startswith("B") and dep_symbol.endswith("s") 114 ) 115 symbol_suffix = f"-{dep_symbol[1:-1]}" if dep_symbol[1:-1] else "" 116 treeherder.setdefault("platform", f"{dep_th_platform}/opt") 117 treeherder.setdefault("tier", 2) 118 treeherder.setdefault("kind", "build") 119 package = job["maven-package"] 120 treeherder.setdefault("symbol", f"BM-{package}{symbol_suffix}") 121 label = job["label"] 122 description = ( 123 "Beetmover submission for geckoview{build_platform}/{build_type}'".format( 124 build_platform=attributes.get("build_platform"), 125 build_type=attributes.get("build_type"), 126 ) 127 ) 128 129 job["dependencies"].update(deepcopy(dep_job.dependencies)) 130 131 if job.get("locale"): 132 attributes["locale"] = job["locale"] 133 134 attributes["run_on_hg_branches"] = job["run-on-hg-branches"] 135 136 task = { 137 "label": f"{package}-{label}", 138 "description": description, 139 "worker-type": "beetmover", 140 "scopes": [ 141 job["bucket-scope"], 142 "project:releng:beetmover:action:push-to-maven", 143 ], 144 "dependencies": job["dependencies"], 145 "attributes": attributes, 146 "run-on-projects": job["run-on-projects"], 147 "run-on-repo-type": job.get("run-on-repo-type", ["git", "hg"]), 148 "treeherder": treeherder, 149 "shipping-phase": job["shipping-phase"], 150 "maven-package": package, 151 } 152 153 yield task 154 155 156 @transforms.add 157 def make_task_worker(config, jobs): 158 for job in jobs: 159 job["worker"] = { 160 "artifact-map": get_geckoview_artifact_map(config, job), 161 "implementation": "beetmover-maven", 162 "release-properties": craft_release_properties(config, job), 163 "upstream-artifacts": get_geckoview_upstream_artifacts( 164 config, job, job["maven-package"] 165 ), 166 } 167 del job["maven-package"] 168 169 yield job 170 171 172 def craft_release_properties(config, job): 173 release_properties = beetmover_craft_release_properties(config, job) 174 175 release_properties["artifact-id"] = get_geckoview_artifact_id( 176 config, 177 job["attributes"]["build_platform"], 178 job["maven-package"], 179 job["attributes"].get("update-channel"), 180 ) 181 release_properties["app-name"] = "geckoview" 182 183 return release_properties