Bug 1347698 - Generalize tc mochitest retriggers to support reftest r=jmaher
authorWilliam Lachance <wlachance@mozilla.com>
Wed, 15 Mar 2017 18:01:17 -0400
changeset 348306 24631a2250f735711247b25d8aa389bdabd450df
parent 348305 21d1965fc632e7d91afb8af81a3b0580c8b20f9e
child 348307 a54fc2172514a9f89806c0862e59ea52f271b8af
push id88187
push userarchaeopteryx@coole-files.de
push dateSat, 18 Mar 2017 15:27:00 +0000
treeherdermozilla-inbound@0b1d3324cffe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjmaher
bugs1347698
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1347698 - Generalize tc mochitest retriggers to support reftest r=jmaher Let's do this by modifying the mochitest retrigger action into a more generic "test retrigger" action that supports both. MozReview-Commit-ID: H3AbsJ58ASV
taskcluster/actions/mochitest-retrigger-action.py
taskcluster/actions/test-retrigger-action.py
deleted file mode 100644
--- a/taskcluster/actions/mochitest-retrigger-action.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import copy
-import json
-import logging
-
-import requests
-from slugid import nice as slugid
-
-from .registry import register_callback_action
-from taskgraph.create import create_task
-from taskgraph.util.time import (
-    current_json_time,
-    json_time_from_now
-)
-
-TASKCLUSTER_QUEUE_URL = "https://queue.taskcluster.net/v1/task"
-
-logger = logging.getLogger(__name__)
-
-
-@register_callback_action(
-    title='Schedule mochitest retrigger',
-    symbol='mdr',
-    description="Retriggers the specified mochitest job with additional options",
-    context=[{'test-type': 'mochitest'}],  # mochitest-only
-    order=0,
-    schema={
-        'type': 'object',
-        'properties': {
-            'path': {
-                'type': 'string',
-                'maxLength': 255,
-                'default': '',
-                'title': 'Path name',
-                'description': 'Path of mochitest to retrigger'
-            },
-            'logLevel': {
-                'type': 'string',
-                'enum': ['debug', 'info', 'warning', 'error', 'critical'],
-                'default': 'debug',
-                'title': 'Log level',
-                'description': 'Log level for output (default is DEBUG, which is highest)'
-            },
-            'runUntilFail': {
-                'type': 'boolean',
-                'default': True,
-                'title': 'Run until failure',
-                'description': ('Runs the specified set of tests repeatedly '
-                                'until failure (or 30 times)')
-            },
-            'repeat': {
-                'type': 'integer',
-                'default': 30,
-                'minimum': 1,
-                'title': 'Run tests N times',
-                'description': ('Run tests repeatedly (usually used in '
-                                'conjunction with runUntilFail)')
-            },
-            'environment': {
-                'type': 'object',
-                'default': {'MY_ENV_1': 'myvalue1'},
-                'title': 'Extra environment variables',
-                'description': 'Extra environment variables to use for this run'
-            },
-            'preferences': {
-                'type': 'object',
-                'default': {'mygeckopreferences.pref': 'myvalue2'},
-                'title': 'Extra gecko (about:config) preferences',
-                'description': 'Extra gecko (about:config) preferences to use for this run'
-            }
-        },
-        'additionalProperties': False,
-        'required': ['path']
-    }
-)
-def mochitest_retrigger_action(parameters, input, task_group_id, task_id, task):
-    new_task_definition = copy.copy(task)
-
-    # set new created, deadline, and expiry fields
-    new_task_definition['created'] = current_json_time()
-    new_task_definition['deadline'] = json_time_from_now('1d')
-    new_task_definition['expires'] = json_time_from_now('30d')
-
-    # reset artifact expiry
-    for artifact in new_task_definition['payload'].get('artifacts', {}).values():
-        artifact['expires'] = new_task_definition['expires']
-
-    # don't want to run mozharness tests, want a custom mach command instead
-    new_task_definition['payload']['command'] += ['--no-run-tests']
-
-    custom_mach_command = [
-        'mochitest',
-        '--keep-open=false',
-        '-f', new_task_definition['payload']['env']['MOCHITEST_FLAVOR']
-    ]
-
-    enable_e10s = json.loads(new_task_definition['payload']['env'].get(
-        'ENABLE_E10S', 'true'))
-    if not enable_e10s:
-        custom_mach_command += ['--disable-e10s']
-
-    custom_mach_command += ['--log-tbpl=-',
-                            '--log-tbpl-level={}'.format(input['logLevel'])]
-    if input.get('runUntilFail'):
-        custom_mach_command += ['--run-until-fail']
-    if input.get('repeat'):
-        custom_mach_command += ['--repeat', str(input['repeat'])]
-
-    # add any custom gecko preferences
-    for (key, val) in input.get('preferences', {}).iteritems():
-        custom_mach_command += ['--setpref', '{}={}'.format(key, val)]
-
-    custom_mach_command += [input['path']]
-    new_task_definition['payload']['env']['CUSTOM_MACH_COMMAND'] = ' '.join(
-        custom_mach_command)
-
-    # update environment
-    new_task_definition['payload']['env'].update(input.get('environment', {}))
-
-    # tweak the treeherder symbol
-    new_task_definition['extra']['treeherder']['symbol'] += '-custom'
-
-    logging.info("New task definition: %s", new_task_definition)
-
-    # actually create the new task
-    new_task_id = slugid()
-    logger.info("Creating new mochitest task with id %s", new_task_id)
-    session = requests.Session()
-    create_task(session, new_task_id, 'mochitest-debug', new_task_definition)
new file mode 100644
--- /dev/null
+++ b/taskcluster/actions/test-retrigger-action.py
@@ -0,0 +1,133 @@
+import copy
+import json
+import logging
+
+import requests
+from slugid import nice as slugid
+
+from .registry import register_callback_action
+from taskgraph.create import create_task
+from taskgraph.util.time import (
+    current_json_time,
+    json_time_from_now
+)
+
+TASKCLUSTER_QUEUE_URL = "https://queue.taskcluster.net/v1/task"
+
+logger = logging.getLogger(__name__)
+
+
+@register_callback_action(
+    title='Schedule test retrigger',
+    symbol='tr',
+    description="Retriggers the specified test job with additional options",
+    context=[{'test-type': 'mochitest'},
+             {'test-type': 'reftest'}],
+    order=0,
+    schema={
+        'type': 'object',
+        'properties': {
+            'path': {
+                'type': 'string',
+                'maxLength': 255,
+                'default': '',
+                'title': 'Path name',
+                'description': 'Path of test to retrigger'
+            },
+            'logLevel': {
+                'type': 'string',
+                'enum': ['debug', 'info', 'warning', 'error', 'critical'],
+                'default': 'debug',
+                'title': 'Log level',
+                'description': 'Log level for output (default is DEBUG, which is highest)'
+            },
+            'runUntilFail': {
+                'type': 'boolean',
+                'default': True,
+                'title': 'Run until failure',
+                'description': ('Runs the specified set of tests repeatedly '
+                                'until failure (or 30 times)')
+            },
+            'repeat': {
+                'type': 'integer',
+                'default': 30,
+                'minimum': 1,
+                'title': 'Run tests N times',
+                'description': ('Run tests repeatedly (usually used in '
+                                'conjunction with runUntilFail)')
+            },
+            'environment': {
+                'type': 'object',
+                'default': {'MY_ENV_1': 'myvalue1'},
+                'title': 'Extra environment variables',
+                'description': 'Extra environment variables to use for this run'
+            },
+            'preferences': {
+                'type': 'object',
+                'default': {'mygeckopreferences.pref': 'myvalue2'},
+                'title': 'Extra gecko (about:config) preferences',
+                'description': 'Extra gecko (about:config) preferences to use for this run'
+            }
+        },
+        'additionalProperties': False,
+        'required': ['path']
+    }
+)
+def test_retrigger_action(parameters, input, task_group_id, task_id, task):
+    new_task_definition = copy.copy(task)
+
+    # set new created, deadline, and expiry fields
+    new_task_definition['created'] = current_json_time()
+    new_task_definition['deadline'] = json_time_from_now('1d')
+    new_task_definition['expires'] = json_time_from_now('30d')
+
+    # reset artifact expiry
+    for artifact in new_task_definition['payload'].get('artifacts', {}).values():
+        artifact['expires'] = new_task_definition['expires']
+
+    # don't want to run mozharness tests, want a custom mach command instead
+    new_task_definition['payload']['command'] += ['--no-run-tests']
+
+    custom_mach_command = [task['tags']['test-type']]
+
+    # mochitests may specify a flavor
+    if new_task_definition['payload']['env'].get('MOCHITEST_FLAVOR'):
+        custom_mach_command += [
+            '--keep-open=false',
+            '-f',
+            new_task_definition['payload']['env']['MOCHITEST_FLAVOR']
+        ]
+
+    enable_e10s = json.loads(new_task_definition['payload']['env'].get(
+        'ENABLE_E10S', 'true'))
+    if not enable_e10s:
+        custom_mach_command += ['--disable-e10s']
+
+    custom_mach_command += ['--log-tbpl=-',
+                            '--log-tbpl-level={}'.format(input['logLevel'])]
+    if input.get('runUntilFail'):
+        custom_mach_command += ['--run-until-failure']
+    if input.get('repeat'):
+        custom_mach_command += ['--repeat', str(input['repeat'])]
+
+    # add any custom gecko preferences
+    for (key, val) in input.get('preferences', {}).iteritems():
+        custom_mach_command += ['--setpref', '{}={}'.format(key, val)]
+
+    custom_mach_command += [input['path']]
+    new_task_definition['payload']['env']['CUSTOM_MACH_COMMAND'] = ' '.join(
+        custom_mach_command)
+
+    # update environment
+    new_task_definition['payload']['env'].update(input.get('environment', {}))
+
+    # tweak the treeherder symbol
+    new_task_definition['extra']['treeherder']['symbol'] += '-custom'
+
+    logging.info("New task definition: %s", new_task_definition)
+
+    # actually create the new task
+    new_task_id = slugid()
+    logger.info("Creating new mochitest task with id %s", new_task_id)
+    session = requests.Session()
+    create_task(session, new_task_id, 'test-retrigger', new_task_definition)