no bug - Bumping Firefox l10n changesets r=release a=l10n-bump DONTBUILD CLOSED TREE
[gecko.git] / taskcluster / gecko_taskgraph / target_tasks.py
blobfcbfab4e176ab110ae277f88060d62be6a06a57f
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/.
6 import itertools
7 import logging
8 import os
9 import re
10 from datetime import datetime, timedelta
12 from redo import retry
13 from taskgraph.parameters import Parameters
14 from taskgraph.target_tasks import _target_task, get_method
15 from taskgraph.util.taskcluster import find_task_id
17 from gecko_taskgraph import GECKO, try_option_syntax
18 from gecko_taskgraph.util.attributes import (
19 match_run_on_hg_branches,
20 match_run_on_projects,
22 from gecko_taskgraph.util.hg import find_hg_revision_push_info, get_hg_commit_message
23 from gecko_taskgraph.util.platforms import platform_family
25 logger = logging.getLogger(__name__)
28 # Some tasks show up in the target task set, but are possibly special cases,
29 # uncommon tasks, or tasks running against limited hardware set that they
30 # should only be selectable with --full.
31 UNCOMMON_TRY_TASK_LABELS = [
32 # Platforms and/or Build types
33 r"build-.*-gcp", # Bug 1631990
34 r"mingwclang", # Bug 1631990
35 r"valgrind", # Bug 1631990
36 # Android tasks
37 r"android-geckoview-docs",
38 r"android-hw",
39 # Windows tasks
40 r"windows10-64-ref-hw",
41 r"windows10-aarch64-qr",
42 # Linux tasks
43 r"linux-", # hide all linux32 tasks by default - bug 1599197
44 r"linux1804-32", # hide linux32 tests - bug 1599197
45 # Test tasks
46 r"web-platform-tests.*backlog", # hide wpt jobs that are not implemented yet - bug 1572820
47 r"-ccov",
48 r"-profiling-", # talos/raptor profiling jobs are run too often
49 r"-32-.*-webgpu", # webgpu gets little benefit from these tests.
50 r"-asan-.*-webgpu",
51 r"-tsan-.*-webgpu",
52 # Hide shippable versions of tests we have opt versions of because the non-shippable
53 # versions are faster to run. This is mostly perf tests.
54 r"-shippable(?!.*(awsy|browsertime|marionette-headless|mochitest-devtools-chrome-fis|raptor|talos|web-platform-tests-wdspec-headless|mochitest-plain-headless))", # noqa - too long
58 def index_exists(index_path, reason=""):
59 print(f"Looking for existing index {index_path} {reason}...")
60 try:
61 task_id = find_task_id(index_path)
62 print(f"Index {index_path} exists: taskId {task_id}")
63 return True
64 except KeyError:
65 print(f"Index {index_path} doesn't exist.")
66 return False
69 def filter_out_shipping_phase(task, parameters):
70 return (
71 # nightly still here because of geckodriver
72 not task.attributes.get("nightly")
73 and task.attributes.get("shipping_phase") in (None, "build")
77 def filter_out_devedition(task, parameters):
78 return not task.attributes.get("shipping_product") == "devedition"
81 def filter_out_cron(task, parameters):
82 """
83 Filter out tasks that run via cron.
84 """
85 return not task.attributes.get("cron")
88 def filter_for_project(task, parameters):
89 """Filter tasks by project. Optionally enable nightlies."""
90 run_on_projects = set(task.attributes.get("run_on_projects", []))
91 return match_run_on_projects(parameters["project"], run_on_projects)
94 def filter_for_hg_branch(task, parameters):
95 """Filter tasks by hg branch.
96 If `run_on_hg_branch` is not defined, then task runs on all branches"""
97 run_on_hg_branches = set(task.attributes.get("run_on_hg_branches", ["all"]))
98 return match_run_on_hg_branches(parameters["hg_branch"], run_on_hg_branches)
101 def filter_on_platforms(task, platforms):
102 """Filter tasks on the given platform"""
103 platform = task.attributes.get("build_platform")
104 return platform in platforms
107 def filter_by_uncommon_try_tasks(task, optional_filters=None):
108 """Filters tasks that should not be commonly run on try.
110 Args:
111 task (str): String representing the task name.
112 optional_filters (list, optional):
113 Additional filters to apply to task filtering.
115 Returns:
116 (Boolean): True if task does not match any known filters.
117 False otherwise.
119 filters = UNCOMMON_TRY_TASK_LABELS
120 if optional_filters:
121 filters = itertools.chain(filters, optional_filters)
123 return not any(re.search(pattern, task) for pattern in filters)
126 def filter_by_regex(task_label, regexes, mode="include"):
127 """Filters tasks according to a list of pre-compiled reguar expressions.
129 If mode is "include", a task label must match any regex to pass.
130 If it is "exclude", a task label must _not_ match any regex to pass.
132 if not regexes:
133 return True
135 assert mode in ["include", "exclude"]
137 any_match = any(r.search(task_label) for r in regexes)
138 if any_match:
139 return mode == "include"
140 return mode != "include"
143 def filter_release_tasks(task, parameters):
144 platform = task.attributes.get("build_platform")
145 if platform in (
146 "linux",
147 "linux64",
148 "macosx64",
149 "win32",
150 "win64",
151 "win64-aarch64",
153 if task.attributes["kind"] == "l10n":
154 # This is on-change l10n
155 return True
156 if (
157 task.attributes["build_type"] == "opt"
158 and task.attributes.get("unittest_suite") != "talos"
159 and task.attributes.get("unittest_suite") != "raptor"
161 return False
163 if task.attributes.get("shipping_phase") not in (None, "build"):
164 return False
166 """ No debug on release, keep on ESR with 4 week cycles, release
167 will not be too different from central, but ESR will live for a long time.
169 From June 2019 -> June 2020, we found 1 unique regression on ESR debug
170 and 5 unique regressions on beta/release. Keeping spidermonkey and linux
171 debug finds all but 1 unique regressions (windows found on try) for beta/release.
173 ...but debug-only failures started showing up on ESR (esr-91, esr-102) so
174 desktop debug tests were added back for beta.
176 build_type = task.attributes.get("build_type", "")
177 build_platform = task.attributes.get("build_platform", "")
178 test_platform = task.attributes.get("test_platform", "")
180 if parameters["release_type"].startswith("esr") or (
181 parameters["release_type"] == "beta" and "android" not in build_platform
183 return True
185 # code below here is intended to reduce release debug tasks
186 if task.kind == "hazard" or "toolchain" in build_platform:
187 # keep hazard and toolchain builds around
188 return True
190 if build_type == "debug":
191 if "linux" not in build_platform:
192 # filter out windows/mac/android
193 return False
194 if task.kind not in ["spidermonkey"] and "-qr" in test_platform:
195 # filter out linux-qr tests, leave spidermonkey
196 return False
197 if "64" not in build_platform:
198 # filter out linux32 builds
199 return False
201 # webrender-android-*-debug doesn't have attributes to find 'debug', using task.label.
202 if task.kind == "webrender" and "debug" in task.label:
203 return False
204 return True
207 def filter_out_missing_signoffs(task, parameters):
208 for signoff in parameters["required_signoffs"]:
209 if signoff not in parameters["signoff_urls"] and signoff in task.attributes.get(
210 "required_signoffs", []
212 return False
213 return True
216 def filter_tests_without_manifests(task, parameters):
217 """Remove test tasks that have an empty 'test_manifests' attribute.
219 This situation can arise when the test loader (e.g bugbug) decided there
220 weren't any important manifests to run for the given push. We filter tasks
221 out here rather than in the transforms so that the full task graph is still
222 aware that the task exists (which is needed by the backfill action).
224 if (
225 task.kind == "test"
226 and "test_manifests" in task.attributes
227 and not task.attributes["test_manifests"]
229 return False
230 return True
233 def standard_filter(task, parameters):
234 return all(
235 filter_func(task, parameters)
236 for filter_func in (
237 filter_out_cron,
238 filter_for_project,
239 filter_for_hg_branch,
240 filter_tests_without_manifests,
245 def accept_raptor_android_build(platform):
246 """Helper function for selecting the correct android raptor builds."""
247 if "android" not in platform:
248 return False
249 if "shippable" not in platform:
250 return False
251 if "p5" in platform and "aarch64" in platform:
252 return False
253 if "p6" in platform and "aarch64" in platform:
254 return True
255 if "s21" in platform and "aarch64" in platform:
256 return True
257 if "a51" in platform:
258 return True
259 return False
262 def accept_raptor_desktop_build(platform):
263 """Helper function for selecting correct desktop raptor builds."""
264 if "android" in platform:
265 return False
266 # ignore all windows 7 perf jobs scheduled automatically
267 if "windows7" in platform or "windows10-32" in platform:
268 return False
269 # Completely ignore all non-shippable platforms
270 if "shippable" in platform:
271 return True
272 return False
275 def accept_awsy_task(try_name, platform):
276 if accept_raptor_desktop_build(platform):
277 if "windows" in platform and "windows11-64" not in platform:
278 return False
279 if "dmd" in try_name:
280 return False
281 if "awsy-base" in try_name:
282 return True
283 if "awsy-tp6" in try_name:
284 return True
285 return False
288 def filter_unsupported_artifact_builds(task, parameters):
289 try_config = parameters.get("try_task_config", {})
290 if not try_config.get("use-artifact-builds", False):
291 return True
293 supports_artifact_builds = task.attributes.get("supports-artifact-builds", True)
294 return supports_artifact_builds
297 def filter_out_shippable(task):
298 return not task.attributes.get("shippable", False)
301 def _try_task_config(full_task_graph, parameters, graph_config):
302 requested_tasks = parameters["try_task_config"]["tasks"]
303 pattern_tasks = [x for x in requested_tasks if x.endswith("-*")]
304 tasks = list(set(requested_tasks) - set(pattern_tasks))
305 matched_tasks = []
306 missing = set()
307 for pattern in pattern_tasks:
308 found = [
310 for t in full_task_graph.graph.nodes
311 if t.split(pattern.replace("*", ""))[-1].isnumeric()
313 if found:
314 matched_tasks.extend(found)
315 else:
316 missing.add(pattern)
318 if "MOZHARNESS_TEST_PATHS" in parameters["try_task_config"].get("env", {}):
319 matched_tasks = [x for x in matched_tasks if x.endswith("-1")]
321 selected_tasks = set(tasks) | set(matched_tasks)
322 missing.update(selected_tasks - set(full_task_graph.tasks))
324 if missing:
325 missing_str = "\n ".join(sorted(missing))
326 logger.warning(
327 f"The following tasks were requested but do not exist in the full task graph and will be skipped:\n {missing_str}"
329 return list(selected_tasks - missing)
332 def _try_option_syntax(full_task_graph, parameters, graph_config):
333 """Generate a list of target tasks based on try syntax in
334 parameters['message'] and, for context, the full task graph."""
335 options = try_option_syntax.TryOptionSyntax(
336 parameters, full_task_graph, graph_config
338 target_tasks_labels = [
339 t.label
340 for t in full_task_graph.tasks.values()
341 if options.task_matches(t)
342 and filter_by_uncommon_try_tasks(t.label)
343 and filter_unsupported_artifact_builds(t, parameters)
346 attributes = {
347 k: getattr(options, k)
348 for k in [
349 "no_retry",
350 "tag",
354 for l in target_tasks_labels:
355 task = full_task_graph[l]
356 if "unittest_suite" in task.attributes:
357 task.attributes["task_duplicates"] = options.trigger_tests
359 for l in target_tasks_labels:
360 task = full_task_graph[l]
361 # If the developer wants test jobs to be rebuilt N times we add that value here
362 if options.trigger_tests > 1 and "unittest_suite" in task.attributes:
363 task.attributes["task_duplicates"] = options.trigger_tests
365 # If the developer wants test talos jobs to be rebuilt N times we add that value here
366 if (
367 options.talos_trigger_tests > 1
368 and task.attributes.get("unittest_suite") == "talos"
370 task.attributes["task_duplicates"] = options.talos_trigger_tests
372 # If the developer wants test raptor jobs to be rebuilt N times we add that value here
373 if (
374 options.raptor_trigger_tests
375 and options.raptor_trigger_tests > 1
376 and task.attributes.get("unittest_suite") == "raptor"
378 task.attributes["task_duplicates"] = options.raptor_trigger_tests
380 task.attributes.update(attributes)
382 # Add notifications here as well
383 if options.notifications:
384 for task in full_task_graph:
385 owner = parameters.get("owner")
386 routes = task.task.setdefault("routes", [])
387 if options.notifications == "all":
388 routes.append(f"notify.email.{owner}.on-any")
389 elif options.notifications == "failure":
390 routes.append(f"notify.email.{owner}.on-failed")
391 routes.append(f"notify.email.{owner}.on-exception")
393 return target_tasks_labels
396 @_target_task("try_tasks")
397 def target_tasks_try(full_task_graph, parameters, graph_config):
398 try_mode = parameters["try_mode"]
399 if try_mode == "try_task_config":
400 return _try_task_config(full_task_graph, parameters, graph_config)
401 if try_mode == "try_option_syntax":
402 return _try_option_syntax(full_task_graph, parameters, graph_config)
403 # With no try mode, we schedule nothing, allowing the user to add tasks
404 # later via treeherder.
405 return []
408 @_target_task("try_select_tasks")
409 def target_tasks_try_select(full_task_graph, parameters, graph_config):
410 tasks = target_tasks_try_select_uncommon(full_task_graph, parameters, graph_config)
411 return [l for l in tasks if filter_by_uncommon_try_tasks(l)]
414 @_target_task("try_select_tasks_uncommon")
415 def target_tasks_try_select_uncommon(full_task_graph, parameters, graph_config):
416 from gecko_taskgraph.decision import PER_PROJECT_PARAMETERS
418 projects = ("autoland", "mozilla-central")
419 if parameters["project"] not in projects:
420 projects = (parameters["project"],)
422 tasks = set()
423 for project in projects:
424 params = dict(parameters)
425 params["project"] = project
426 parameters = Parameters(**params)
428 try:
429 target_tasks_method = PER_PROJECT_PARAMETERS[project]["target_tasks_method"]
430 except KeyError:
431 target_tasks_method = "default"
433 tasks.update(
434 get_method(target_tasks_method)(full_task_graph, parameters, graph_config)
437 return sorted(tasks)
440 @_target_task("try_auto")
441 def target_tasks_try_auto(full_task_graph, parameters, graph_config):
442 """Target the tasks which have indicated they should be run on autoland
443 (rather than try) via the `run_on_projects` attributes.
445 Should do the same thing as the `default` target tasks method.
447 params = dict(parameters)
448 params["project"] = "autoland"
449 parameters = Parameters(**params)
451 regex_filters = parameters["try_task_config"].get("tasks-regex")
452 include_regexes = exclude_regexes = []
453 if regex_filters:
454 include_regexes = [re.compile(r) for r in regex_filters.get("include", [])]
455 exclude_regexes = [re.compile(r) for r in regex_filters.get("exclude", [])]
457 return [
459 for l, t in full_task_graph.tasks.items()
460 if standard_filter(t, parameters)
461 and filter_out_shipping_phase(t, parameters)
462 and filter_out_devedition(t, parameters)
463 and filter_by_uncommon_try_tasks(t.label)
464 and filter_by_regex(t.label, include_regexes, mode="include")
465 and filter_by_regex(t.label, exclude_regexes, mode="exclude")
466 and filter_unsupported_artifact_builds(t, parameters)
467 and filter_out_shippable(t)
471 @_target_task("default")
472 def target_tasks_default(full_task_graph, parameters, graph_config):
473 """Target the tasks which have indicated they should be run on this project
474 via the `run_on_projects` attributes."""
475 return [
477 for l, t in full_task_graph.tasks.items()
478 if standard_filter(t, parameters)
479 and filter_out_shipping_phase(t, parameters)
480 and filter_out_devedition(t, parameters)
484 @_target_task("autoland_tasks")
485 def target_tasks_autoland(full_task_graph, parameters, graph_config):
486 """In addition to doing the filtering by project that the 'default'
487 filter does, also remove any tests running against shippable builds
488 for non-backstop pushes."""
489 filtered_for_project = target_tasks_default(
490 full_task_graph, parameters, graph_config
493 def filter(task):
494 if task.kind != "test":
495 return True
497 if parameters["backstop"]:
498 return True
500 build_type = task.attributes.get("build_type")
502 if not build_type or build_type != "opt" or filter_out_shippable(task):
503 return True
505 return False
507 return [l for l in filtered_for_project if filter(full_task_graph[l])]
510 @_target_task("mozilla_central_tasks")
511 def target_tasks_mozilla_central(full_task_graph, parameters, graph_config):
512 """In addition to doing the filtering by project that the 'default'
513 filter does, also remove any tests running against regular (aka not shippable,
514 asan, etc.) opt builds."""
515 filtered_for_project = target_tasks_default(
516 full_task_graph, parameters, graph_config
519 def filter(task):
520 if task.kind != "test":
521 return True
523 build_platform = task.attributes.get("build_platform")
524 build_type = task.attributes.get("build_type")
525 shippable = task.attributes.get("shippable", False)
527 if not build_platform or not build_type:
528 return True
530 family = platform_family(build_platform)
531 # We need to know whether this test is against a "regular" opt build
532 # (which is to say, not shippable, asan, tsan, or any other opt build
533 # with other properties). There's no positive test for this, so we have to
534 # do it somewhat hackily. Android doesn't have variants other than shippable
535 # so it is pretty straightforward to check for. Other platforms have many
536 # variants, but none of the regular opt builds we're looking for have a "-"
537 # in their platform name, so this works (for now).
538 is_regular_opt = (
539 family == "android" and not shippable
540 ) or "-" not in build_platform
542 if build_type != "opt" or not is_regular_opt:
543 return True
545 return False
547 return [l for l in filtered_for_project if filter(full_task_graph[l])]
550 @_target_task("graphics_tasks")
551 def target_tasks_graphics(full_task_graph, parameters, graph_config):
552 """In addition to doing the filtering by project that the 'default'
553 filter does, also remove artifact builds because we have csets on
554 the graphics branch that aren't on the candidate branches of artifact
555 builds"""
556 filtered_for_project = target_tasks_default(
557 full_task_graph, parameters, graph_config
560 def filter(task):
561 if task.attributes["kind"] == "artifact-build":
562 return False
563 return True
565 return [l for l in filtered_for_project if filter(full_task_graph[l])]
568 @_target_task("mozilla_beta_tasks")
569 def target_tasks_mozilla_beta(full_task_graph, parameters, graph_config):
570 """Select the set of tasks required for a promotable beta or release build
571 of desktop, plus android CI. The candidates build process involves a pipeline
572 of builds and signing, but does not include beetmover or balrog jobs."""
574 return [
576 for l, t in full_task_graph.tasks.items()
577 if filter_release_tasks(t, parameters) and standard_filter(t, parameters)
581 @_target_task("mozilla_release_tasks")
582 def target_tasks_mozilla_release(full_task_graph, parameters, graph_config):
583 """Select the set of tasks required for a promotable beta or release build
584 of desktop, plus android CI. The candidates build process involves a pipeline
585 of builds and signing, but does not include beetmover or balrog jobs."""
587 return [
589 for l, t in full_task_graph.tasks.items()
590 if filter_release_tasks(t, parameters) and standard_filter(t, parameters)
594 @_target_task("mozilla_esr115_tasks")
595 def target_tasks_mozilla_esr115(full_task_graph, parameters, graph_config):
596 """Select the set of tasks required for a promotable beta or release build
597 of desktop, without android CI. The candidates build process involves a pipeline
598 of builds and signing, but does not include beetmover or balrog jobs."""
600 def filter(task):
601 if not filter_release_tasks(task, parameters):
602 return False
604 if not standard_filter(task, parameters):
605 return False
607 platform = task.attributes.get("build_platform")
609 # Android is not built on esr115.
610 if platform and "android" in platform:
611 return False
613 return True
615 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
618 @_target_task("promote_desktop")
619 def target_tasks_promote_desktop(full_task_graph, parameters, graph_config):
620 """Select the superset of tasks required to promote a beta or release build
621 of a desktop product. This should include all non-android
622 mozilla_{beta,release} tasks, plus l10n, beetmover, balrog, etc."""
624 def filter(task):
625 # Bug 1758507 - geckoview ships in the promote phase
626 if not parameters["release_type"].startswith("esr") and is_geckoview(
627 task, parameters
629 return True
631 if task.attributes.get("shipping_product") != parameters["release_product"]:
632 return False
634 # 'secondary' balrog/update verify/final verify tasks only run for RCs
635 if parameters.get("release_type") != "release-rc":
636 if "secondary" in task.kind:
637 return False
639 if not filter_out_missing_signoffs(task, parameters):
640 return False
642 if task.attributes.get("shipping_phase") == "promote":
643 return True
645 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
648 def is_geckoview(task, parameters):
649 return (
650 task.attributes.get("shipping_product") == "fennec"
651 and task.kind in ("beetmover-geckoview", "upload-symbols")
652 and parameters["release_product"] == "firefox"
656 @_target_task("push_desktop")
657 def target_tasks_push_desktop(full_task_graph, parameters, graph_config):
658 """Select the set of tasks required to push a build of desktop to cdns.
659 Previous build deps will be optimized out via action task."""
660 filtered_for_candidates = target_tasks_promote_desktop(
661 full_task_graph,
662 parameters,
663 graph_config,
666 def filter(task):
667 if not filter_out_missing_signoffs(task, parameters):
668 return False
669 # Include promotion tasks; these will be optimized out
670 if task.label in filtered_for_candidates:
671 return True
673 if (
674 task.attributes.get("shipping_product") == parameters["release_product"]
675 and task.attributes.get("shipping_phase") == "push"
677 return True
679 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
682 @_target_task("ship_desktop")
683 def target_tasks_ship_desktop(full_task_graph, parameters, graph_config):
684 """Select the set of tasks required to ship desktop.
685 Previous build deps will be optimized out via action task."""
686 is_rc = parameters.get("release_type") == "release-rc"
687 if is_rc:
688 # ship_firefox_rc runs after `promote` rather than `push`; include
689 # all promote tasks.
690 filtered_for_candidates = target_tasks_promote_desktop(
691 full_task_graph,
692 parameters,
693 graph_config,
695 else:
696 # ship_firefox runs after `push`; include all push tasks.
697 filtered_for_candidates = target_tasks_push_desktop(
698 full_task_graph,
699 parameters,
700 graph_config,
703 def filter(task):
704 if not filter_out_missing_signoffs(task, parameters):
705 return False
706 # Include promotion tasks; these will be optimized out
707 if task.label in filtered_for_candidates:
708 return True
710 if (
711 task.attributes.get("shipping_product") != parameters["release_product"]
712 or task.attributes.get("shipping_phase") != "ship"
714 return False
716 if "secondary" in task.kind:
717 return is_rc
718 return not is_rc
720 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
723 @_target_task("pine_tasks")
724 def target_tasks_pine(full_task_graph, parameters, graph_config):
725 """Bug 1879960 - no reftests or wpt needed"""
726 filtered_for_project = target_tasks_default(
727 full_task_graph, parameters, graph_config
730 def filter(task):
731 suite = task.attributes.get("unittest_suite", "")
732 if "reftest" in suite or "web-platform" in suite:
733 return False
734 return True
736 return [l for l in filtered_for_project if filter(full_task_graph[l])]
739 @_target_task("larch_tasks")
740 def target_tasks_larch(full_task_graph, parameters, graph_config):
741 """Bug 1879213 - only run necessary tasks on larch"""
742 filtered_for_project = target_tasks_default(
743 full_task_graph, parameters, graph_config
746 def filter(task):
747 # no localized builds, no android
748 if (
749 "l10n" in task.kind
750 or "msix" in task.kind
751 or "android" in task.attributes.get("build_platform", "")
752 or (task.kind == "test" and "msix" in task.label)
754 return False
755 # otherwise reduce tests only
756 if task.kind != "test":
757 return True
758 return "browser-chrome" in task.label or "xpcshell" in task.label
760 return [l for l in filtered_for_project if filter(full_task_graph[l])]
763 @_target_task("kaios_tasks")
764 def target_tasks_kaios(full_task_graph, parameters, graph_config):
765 """The set of tasks to run for kaios integration"""
767 def filter(task):
768 # We disable everything in central, and adjust downstream.
769 return False
771 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
774 @_target_task("ship_geckoview")
775 def target_tasks_ship_geckoview(full_task_graph, parameters, graph_config):
776 """Select the set of tasks required to ship geckoview nightly. The
777 nightly build process involves a pipeline of builds and an upload to
778 maven.mozilla.org."""
779 index_path = (
780 f"{graph_config['trust-domain']}.v2.{parameters['project']}.revision."
781 f"{parameters['head_rev']}.taskgraph.decision-ship-geckoview"
783 if os.environ.get("MOZ_AUTOMATION") and retry(
784 index_exists,
785 args=(index_path,),
786 kwargs={
787 "reason": "to avoid triggering multiple nightlies off the same revision",
790 return []
792 def filter(task):
793 # XXX Starting 69, we don't ship Fennec Nightly anymore. We just want geckoview to be
794 # uploaded
795 return task.attributes.get("shipping_product") == "fennec" and task.kind in (
796 "beetmover-geckoview",
797 "upload-symbols",
800 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
803 @_target_task("custom-car_perf_testing")
804 def target_tasks_custom_car_perf_testing(full_task_graph, parameters, graph_config):
805 """Select tasks required for running daily performance tests for custom chromium-as-release."""
807 def filter(task):
808 platform = task.attributes.get("test_platform")
809 attributes = task.attributes
810 if attributes.get("unittest_suite") != "raptor":
811 return False
813 try_name = attributes.get("raptor_try_name")
815 # Desktop and Android selection for CaR
816 if accept_raptor_desktop_build(platform) or accept_raptor_android_build(
817 platform
819 if "browsertime" in try_name and (
820 "custom-car" in try_name or "cstm-car-m" in try_name
822 if "hw-s21" in platform and "speedometer3" not in try_name:
823 return False
824 return True
825 return False
827 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
830 @_target_task("general_perf_testing")
831 def target_tasks_general_perf_testing(full_task_graph, parameters, graph_config):
833 Select tasks required for running performance tests 3 times a week.
836 def filter(task):
837 platform = task.attributes.get("test_platform")
838 attributes = task.attributes
839 if attributes.get("unittest_suite") != "raptor":
840 return False
842 try_name = attributes.get("raptor_try_name")
844 if "tp6-bench" in try_name:
845 return False
847 # Bug 1867669 - Temporarily disable all live site tests
848 if "live" in try_name and "sheriffed" not in try_name:
849 return False
851 # Desktop selection
852 if accept_raptor_desktop_build(platform):
853 # Select some browsertime tasks as desktop smoke-tests
854 if "browsertime" in try_name:
855 if "chrome" in try_name:
856 if "tp6" in try_name and "essential" not in try_name:
857 return False
858 return True
859 if "chromium" in try_name:
860 if "tp6" in try_name and "essential" not in try_name:
861 return False
862 return True
863 # chromium-as-release has it's own cron
864 if "custom-car" in try_name:
865 return False
866 if "-live" in try_name:
867 return True
868 if "-fis" in try_name:
869 return False
870 if "linux" in platform:
871 if "speedometer" in try_name:
872 return True
873 if "safari" and "benchmark" in try_name:
874 return True
875 # Android selection
876 elif accept_raptor_android_build(platform):
877 if "hw-s21" in platform and "speedometer3" not in try_name:
878 return False
879 if "chrome-m" in try_name and (
880 ("ebay" in try_name and "live" not in try_name)
881 or (
882 "live" in try_name
883 and ("facebook" in try_name or "dailymail" in try_name)
886 return False
887 # Ignore all fennec tests here, we run those weekly
888 if "fennec" in try_name:
889 return False
890 # Only run webrender tests
891 if "chrome-m" not in try_name and "-qr" not in platform:
892 return False
893 # Select live site tests
894 if "-live" in try_name:
895 return True
896 # Select fenix resource usage tests
897 if "fenix" in try_name:
898 # Bug 1816421 disable fission perf tests
899 if "-fis" in try_name:
900 return False
901 if "-power" in try_name:
902 return True
903 # Select geckoview resource usage tests
904 if "geckoview" in try_name:
905 # Bug 1816421 disable fission perf tests
906 if "-fis" in try_name:
907 return False
908 # Run cpu+memory, and power tests
909 cpu_n_memory_task = "-cpu" in try_name and "-memory" in try_name
910 power_task = "-power" in try_name
911 # Ignore cpu+memory+power tests
912 if power_task and cpu_n_memory_task:
913 return False
914 if cpu_n_memory_task:
915 return False
916 if power_task:
917 return "browsertime" in try_name
918 # Select browsertime-specific tests
919 if "browsertime" in try_name:
920 # Don't run android CaR sp tests as we already have a cron for this.
921 if "m-car" in try_name:
922 return False
923 if "speedometer" in try_name:
924 return True
925 return False
927 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
930 def make_desktop_nightly_filter(platforms):
931 """Returns a filter that gets all nightly tasks on the given platform."""
933 def filter(task, parameters):
934 return all(
936 filter_on_platforms(task, platforms),
937 filter_for_project(task, parameters),
938 task.attributes.get("shippable", False),
939 # Tests and nightly only builds don't have `shipping_product` set
940 task.attributes.get("shipping_product")
941 in {None, "firefox", "thunderbird"},
942 task.kind not in {"l10n"}, # no on-change l10n
946 return filter
949 @_target_task("sp-perftests")
950 def target_tasks_speedometer_tests(full_task_graph, parameters, graph_config):
951 def filter(task):
952 platform = task.attributes.get("test_platform")
953 attributes = task.attributes
954 if attributes.get("unittest_suite") != "raptor":
955 return False
957 if accept_raptor_desktop_build(platform) or accept_raptor_android_build(
958 platform
960 try_name = attributes.get("raptor_try_name")
961 if "hw-s21" in platform and "speedometer3" not in try_name:
962 return False
963 if (
964 "browsertime" in try_name
965 and "speedometer" in try_name
966 and "chrome" in try_name
968 return True
970 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
973 @_target_task("nightly_linux")
974 def target_tasks_nightly_linux(full_task_graph, parameters, graph_config):
975 """Select the set of tasks required for a nightly build of linux. The
976 nightly build process involves a pipeline of builds, signing,
977 and, eventually, uploading the tasks to balrog."""
978 filter = make_desktop_nightly_filter(
979 {"linux64-shippable", "linux-shippable", "linux-aarch64-shippable"}
981 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
984 @_target_task("nightly_macosx")
985 def target_tasks_nightly_macosx(full_task_graph, parameters, graph_config):
986 """Select the set of tasks required for a nightly build of macosx. The
987 nightly build process involves a pipeline of builds, signing,
988 and, eventually, uploading the tasks to balrog."""
989 filter = make_desktop_nightly_filter({"macosx64-shippable"})
990 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
993 @_target_task("nightly_win32")
994 def target_tasks_nightly_win32(full_task_graph, parameters, graph_config):
995 """Select the set of tasks required for a nightly build of win32 and win64.
996 The nightly build process involves a pipeline of builds, signing,
997 and, eventually, uploading the tasks to balrog."""
998 filter = make_desktop_nightly_filter({"win32-shippable"})
999 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
1002 @_target_task("nightly_win64")
1003 def target_tasks_nightly_win64(full_task_graph, parameters, graph_config):
1004 """Select the set of tasks required for a nightly build of win32 and win64.
1005 The nightly build process involves a pipeline of builds, signing,
1006 and, eventually, uploading the tasks to balrog."""
1007 filter = make_desktop_nightly_filter({"win64-shippable"})
1008 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
1011 @_target_task("nightly_win64_aarch64")
1012 def target_tasks_nightly_win64_aarch64(full_task_graph, parameters, graph_config):
1013 """Select the set of tasks required for a nightly build of win32 and win64.
1014 The nightly build process involves a pipeline of builds, signing,
1015 and, eventually, uploading the tasks to balrog."""
1016 filter = make_desktop_nightly_filter({"win64-aarch64-shippable"})
1017 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
1020 @_target_task("nightly_asan")
1021 def target_tasks_nightly_asan(full_task_graph, parameters, graph_config):
1022 """Select the set of tasks required for a nightly build of asan. The
1023 nightly build process involves a pipeline of builds, signing,
1024 and, eventually, uploading the tasks to balrog."""
1025 filter = make_desktop_nightly_filter(
1026 {"linux64-asan-reporter-shippable", "win64-asan-reporter-shippable"}
1028 return [l for l, t in full_task_graph.tasks.items() if filter(t, parameters)]
1031 @_target_task("daily_releases")
1032 def target_tasks_daily_releases(full_task_graph, parameters, graph_config):
1033 """Select the set of tasks required to identify if we should release.
1034 If we determine that we should the task will communicate to ship-it to
1035 schedule the release itself."""
1037 def filter(task):
1038 return task.kind in ["maybe-release"]
1040 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1043 @_target_task("nightly_desktop")
1044 def target_tasks_nightly_desktop(full_task_graph, parameters, graph_config):
1045 """Select the set of tasks required for a nightly build of linux, mac,
1046 windows."""
1047 index_path = (
1048 f"{graph_config['trust-domain']}.v2.{parameters['project']}.revision."
1049 f"{parameters['head_rev']}.taskgraph.decision-nightly-desktop"
1051 if os.environ.get("MOZ_AUTOMATION") and retry(
1052 index_exists,
1053 args=(index_path,),
1054 kwargs={
1055 "reason": "to avoid triggering multiple nightlies off the same revision",
1058 return []
1060 # Tasks that aren't platform specific
1061 release_filter = make_desktop_nightly_filter({None})
1062 release_tasks = [
1063 l for l, t in full_task_graph.tasks.items() if release_filter(t, parameters)
1065 # Avoid duplicate tasks.
1066 return list(
1067 set(target_tasks_nightly_win32(full_task_graph, parameters, graph_config))
1068 | set(target_tasks_nightly_win64(full_task_graph, parameters, graph_config))
1069 | set(
1070 target_tasks_nightly_win64_aarch64(
1071 full_task_graph, parameters, graph_config
1074 | set(target_tasks_nightly_macosx(full_task_graph, parameters, graph_config))
1075 | set(target_tasks_nightly_linux(full_task_graph, parameters, graph_config))
1076 | set(target_tasks_nightly_asan(full_task_graph, parameters, graph_config))
1077 | set(release_tasks)
1081 # Run Searchfox analysis once daily.
1082 @_target_task("searchfox_index")
1083 def target_tasks_searchfox(full_task_graph, parameters, graph_config):
1084 """Select tasks required for indexing Firefox for Searchfox web site each day"""
1085 return [
1086 "searchfox-linux64-searchfox/debug",
1087 "searchfox-macosx64-searchfox/debug",
1088 "searchfox-win64-searchfox/debug",
1089 "searchfox-android-armv7-searchfox/debug",
1090 "searchfox-ios-searchfox/debug",
1091 "source-test-file-metadata-bugzilla-components",
1092 "source-test-file-metadata-test-info-all",
1093 "source-test-wpt-metadata-summary",
1097 # Run build linux64-plain-clang-trunk/opt on mozilla-central/beta with perf tests
1098 @_target_task("linux64_clang_trunk_perf")
1099 def target_tasks_build_linux64_clang_trunk_perf(
1100 full_task_graph, parameters, graph_config
1102 """Select tasks required to run perf test on linux64 build with clang trunk"""
1104 # Only keep tasks generated from platform `linux1804-64-clang-trunk-qr/opt`
1105 def filter(task_label):
1106 if "linux1804-64-clang-trunk-qr/opt" in task_label:
1107 return True
1108 return False
1110 return [l for l, t in full_task_graph.tasks.items() if filter(t.label)]
1113 # Run Updatebot's cron job 4 times daily.
1114 @_target_task("updatebot_cron")
1115 def target_tasks_updatebot_cron(full_task_graph, parameters, graph_config):
1116 """Select tasks required to run Updatebot's cron job"""
1117 return ["updatebot-cron"]
1120 @_target_task("customv8_update")
1121 def target_tasks_customv8_update(full_task_graph, parameters, graph_config):
1122 """Select tasks required for building latest d8/v8 version."""
1123 return ["toolchain-linux64-custom-v8"]
1126 @_target_task("file_update")
1127 def target_tasks_file_update(full_task_graph, parameters, graph_config):
1128 """Select the set of tasks required to perform nightly in-tree file updates"""
1130 def filter(task):
1131 # For now any task in the repo-update kind is ok
1132 return task.kind in ["repo-update"]
1134 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1137 @_target_task("l10n_bump")
1138 def target_tasks_l10n_bump(full_task_graph, parameters, graph_config):
1139 """Select the set of tasks required to perform l10n bumping."""
1141 def filter(task):
1142 # For now any task in the repo-update kind is ok
1143 return task.kind in ["l10n-bump"]
1145 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1148 @_target_task("merge_automation")
1149 def target_tasks_merge_automation(full_task_graph, parameters, graph_config):
1150 """Select the set of tasks required to perform repository merges."""
1152 def filter(task):
1153 # For now any task in the repo-update kind is ok
1154 return task.kind in ["merge-automation"]
1156 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1159 @_target_task("scriptworker_canary")
1160 def target_tasks_scriptworker_canary(full_task_graph, parameters, graph_config):
1161 """Select the set of tasks required to run scriptworker canaries."""
1163 def filter(task):
1164 # For now any task in the repo-update kind is ok
1165 return task.kind in ["scriptworker-canary"]
1167 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1170 @_target_task("cron_bouncer_check")
1171 def target_tasks_bouncer_check(full_task_graph, parameters, graph_config):
1172 """Select the set of tasks required to perform bouncer version verification."""
1174 def filter(task):
1175 if not filter_for_project(task, parameters):
1176 return False
1177 # For now any task in the repo-update kind is ok
1178 return task.kind in ["cron-bouncer-check"]
1180 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1183 @_target_task("staging_release_builds")
1184 def target_tasks_staging_release(full_task_graph, parameters, graph_config):
1186 Select all builds that are part of releases.
1189 def filter(task):
1190 if not task.attributes.get("shipping_product"):
1191 return False
1192 if parameters["release_type"].startswith(
1193 "esr"
1194 ) and "android" in task.attributes.get("build_platform", ""):
1195 return False
1196 if parameters["release_type"] != "beta" and "devedition" in task.attributes.get(
1197 "build_platform", ""
1199 return False
1200 if task.attributes.get("shipping_phase") == "build":
1201 return True
1202 return False
1204 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1207 @_target_task("release_simulation")
1208 def target_tasks_release_simulation(full_task_graph, parameters, graph_config):
1210 Select builds that would run on push on a release branch.
1212 project_by_release = {
1213 "nightly": "mozilla-central",
1214 "beta": "mozilla-beta",
1215 "release": "mozilla-release",
1216 "esr115": "mozilla-esr115",
1218 target_project = project_by_release.get(parameters["release_type"])
1219 if target_project is None:
1220 raise Exception("Unknown or unspecified release type in simulation run.")
1222 def filter_for_target_project(task):
1223 """Filter tasks by project. Optionally enable nightlies."""
1224 run_on_projects = set(task.attributes.get("run_on_projects", []))
1225 return match_run_on_projects(target_project, run_on_projects)
1227 def filter_out_android_on_esr(task):
1228 if parameters["release_type"].startswith(
1229 "esr"
1230 ) and "android" in task.attributes.get("build_platform", ""):
1231 return False
1232 return True
1234 return [
1236 for l, t in full_task_graph.tasks.items()
1237 if filter_release_tasks(t, parameters)
1238 and filter_out_cron(t, parameters)
1239 and filter_for_target_project(t)
1240 and filter_out_android_on_esr(t)
1244 @_target_task("codereview")
1245 def target_tasks_codereview(full_task_graph, parameters, graph_config):
1246 """Select all code review tasks needed to produce a report"""
1248 def filter(task):
1249 # Ending tasks
1250 if task.kind in ["code-review"]:
1251 return True
1253 # Analyzer tasks
1254 if task.attributes.get("code-review") is True:
1255 return True
1257 return False
1259 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1262 @_target_task("nothing")
1263 def target_tasks_nothing(full_task_graph, parameters, graph_config):
1264 """Select nothing, for DONTBUILD pushes"""
1265 return []
1268 @_target_task("daily_beta_perf")
1269 def target_tasks_daily_beta_perf(full_task_graph, parameters, graph_config):
1271 Select performance tests on the beta branch to be run daily
1273 index_path = (
1274 f"{graph_config['trust-domain']}.v2.{parameters['project']}.revision."
1275 f"{parameters['head_rev']}.taskgraph.decision-daily-beta-perf"
1277 if os.environ.get("MOZ_AUTOMATION") and retry(
1278 index_exists,
1279 args=(index_path,),
1280 kwargs={
1281 "reason": "to avoid triggering multiple daily beta perftests off of the same revision",
1284 return []
1286 def filter(task):
1287 platform = task.attributes.get("test_platform")
1288 attributes = task.attributes
1289 try_name = attributes.get("raptor_try_name") or task.label
1291 unittest_suite = attributes.get("unittest_suite")
1292 if unittest_suite not in ("raptor", "awsy", "talos"):
1293 return False
1294 if not platform:
1295 return False
1297 # Select beta tasks for awsy
1298 if "awsy" in try_name:
1299 if accept_awsy_task(try_name, platform):
1300 return True
1301 return False
1303 # Select beta tasks for talos
1304 if "talos" == unittest_suite:
1305 if accept_raptor_desktop_build(platform):
1306 if "windows11-64" in platform:
1307 if "xperf" in try_name:
1308 return True
1309 return False
1310 if ("mac" in platform or "windows" in platform) and "g3" in try_name:
1311 return False
1312 if "-swr" in try_name:
1313 if "dromaeo" in try_name:
1314 return False
1315 if "perf-reftest-singletons" in try_name:
1316 return False
1317 if "realworldweb" in try_name:
1318 return False
1319 if any(
1320 x in try_name
1321 for x in ("prof", "ipc", "gli", "sessionrestore", "tabswitch")
1323 return False
1324 return True
1325 return False
1327 if accept_raptor_desktop_build(platform):
1328 if "browsertime" and "firefox" in try_name:
1329 if "profiling" in try_name:
1330 return False
1331 if "bytecode" in try_name:
1332 return False
1333 if "live" in try_name:
1334 return False
1335 if "webext" in try_name:
1336 return False
1337 if "unity" in try_name:
1338 return False
1339 if "wasm" in try_name:
1340 return False
1341 if "tp6-bench" in try_name:
1342 return False
1343 if "tp6" in try_name:
1344 return True
1345 if "benchmark" in try_name:
1346 return True
1347 elif accept_raptor_android_build(platform):
1348 # Select browsertime & geckoview specific tests
1349 if "browsertime" and "geckoview" in try_name:
1350 if "power" in try_name:
1351 return False
1352 if "cpu" in try_name:
1353 return False
1354 if "profiling" in try_name:
1355 return False
1356 if "-live" in try_name:
1357 return False
1358 if "speedometer" in try_name:
1359 return True
1360 if "webgl" in try_name:
1361 return True
1362 if "tp6m" in try_name:
1363 return True
1365 return False
1367 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1370 @_target_task("weekly_release_perf")
1371 def target_tasks_weekly_release_perf(full_task_graph, parameters, graph_config):
1373 Select performance tests on the release branch to be run weekly
1376 def filter(task):
1377 platform = task.attributes.get("test_platform")
1378 attributes = task.attributes
1379 try_name = attributes.get("raptor_try_name") or task.label
1381 if attributes.get("unittest_suite") not in ("raptor", "awsy"):
1382 return False
1383 if not platform:
1384 return False
1386 # Select release tasks for awsy
1387 if "awsy" in try_name:
1388 if accept_awsy_task(try_name, platform):
1389 return True
1390 return False
1392 # Select browsertime tests
1393 if accept_raptor_desktop_build(platform):
1394 if "browsertime" and "firefox" in try_name:
1395 if "power" in try_name:
1396 return False
1397 if "profiling" in try_name:
1398 return False
1399 if "bytecode" in try_name:
1400 return False
1401 if "live" in try_name:
1402 return False
1403 if "webext" in try_name:
1404 return False
1405 if "tp6-bench" in try_name:
1406 return False
1407 if "tp6" in try_name:
1408 return True
1409 if "benchmark" in try_name:
1410 return True
1411 if "youtube-playback" in try_name:
1412 return True
1413 elif accept_raptor_android_build(platform):
1414 # Select browsertime & geckoview specific tests
1415 if "browsertime" and "geckoview" in try_name:
1416 if "power" in try_name:
1417 return False
1418 if "cpu" in try_name:
1419 return False
1420 if "profiling" in try_name:
1421 return False
1422 if "-live" in try_name:
1423 return False
1424 if "speedometer" in try_name:
1425 return True
1426 if "webgl" in try_name:
1427 return True
1428 if "tp6m" in try_name:
1429 return True
1430 if "youtube-playback" in try_name:
1431 return True
1433 return False
1435 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1438 @_target_task("raptor_tp6m")
1439 def target_tasks_raptor_tp6m(full_task_graph, parameters, graph_config):
1441 Select tasks required for running raptor cold page-load tests on fenix and refbrow
1444 def filter(task):
1445 platform = task.attributes.get("build_platform")
1446 attributes = task.attributes
1448 if platform and "android" not in platform:
1449 return False
1450 if attributes.get("unittest_suite") != "raptor":
1451 return False
1452 try_name = attributes.get("raptor_try_name")
1453 if "-cold" in try_name and "shippable" in platform:
1454 # Get browsertime amazon smoke tests
1455 if (
1456 "browsertime" in try_name
1457 and "amazon" in try_name
1458 and "search" not in try_name
1459 and "fenix" in try_name
1461 return True
1463 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1466 @_target_task("backfill_all_browsertime")
1467 def target_tasks_backfill_all_browsertime(full_task_graph, parameters, graph_config):
1469 Search for revisions that contains patches that were reviewed by perftest reviewers
1470 and landed the day before the cron is running. Trigger backfill-all-browsertime action
1471 task on each of them.
1473 from gecko_taskgraph.actions.util import get_decision_task_id, get_pushes
1475 def date_is_yesterday(date):
1476 yesterday = datetime.today() - timedelta(days=1)
1477 date = datetime.fromtimestamp(date)
1478 return date.date() == yesterday.date()
1480 def reviewed_by_perftest(push):
1481 try:
1482 commit_message = get_hg_commit_message(
1483 os.path.join(GECKO, graph_config["product-dir"]), rev=push
1485 except Exception as e:
1486 print(e)
1487 return False
1489 for line in commit_message.split("\n\n"):
1490 if line.lower().startswith("bug ") and "r=" in line:
1491 if "perftest-reviewers" in line.split("r=")[-1]:
1492 print(line)
1493 return True
1494 return False
1496 pushes = get_pushes(
1497 project=parameters["head_repository"],
1498 end_id=int(parameters["pushlog_id"]),
1499 depth=200,
1500 full_response=True,
1502 for push_id in sorted([int(p) for p in pushes.keys()], reverse=True):
1503 push_rev = pushes[str(push_id)]["changesets"][-1]
1504 push_info = find_hg_revision_push_info(
1505 "https://hg.mozilla.org/integration/" + parameters["project"], push_rev
1507 pushdate = int(push_info["pushdate"])
1508 if date_is_yesterday(pushdate) and reviewed_by_perftest(push_rev):
1509 from gecko_taskgraph.actions.util import trigger_action
1511 print(
1512 f"Revision {push_rev} was created yesterday and was reviewed by "
1513 f"#perftest-reviewers."
1515 try:
1516 push_decision_task_id = get_decision_task_id(
1517 parameters["project"], push_id
1519 except Exception:
1520 print(f"Could not find decision task for push {push_id}")
1521 continue
1522 try:
1523 trigger_action(
1524 action_name="backfill-all-browsertime",
1525 # This lets the action know on which push we want to add a new task
1526 decision_task_id=push_decision_task_id,
1528 except Exception as e:
1529 print(f"Failed to trigger action for {push_rev}: {e}")
1531 return []
1534 @_target_task("condprof")
1535 def target_tasks_condprof(full_task_graph, parameters, graph_config):
1537 Select tasks required for building conditioned profiles.
1539 for name, task in full_task_graph.tasks.items():
1540 if task.kind == "condprof":
1541 if "a51" not in name: # bug 1765348
1542 yield name
1545 @_target_task("system_symbols")
1546 def target_tasks_system_symbols(full_task_graph, parameters, graph_config):
1548 Select tasks for scraping and uploading system symbols.
1550 for name, task in full_task_graph.tasks.items():
1551 if task.kind in [
1552 "system-symbols",
1553 "system-symbols-upload",
1554 "system-symbols-reprocess",
1556 yield name
1559 @_target_task("perftest")
1560 def target_tasks_perftest(full_task_graph, parameters, graph_config):
1562 Select perftest tasks we want to run daily
1564 for name, task in full_task_graph.tasks.items():
1565 if task.kind != "perftest":
1566 continue
1567 if task.attributes.get("cron", False):
1568 yield name
1571 @_target_task("perftest-on-autoland")
1572 def target_tasks_perftest_autoland(full_task_graph, parameters, graph_config):
1574 Select perftest tasks we want to run daily
1576 for name, task in full_task_graph.tasks.items():
1577 if task.kind != "perftest":
1578 continue
1579 if task.attributes.get("cron", False) and any(
1580 test_name in name for test_name in ["view"]
1582 yield name
1585 @_target_task("l10n-cross-channel")
1586 def target_tasks_l10n_cross_channel(full_task_graph, parameters, graph_config):
1587 """Select the set of tasks required to run l10n cross-channel."""
1589 def filter(task):
1590 return task.kind in ["l10n-cross-channel"]
1592 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1595 @_target_task("are-we-esmified-yet")
1596 def target_tasks_are_we_esmified_yet(full_task_graph, parameters, graph_config):
1598 select the task to track the progress of the esmification project
1600 return [
1601 l for l, t in full_task_graph.tasks.items() if t.kind == "are-we-esmified-yet"
1605 @_target_task("eslint-build")
1606 def target_tasks_eslint_build(full_task_graph, parameters, graph_config):
1607 """Select the task to run additional ESLint rules which require a build."""
1609 for name, task in full_task_graph.tasks.items():
1610 if task.kind != "source-test":
1611 continue
1612 if "eslint-build" in name:
1613 yield name
1616 @_target_task("holly_tasks")
1617 def target_tasks_holly(full_task_graph, parameters, graph_config):
1618 """Bug 1814661: only run updatebot tasks on holly"""
1620 def filter(task):
1621 return task.kind == "updatebot"
1623 return [l for l, t in full_task_graph.tasks.items() if filter(t)]
1626 @_target_task("snap_upstream_tests")
1627 def target_tasks_snap_upstream_tests(full_task_graph, parameters, graph_config):
1629 Select tasks for testing Snap package built as upstream. Omit -try because
1630 it does not really make sense on a m-c cron
1632 for name, task in full_task_graph.tasks.items():
1633 if "snap-upstream-test" in name and not "-try" in name:
1634 yield name