diff options
Diffstat (limited to 'taskcluster/taskgraph/target_tasks.py')
-rw-r--r-- | taskcluster/taskgraph/target_tasks.py | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/taskcluster/taskgraph/target_tasks.py b/taskcluster/taskgraph/target_tasks.py new file mode 100644 index 0000000000..d2b3f5a7f0 --- /dev/null +++ b/taskcluster/taskgraph/target_tasks.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- + +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from __future__ import absolute_import, print_function, unicode_literals +from taskgraph import try_option_syntax + +INTEGRATION_PROJECTS = set([ + 'mozilla-inbound', + 'autoland', +]) + +RELEASE_PROJECTS = set([ + 'mozilla-central', + 'mozilla-aurora', + 'mozilla-beta', + 'mozilla-release', + 'mozilla-esr52', +]) + +_target_task_methods = {} + + +def _target_task(name): + def wrap(func): + _target_task_methods[name] = func + return func + return wrap + + +def get_method(method): + """Get a target_task_method to pass to a TaskGraphGenerator.""" + return _target_task_methods[method] + + +@_target_task('try_option_syntax') +def target_tasks_try_option_syntax(full_task_graph, parameters): + """Generate a list of target tasks based on try syntax in + parameters['message'] and, for context, the full task graph.""" + options = try_option_syntax.TryOptionSyntax(parameters['message'], full_task_graph) + target_tasks_labels = [t.label for t in full_task_graph.tasks.itervalues() + if options.task_matches(t.attributes)] + + # If the developer wants test jobs to be rebuilt N times we add that value here + if int(options.trigger_tests) > 1: + for l in target_tasks_labels: + task = full_task_graph[l] + if 'unittest_suite' in task.attributes: + task.attributes['task_duplicates'] = options.trigger_tests + + # Add notifications here as well + if options.notifications: + for task in full_task_graph: + owner = parameters.get('owner') + routes = task.task.setdefault('routes', []) + if options.notifications == 'all': + routes.append("notify.email.{}.on-any".format(owner)) + elif options.notifications == 'failure': + routes.append("notify.email.{}.on-failed".format(owner)) + routes.append("notify.email.{}.on-exception".format(owner)) + + return target_tasks_labels + + +@_target_task('default') +def target_tasks_default(full_task_graph, parameters): + """Target the tasks which have indicated they should be run on this project + via the `run_on_projects` attributes.""" + def filter(task): + run_on_projects = set(t.attributes.get('run_on_projects', [])) + if 'all' in run_on_projects: + return True + project = parameters['project'] + if 'integration' in run_on_projects: + if project in INTEGRATION_PROJECTS: + return True + if 'release' in run_on_projects: + if project in RELEASE_PROJECTS: + return True + return project in run_on_projects + return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)] + + +@_target_task('ash_tasks') +def target_tasks_ash(full_task_graph, parameters): + """Target tasks that only run on the ash branch.""" + def filter(task): + platform = task.attributes.get('build_platform') + # only select platforms + if platform not in ('linux64', 'linux64-asan', 'linux64-pgo'): + return False + # and none of this linux64-asan/debug stuff + if platform == 'linux64-asan' and task.attributes['build_type'] == 'debug': + return False + # no non-et10s tests + if task.attributes.get('unittest_suite') or task.attributes.get('talos_siute'): + if not task.attributes.get('e10s'): + return False + # don't upload symbols + if task.attributes['kind'] == 'upload-symbols': + return False + return True + return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)] + + +@_target_task('cedar_tasks') +def target_tasks_cedar(full_task_graph, parameters): + """Target tasks that only run on the cedar branch.""" + def filter(task): + platform = task.attributes.get('build_platform') + # only select platforms + if platform not in ['linux64']: + return False + if task.attributes.get('unittest_suite'): + if not (task.attributes['unittest_suite'].startswith('mochitest') + or 'xpcshell' in task.attributes['unittest_suite']): + return False + return True + return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)] |