commit 1bde3c9d3e5b6f873e85c94716a0d4b3ded0c983 parent 5ba8bd1b9b0d6d3379dcebdafac74c262b4386a5 Author: Andrew Halberstadt <ahal@mozilla.com> Date: Fri, 19 Dec 2025 19:09:50 +0000 Bug 2006158 - Pass full set of params into gecko_taskgraph.util.attributes.release_level, r=releng-reviewers,taskgraph-reviewers,jcristau This will allow us to determine release_level at a more granular level in the next commit. Differential Revision: https://phabricator.services.mozilla.com/D276709 Diffstat:
28 files changed, 111 insertions(+), 83 deletions(-)
diff --git a/taskcluster/gecko_taskgraph/actions/release_promotion.py b/taskcluster/gecko_taskgraph/actions/release_promotion.py @@ -282,7 +282,7 @@ def release_promotion_action(parameters, graph_config, input, task_group_id, tas if promotion_config.get("partial-updates", False): partial_updates = input.get("partial_updates", {}) - if not partial_updates and release_level(parameters["project"]) == "production": + if not partial_updates and release_level(parameters) == "production": raise Exception( f"`partial_updates` property needs to be provided for `{release_promotion_flavor}`" "target." diff --git a/taskcluster/gecko_taskgraph/target_tasks.py b/taskcluster/gecko_taskgraph/target_tasks.py @@ -115,7 +115,7 @@ def filter_for_repo_type(task, parameters): def filter_for_project(task, parameters): """Filter tasks by project. Optionally enable nightlies.""" run_on_projects = set(task.attributes.get("run_on_projects", [])) - return match_run_on_projects(parameters["project"], run_on_projects) + return match_run_on_projects(parameters, run_on_projects) def filter_for_hg_branch(task, parameters): diff --git a/taskcluster/gecko_taskgraph/test/test_util_attributes.py b/taskcluster/gecko_taskgraph/test/test_util_attributes.py @@ -16,49 +16,73 @@ from gecko_taskgraph.util.attributes import ( class MatchRunOnProjects(unittest.TestCase): def test_empty(self): - self.assertFalse(match_run_on_projects("birch", [])) + self.assertFalse(match_run_on_projects({"project": "birch"}, [])) def test_all(self): - self.assertTrue(match_run_on_projects("birch", ["all"])) - self.assertTrue(match_run_on_projects("larch", ["all"])) - self.assertTrue(match_run_on_projects("autoland", ["all"])) - self.assertTrue(match_run_on_projects("mozilla-central", ["all"])) - self.assertTrue(match_run_on_projects("mozilla-beta", ["all"])) - self.assertTrue(match_run_on_projects("mozilla-release", ["all"])) + self.assertTrue(match_run_on_projects({"project": "birch"}, ["all"])) + self.assertTrue(match_run_on_projects({"project": "larch"}, ["all"])) + self.assertTrue(match_run_on_projects({"project": "autoland"}, ["all"])) + self.assertTrue(match_run_on_projects({"project": "mozilla-central"}, ["all"])) + self.assertTrue(match_run_on_projects({"project": "mozilla-beta"}, ["all"])) + self.assertTrue(match_run_on_projects({"project": "mozilla-release"}, ["all"])) def test_release(self): - self.assertFalse(match_run_on_projects("birch", ["release"])) - self.assertTrue(match_run_on_projects("larch", ["release"])) - self.assertFalse(match_run_on_projects("autoland", ["release"])) - self.assertTrue(match_run_on_projects("mozilla-central", ["release"])) - self.assertTrue(match_run_on_projects("mozilla-beta", ["release"])) - self.assertTrue(match_run_on_projects("mozilla-release", ["release"])) + self.assertFalse(match_run_on_projects({"project": "birch"}, ["release"])) + self.assertTrue(match_run_on_projects({"project": "larch"}, ["release"])) + self.assertFalse(match_run_on_projects({"project": "autoland"}, ["release"])) + self.assertTrue( + match_run_on_projects({"project": "mozilla-central"}, ["release"]) + ) + self.assertTrue(match_run_on_projects({"project": "mozilla-beta"}, ["release"])) + self.assertTrue( + match_run_on_projects({"project": "mozilla-release"}, ["release"]) + ) def test_integration(self): - self.assertFalse(match_run_on_projects("birch", ["integration"])) - self.assertFalse(match_run_on_projects("larch", ["integration"])) - self.assertTrue(match_run_on_projects("autoland", ["integration"])) - self.assertFalse(match_run_on_projects("mozilla-central", ["integration"])) - self.assertFalse(match_run_on_projects("mozilla-beta", ["integration"])) - self.assertFalse(match_run_on_projects("mozilla-integration", ["integration"])) + self.assertFalse(match_run_on_projects({"project": "birch"}, ["integration"])) + self.assertFalse(match_run_on_projects({"project": "larch"}, ["integration"])) + self.assertTrue(match_run_on_projects({"project": "autoland"}, ["integration"])) + self.assertFalse( + match_run_on_projects({"project": "mozilla-central"}, ["integration"]) + ) + self.assertFalse( + match_run_on_projects({"project": "mozilla-beta"}, ["integration"]) + ) + self.assertFalse( + match_run_on_projects({"project": "mozilla-integration"}, ["integration"]) + ) def test_combo(self): - self.assertTrue(match_run_on_projects("birch", ["release", "birch", "maple"])) - self.assertTrue(match_run_on_projects("larch", ["release", "birch", "maple"])) - self.assertTrue(match_run_on_projects("maple", ["release", "birch", "maple"])) + self.assertTrue( + match_run_on_projects({"project": "birch"}, ["release", "birch", "maple"]) + ) + self.assertTrue( + match_run_on_projects({"project": "larch"}, ["release", "birch", "maple"]) + ) + self.assertTrue( + match_run_on_projects({"project": "maple"}, ["release", "birch", "maple"]) + ) self.assertFalse( - match_run_on_projects("autoland", ["release", "birch", "maple"]) + match_run_on_projects( + {"project": "autoland"}, ["release", "birch", "maple"] + ) ) self.assertTrue( - match_run_on_projects("mozilla-central", ["release", "birch", "maple"]) + match_run_on_projects( + {"project": "mozilla-central"}, ["release", "birch", "maple"] + ) ) self.assertTrue( - match_run_on_projects("mozilla-beta", ["release", "birch", "maple"]) + match_run_on_projects( + {"project": "mozilla-beta"}, ["release", "birch", "maple"] + ) ) self.assertTrue( - match_run_on_projects("mozilla-release", ["release", "birch", "maple"]) + match_run_on_projects( + {"project": "mozilla-release"}, ["release", "birch", "maple"] + ) ) - self.assertTrue(match_run_on_projects("birch", ["birch", "trunk"])) + self.assertTrue(match_run_on_projects({"project": "birch"}, ["birch", "trunk"])) @pytest.mark.parametrize( diff --git a/taskcluster/gecko_taskgraph/transforms/beetmover_geckoview.py b/taskcluster/gecko_taskgraph/transforms/beetmover_geckoview.py @@ -77,7 +77,7 @@ def resolve_keys(config, jobs): job, "bucket-scope", item_name=job["label"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) yield job diff --git a/taskcluster/gecko_taskgraph/transforms/bouncer_aliases.py b/taskcluster/gecko_taskgraph/transforms/bouncer_aliases.py @@ -31,13 +31,13 @@ def make_task_worker(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, "scopes", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, diff --git a/taskcluster/gecko_taskgraph/transforms/bouncer_check.py b/taskcluster/gecko_taskgraph/transforms/bouncer_check.py @@ -71,7 +71,7 @@ def handle_keyed_by(config, jobs): item_name=job["name"], **{ "project": config.params["project"], - "release-level": release_level(config.params["project"]), + "release-level": release_level(config.params), "release-type": config.params["release_type"], }, ) diff --git a/taskcluster/gecko_taskgraph/transforms/bouncer_submission.py b/taskcluster/gecko_taskgraph/transforms/bouncer_submission.py @@ -132,13 +132,13 @@ def make_task_worker(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, "scopes", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, diff --git a/taskcluster/gecko_taskgraph/transforms/bouncer_submission_partners.py b/taskcluster/gecko_taskgraph/transforms/bouncer_submission_partners.py @@ -71,13 +71,13 @@ def make_task_worker(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, "scopes", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, diff --git a/taskcluster/gecko_taskgraph/transforms/build.py b/taskcluster/gecko_taskgraph/transforms/build.py @@ -194,7 +194,7 @@ def resolve_keys(config, jobs): job, "use-sccache", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) yield job @@ -241,7 +241,7 @@ def add_signing_artifacts(config, jobs): """ Add signing artifacts to macOS build jobs. """ - is_prod_project = release_level(config.params["project"]) == "production" + is_prod_project = release_level(config.params) == "production" for job in jobs: if "macosx" not in job["name"] or "searchfox" in job["name"]: # Not macosx build or no artifacts defined, so skip diff --git a/taskcluster/gecko_taskgraph/transforms/hardened_signing.py b/taskcluster/gecko_taskgraph/transforms/hardened_signing.py @@ -34,7 +34,7 @@ def add_hardened_sign_config(config, jobs): dep_job = get_primary_dependency(config, job) assert dep_job - project_level = release_level(config.params["project"]) + project_level = release_level(config.params) is_shippable = dep_job.attributes.get("shippable", False) hardened_signing_type = "developer" @@ -79,7 +79,7 @@ def add_provisioning_profile_config(config, jobs): # Ensure macosx platform and "macosx" in job["attributes"]["build_platform"] # Ensure project is considered production - and release_level(config.params["project"]) == "production" + and release_level(config.params) == "production" # Ensure build is shippable and dep_job.attributes.get("shippable", False) ): diff --git a/taskcluster/gecko_taskgraph/transforms/maybe_release.py b/taskcluster/gecko_taskgraph/transforms/maybe_release.py @@ -18,6 +18,6 @@ def make_task_description(config, jobs): job, key, item_name=job["name"], - **{"release-level": release_level(config.params["project"])} + **{"release-level": release_level(config.params)} ) yield job diff --git a/taskcluster/gecko_taskgraph/transforms/partials.py b/taskcluster/gecko_taskgraph/transforms/partials.py @@ -150,7 +150,7 @@ def make_task_description(config, jobs): "MAR_CHANNEL_ID": attributes["mar-channel-id"], }, } - if release_level(config.params["project"]) == "staging": + if release_level(config.params) == "staging": worker["env"]["FUNSIZE_ALLOW_STAGING_PREFIXES"] = "true" task = { diff --git a/taskcluster/gecko_taskgraph/transforms/partner_repack.py b/taskcluster/gecko_taskgraph/transforms/partner_repack.py @@ -72,7 +72,7 @@ def populate_repack_manifests_url(config, tasks): task, property, property, - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) if task["worker"]["env"]["REPACK_MANIFESTS_URL"].startswith("git@"): diff --git a/taskcluster/gecko_taskgraph/transforms/release_beetmover_signed_addons.py b/taskcluster/gecko_taskgraph/transforms/release_beetmover_signed_addons.py @@ -76,7 +76,7 @@ def resolve_keys(config, jobs): field, item_name=job["label"], **{ - "release-level": release_level(config.params["project"]), + "release-level": release_level(config.params), "release-type": config.params["release_type"], "project": config.params["project"], }, diff --git a/taskcluster/gecko_taskgraph/transforms/release_flatpak_push.py b/taskcluster/gecko_taskgraph/transforms/release_flatpak_push.py @@ -57,9 +57,9 @@ def make_task_description(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) - if release_level(config.params["project"]) == "production": + if release_level(config.params) == "production": job.setdefault("scopes", []).append( add_scope_prefix( config, diff --git a/taskcluster/gecko_taskgraph/transforms/release_generate_checksums.py b/taskcluster/gecko_taskgraph/transforms/release_generate_checksums.py @@ -33,7 +33,7 @@ def handle_keyed_by(config, jobs): item=job, field=field, item_name=job["name"], - **{"release-level": release_level(config.params["project"])} + **{"release-level": release_level(config.params)} ) yield job diff --git a/taskcluster/gecko_taskgraph/transforms/release_mark_as_shipped.py b/taskcluster/gecko_taskgraph/transforms/release_mark_as_shipped.py @@ -19,13 +19,13 @@ def make_task_description(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])} + **{"release-level": release_level(config.params)} ) resolve_keyed_by( job, "scopes", item_name=job["name"], - **{"release-level": release_level(config.params["project"])} + **{"release-level": release_level(config.params)} ) job["worker"]["release-name"] = ( diff --git a/taskcluster/gecko_taskgraph/transforms/release_msix_push.py b/taskcluster/gecko_taskgraph/transforms/release_msix_push.py @@ -59,9 +59,9 @@ def make_task_description(config, jobs): job, "worker-type", item_name=job["name"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) - if release_level(config.params["project"]) == "production": + if release_level(config.params) == "production": job.setdefault("scopes", []).append( add_scope_prefix( config, diff --git a/taskcluster/gecko_taskgraph/transforms/release_sign_and_push_langpacks.py b/taskcluster/gecko_taskgraph/transforms/release_sign_and_push_langpacks.py @@ -68,13 +68,13 @@ def resolve_keys(config, jobs): job, "worker-type", item_name=job["label"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, "scopes", item_name=job["label"], - **{"release-level": release_level(config.params["project"])}, + **{"release-level": release_level(config.params)}, ) resolve_keyed_by( job, diff --git a/taskcluster/gecko_taskgraph/transforms/release_snap_repackage.py b/taskcluster/gecko_taskgraph/transforms/release_snap_repackage.py @@ -29,10 +29,7 @@ def format(config, tasks): env = task.get("worker", {}).get("env", {}) for k in env.keys(): resolve_keyed_by( - env, - k, - "snap envs", - **{"release-level": release_level(config.params["project"])} + env, k, "snap envs", **{"release-level": release_level(config.params)} ) task["worker"]["env"][k] = env[k].format(**format_params) diff --git a/taskcluster/gecko_taskgraph/transforms/release_update_product_channel_version.py b/taskcluster/gecko_taskgraph/transforms/release_update_product_channel_version.py @@ -22,7 +22,7 @@ def make_task_worker(config, jobs): job, "scopes", item_name=job["name"], - **{"release-level": release_level(config.params["project"])} + **{"release-level": release_level(config.params)} ) job["worker"]["product"] = job["shipping-product"] job["worker"]["version"] = config.params["version"] diff --git a/taskcluster/gecko_taskgraph/transforms/repackage_set_upstream_mac_kind.py b/taskcluster/gecko_taskgraph/transforms/repackage_set_upstream_mac_kind.py @@ -35,7 +35,7 @@ def repackage_set_upstream_mac_kind(config, tasks): item_name=config.kind, **{ "build-platform": primary_dep.attributes["build_platform"], - "release-level": release_level(config.params["project"]), + "release-level": release_level(config.params), } ) upstream_mac_kind = task.pop("upstream-mac-kind") diff --git a/taskcluster/gecko_taskgraph/transforms/task.py b/taskcluster/gecko_taskgraph/transforms/task.py @@ -1139,7 +1139,7 @@ def build_balrog_payload(config, task, task_def): task["description"], **{ "release-type": config.params["release_type"], - "release-level": release_level(config.params["project"]), + "release-level": release_level(config.params), "beta-number": beta_number, }, ) diff --git a/taskcluster/gecko_taskgraph/transforms/update_verify_config.py b/taskcluster/gecko_taskgraph/transforms/update_verify_config.py @@ -129,7 +129,7 @@ def add_command(config, tasks): platform=task["attributes"]["build_platform"], **{ "release-type": config.params["release_type"], - "release-level": release_level(config.params["project"]), + "release-level": release_level(config.params), }, ) # ignore things that resolved to null diff --git a/taskcluster/gecko_taskgraph/util/attributes.py b/taskcluster/gecko_taskgraph/util/attributes.py @@ -62,19 +62,22 @@ ALL_PROJECTS = RELEASE_PROMOTION_PROJECTS | TRUNK_PROJECTS | TEMPORARY_PROJECTS RUN_ON_PROJECT_ALIASES = { # key is alias, value is lambda to test it against - "all": lambda project: True, - "integration": lambda project: ( - project in INTEGRATION_PROJECTS or project == "toolchains" + "all": lambda params: True, + "integration": lambda params: ( + params["project"] in INTEGRATION_PROJECTS or params["project"] == "toolchains" ), - "release": lambda project: ( - release_level(project) == "production" or project == "toolchains" + "release": lambda params: ( + release_level(params) == "production" or params["project"] == "toolchains" ), - "trunk": lambda project: (project in TRUNK_PROJECTS or project == "toolchains"), - "trunk-only": lambda project: project in TRUNK_PROJECTS, - "autoland": lambda project: project in ("autoland", "toolchains"), - "autoland-only": lambda project: project == "autoland", - "mozilla-central": lambda project: project in ("mozilla-central", "toolchains"), - "mozilla-central-only": lambda project: project == "mozilla-central", + "trunk": lambda params: ( + params["project"] in TRUNK_PROJECTS or params["project"] == "toolchains" + ), + "trunk-only": lambda params: params["project"] in TRUNK_PROJECTS, + "autoland": lambda params: params["project"] in ("autoland", "toolchains"), + "autoland-only": lambda params: params["project"] == "autoland", + "mozilla-central": lambda params: params["project"] + in ("mozilla-central", "toolchains"), + "mozilla-central-only": lambda params: params["project"] == "mozilla-central", } _COPYABLE_ATTRIBUTES = ( @@ -98,17 +101,17 @@ _COPYABLE_ATTRIBUTES = ( ) -def match_run_on_projects(project, run_on_projects): +def match_run_on_projects(params, run_on_projects): """Determine whether the given project is included in the `run-on-projects` parameter, applying expansions for things like "integration" mentioned in the attribute documentation.""" aliases = RUN_ON_PROJECT_ALIASES.keys() run_aliases = set(aliases) & set(run_on_projects) if run_aliases: - if any(RUN_ON_PROJECT_ALIASES[alias](project) for alias in run_aliases): + if any(RUN_ON_PROJECT_ALIASES[alias](params) for alias in run_aliases): return True - return project in run_on_projects + return params["project"] in run_on_projects def match_run_on_hg_branches(hg_branch, run_on_hg_branches): @@ -141,13 +144,13 @@ def sorted_unique_list(*args): return sorted(combined) -def release_level(project): +def release_level(params): """ Whether this is a staging release or not. :return str: One of "production" or "staging". """ - return "production" if project in RELEASE_PROJECTS else "staging" + return "production" if params.get("project") in RELEASE_PROJECTS else "staging" def is_try(params): diff --git a/taskcluster/gecko_taskgraph/util/partners.py b/taskcluster/gecko_taskgraph/util/partners.py @@ -465,7 +465,7 @@ def get_partner_url_config(parameters, graph_config): partner_url_config = deepcopy(graph_config["partner-urls"]) substitutions = { "release-product": parameters["release_product"], - "release-level": release_level(parameters["project"]), + "release-level": release_level(parameters), "release-type": parameters["release_type"], } resolve_keyed_by( @@ -545,7 +545,7 @@ def apply_partner_priority(config, jobs): config.kind.startswith( ("release-partner-repack", "release-partner-attribution") ) - and release_level(config.params["project"]) == "production" + and release_level(config.params) == "production" ): priority = "medium" for job in jobs: diff --git a/taskcluster/gecko_taskgraph/util/workertypes.py b/taskcluster/gecko_taskgraph/util/workertypes.py @@ -97,7 +97,7 @@ def get_worker_type(graph_config, parameters, worker_type): graph_config, worker_type, parameters["level"], - _release_level(parameters.get("project")), + _release_level(parameters), parameters.get("project"), ) return worker_config["provisioner"], worker_config["worker-type"] diff --git a/tools/lint/perfdocs/framework_gatherers.py b/tools/lint/perfdocs/framework_gatherers.py @@ -412,7 +412,9 @@ class RaptorGatherer(FrameworkGatherer): values += [ ( "\u2705" - if match_run_on_projects(x, task["run_on_projects"]) + if match_run_on_projects( + {"project": x}, task["run_on_projects"] + ) else "\u274C" ) for x in BRANCHES @@ -630,7 +632,9 @@ class TalosGatherer(FrameworkGatherer): values += [ ( "\u2705" - if match_run_on_projects(x, task["run_on_projects"]) + if match_run_on_projects( + {"project": x}, task["run_on_projects"] + ) else "\u274C" ) for x in BRANCHES