tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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