tor-browser

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

beetmover_source_checksums.py (5223B)


      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 release-beetmover-source-checksums into an actual task description.
      6 """
      7 
      8 from taskgraph.transforms.base import TransformSequence
      9 from taskgraph.util.dependencies import get_primary_dependency
     10 from taskgraph.util.schema import Schema
     11 from voluptuous import Optional
     12 
     13 from gecko_taskgraph.transforms.beetmover import craft_release_properties
     14 from gecko_taskgraph.transforms.task import task_description_schema
     15 from gecko_taskgraph.util.attributes import copy_attributes_from_dependent_job
     16 from gecko_taskgraph.util.scriptworker import (
     17    generate_beetmover_artifact_map,
     18    generate_beetmover_upstream_artifacts,
     19    get_beetmover_action_scope,
     20    get_beetmover_bucket_scope,
     21 )
     22 
     23 beetmover_checksums_description_schema = Schema({
     24    Optional("label"): str,
     25    Optional("treeherder"): task_description_schema["treeherder"],
     26    Optional("locale"): str,
     27    Optional("shipping-phase"): task_description_schema["shipping-phase"],
     28    Optional("shipping-product"): task_description_schema["shipping-product"],
     29    Optional("attributes"): task_description_schema["attributes"],
     30    Optional("dependencies"): task_description_schema["dependencies"],
     31    Optional("task-from"): task_description_schema["task-from"],
     32    Optional("run-on-repo-type"): task_description_schema["run-on-repo-type"],
     33 })
     34 
     35 transforms = TransformSequence()
     36 
     37 
     38 @transforms.add
     39 def remove_name(config, jobs):
     40    for job in jobs:
     41        if "name" in job:
     42            del job["name"]
     43        yield job
     44 
     45 
     46 transforms.add_validate(beetmover_checksums_description_schema)
     47 
     48 
     49 @transforms.add
     50 def make_beetmover_checksums_description(config, jobs):
     51    for job in jobs:
     52        dep_job = get_primary_dependency(config, job)
     53        assert dep_job
     54 
     55        attributes = dep_job.attributes
     56 
     57        treeherder = job.get("treeherder", {})
     58        treeherder.setdefault("symbol", "BMcss(N)")
     59        dep_th_platform = (
     60            dep_job.task.get("extra", {})
     61            .get("treeherder", {})
     62            .get("machine", {})
     63            .get("platform", "")
     64        )
     65        treeherder.setdefault("platform", f"{dep_th_platform}/opt")
     66        treeherder.setdefault("tier", 1)
     67        treeherder.setdefault("kind", "build")
     68 
     69        label = job["label"]
     70        build_platform = attributes.get("build_platform")
     71 
     72        description = "Beetmover submission of checksums for source file"
     73 
     74        extra = {}
     75        if "devedition" in build_platform:
     76            extra["product"] = "devedition"
     77        else:
     78            extra["product"] = "firefox"
     79 
     80        dependencies = {dep_job.kind: dep_job.label}
     81        for k, v in dep_job.dependencies.items():
     82            if k.startswith("beetmover"):
     83                dependencies[k] = v
     84 
     85        attributes = copy_attributes_from_dependent_job(dep_job)
     86        attributes.update(job.get("attributes", {}))
     87 
     88        bucket_scope = get_beetmover_bucket_scope(config)
     89        action_scope = get_beetmover_action_scope(config)
     90 
     91        task = {
     92            "label": label,
     93            "description": description,
     94            "worker-type": "beetmover",
     95            "scopes": [bucket_scope, action_scope],
     96            "dependencies": dependencies,
     97            "attributes": attributes,
     98            "run-on-projects": dep_job.attributes.get("run_on_projects"),
     99            "run-on-repo-type": job.get("run-on-repo-type", ["git", "hg"]),
    100            "treeherder": treeherder,
    101            "extra": extra,
    102        }
    103 
    104        if "shipping-phase" in job:
    105            task["shipping-phase"] = job["shipping-phase"]
    106 
    107        if "shipping-product" in job:
    108            task["shipping-product"] = job["shipping-product"]
    109 
    110        yield task
    111 
    112 
    113 @transforms.add
    114 def make_beetmover_checksums_worker(config, jobs):
    115    for job in jobs:
    116        valid_beetmover_job = len(job["dependencies"]) == 2
    117        if not valid_beetmover_job:
    118            raise NotImplementedError("Beetmover checksums must have two dependencies.")
    119 
    120        locale = job["attributes"].get("locale")
    121        platform = job["attributes"]["build_platform"]
    122 
    123        refs = {
    124            "beetmover": None,
    125            "signing": None,
    126        }
    127        for dependency in job["dependencies"].keys():
    128            if dependency.startswith("beetmover"):
    129                refs["beetmover"] = f"<{dependency}>"
    130            else:
    131                refs["signing"] = f"<{dependency}>"
    132        if None in refs.values():
    133            raise NotImplementedError(
    134                "Beetmover checksums must have a beetmover and signing dependency!"
    135            )
    136 
    137        worker = {
    138            "implementation": "beetmover",
    139            "release-properties": craft_release_properties(config, job),
    140            "upstream-artifacts": generate_beetmover_upstream_artifacts(
    141                config, job, platform, locale
    142            ),
    143            "artifact-map": generate_beetmover_artifact_map(
    144                config, job, platform=platform
    145            ),
    146        }
    147 
    148        if locale:
    149            worker["locale"] = locale
    150        job["worker"] = worker
    151 
    152        yield job