Bug 1274980 part 2: Support Mac OS tests in tc intree config. r=dustin

We add support for Mac OSX tests in Taskcluster by support
taskcluster-worker macosx engine. We also add a new configuration
blob-upload-branch needed by mochitest-other.

MozReview-Commit-ID: CxT3BP3sydG

--HG--
extra : rebase_source : 25e16bf5b5d5a8121fd431788185d318612d7ea5
This commit is contained in:
Wander Lairson Costa 2016-11-07 09:20:50 -02:00
Родитель 4e8662ab83
Коммит 41ed0a2cdf
10 изменённых файлов: 314 добавлений и 16 удалений

Просмотреть файл

@ -64,3 +64,10 @@ windows10-64-vm/opt:
#windows10-64/opt:
# build-platform: win64/opt
# test-set: windows-gpu-tests
macosx64/debug:
build-platform: macosx64/debug
test-set: macosx64-tests
# macosx64/opt:
# build-platform: macosx64/opt
# test-set: macosx64-tests

Просмотреть файл

@ -96,4 +96,24 @@ ccov-code-coverage-tests:
jsdcov-code-coverage-tests:
- mochitest-browser-chrome
- mochitest-devtools-chrome
- mochitest-devtools-chrome
macosx64-tests:
- cppunit
- crashtest
# - gtest
- jsreftest
# - marionette
# - mochitest
# - mochitest-browser-chrome
# - mochitest-clipboard
# - mochitest-devtools-chrome
# - mochitest-gpu
# - mochitest-jetpack
# - mochitest-media
# - mochitest-other
- mochitest-webgl
# - reftest
# - web-platform-tests
# - web-platform-tests-reftests
# - xpcshell

Просмотреть файл

@ -17,6 +17,9 @@ cppunit:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -41,6 +44,9 @@ crashtest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -61,8 +67,8 @@ external-media-tests:
win.*:
- mediatests/taskcluster_windows_config.py
default:
- mediatests/taskcluster_posix_config.py
- remove_executables.py
- mediatests/buildbot_posix_config.py
firefox-ui-functional-local:
description: "Firefox-ui-tests functional run"
@ -74,10 +80,11 @@ firefox-ui-functional-local:
mozharness:
script: firefox_ui_tests/functional.py
config:
- firefox_ui_tests/taskcluster.py
- remove_executables.py
- firefox_ui_tests/taskcluster.py
extra-options:
- "--tag local"
- "--tag"
- "local"
firefox-ui-functional-remote:
description: "Firefox-ui-tests functional run"
@ -89,10 +96,11 @@ firefox-ui-functional-remote:
mozharness:
script: firefox_ui_tests/functional.py
config:
- firefox_ui_tests/taskcluster.py
- remove_executables.py
- firefox_ui_tests/taskcluster.py
extra-options:
- "--tag remote"
- "--tag"
- "remote"
gtest:
description: "GTests run"
@ -107,6 +115,9 @@ gtest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -129,6 +140,9 @@ jittest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -150,6 +164,9 @@ jsreftest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -169,8 +186,8 @@ marionette:
win.*:
- marionette/windows_taskcluster_config.py
default:
- marionette/prod_config.py
- remove_executables.py
- marionette/prod_config.py
mochitest:
description: "Mochitest plain run"
@ -183,6 +200,7 @@ mochitest:
default: ['all']
chunks:
by-test-platform:
macosx.*: 5
win.*: 5
default: 10
e10s:
@ -198,6 +216,9 @@ mochitest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -226,6 +247,9 @@ mochitest-a11y:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -267,6 +291,9 @@ mochitest-browser-chrome:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -292,7 +319,10 @@ mochitest-chrome:
suite: mochitest/chrome
treeherder-symbol: tc-M(c)
loopback-video: true
chunks: 3
chunks:
by-test-platform:
macosx.*: 1
default: 3
e10s: false
mozharness:
script: desktop_unittest.py
@ -301,6 +331,9 @@ mochitest-chrome:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -321,6 +354,9 @@ mochitest-clipboard:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -359,6 +395,9 @@ mochitest-devtools-chrome:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -396,6 +435,9 @@ mochitest-gpu:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -417,6 +459,9 @@ mochitest-jetpack:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -440,12 +485,37 @@ mochitest-media:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
extra-options:
- --mochitest-suite=mochitest-media
mochitest-other:
description: "Mochitest other"
suite: mochitest/other
treeherder-symbol: tc-M(oth)
e10s: false
max-run-time: 5400
mozharness:
script: mozharness/scripts/desktop_unittest.py
no-read-buildbot-config: true
include-blob-upload-branch: true
chunked: true
config:
by-test-platform:
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
extra-options:
- --mochitest-suite=chrome,a11y
mochitest-webgl:
description: "Mochitest webgl run"
suite: mochitest/mochitest-gl
@ -460,6 +530,9 @@ mochitest-webgl:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -472,8 +545,11 @@ reftest:
description: "Reftest run"
suite: reftest/reftest
treeherder-symbol: tc-R(R)
chunks: 8
docker-image: {"in-tree": "desktop1604-test"}
chunks:
by-test-platform:
macosx.*: 1
default: 8
mozharness:
script: desktop_unittest.py
no-read-buildbot-config: true
@ -481,6 +557,9 @@ reftest:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -491,8 +570,11 @@ reftest-no-accel:
description: "Reftest not accelerated run"
suite: reftest/reftest-no-accel
treeherder-symbol: tc-R(Ru)
chunks: 8
docker-image: {"in-tree": "desktop1604-test"}
chunks:
by-test-platform:
macosx.*: 1
default: 8
mozharness:
script: desktop_unittest.py
no-read-buildbot-config: true
@ -500,6 +582,9 @@ reftest-no-accel:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py
@ -510,7 +595,10 @@ web-platform-tests:
description: "Web platform test run"
suite: web-platform-tests
treeherder-symbol: tc-W()
chunks: 12
chunks:
by-test-platform:
macosx.*: 5
default: 12
max-run-time: 7200
instance-size: xlarge
docker-image: {"in-tree": "desktop1604-test"}
@ -523,8 +611,8 @@ web-platform-tests:
win.*:
- web_platform_tests/prod_config_windows_taskcluster.py
default:
- web_platform_tests/prod_config.py
- remove_executables.py
- web_platform_tests/prod_config.py
extra-options:
- --test-type=testharness
@ -544,8 +632,8 @@ web-platform-tests-reftests:
win.*:
- web_platform_tests/prod_config_windows_taskcluster.py
default:
- web_platform_tests/prod_config.py
- remove_executables.py
- web_platform_tests/prod_config.py
extra-options:
- --test-type=reftest
@ -581,6 +669,7 @@ xpcshell:
chunks:
by-test-platform:
# win.*: 1
macosx.*: 1
linux64/debug: 10
default: 8
max-run-time: 5400
@ -592,6 +681,9 @@ xpcshell:
by-test-platform:
win.*:
- unittests/win_taskcluster_unittest.py
macosx.*:
- remove_executables.py
- unittests/mac_unittest.py
default:
- unittests/linux_unittest.py
- remove_executables.py

Просмотреть файл

@ -0,0 +1,52 @@
#! /bin/bash -xe
set -x -e
echo "running as" $(id)
####
# Taskcluster friendly wrapper for performing fx Mac OSX tests via mozharness.
####
# Inputs, with defaults
: MOZHARNESS_URL ${MOZHARNESS_URL}
: MOZHARNESS_SCRIPT ${MOZHARNESS_SCRIPT}
: MOZHARNESS_CONFIG ${MOZHARNESS_CONFIG}
WORKSPACE=$HOME
cd $WORKSPACE
rm -rf artifacts
mkdir artifacts
# test required parameters are supplied
if [[ -z ${MOZHARNESS_URL} ]]; then fail "MOZHARNESS_URL is not set"; fi
if [[ -z ${MOZHARNESS_SCRIPT} ]]; then fail "MOZHARNESS_SCRIPT is not set"; fi
if [[ -z ${MOZHARNESS_CONFIG} ]]; then fail "MOZHARNESS_CONFIG is not set"; fi
# Unzip the mozharness ZIP file created by the build task
if ! curl --fail -o mozharness.zip --retry 10 -L $MOZHARNESS_URL; then
fail "failed to download mozharness zip"
fi
rm -rf mozharness
unzip -q mozharness.zip
rm mozharness.zip
# For telemetry purposes, the build process wants information about the
# source it is running; tc-vcs obscures this a little, but we can provide
# it directly.
export MOZ_SOURCE_REPO="${GECKO_HEAD_REPOSITORY}"
export MOZ_SOURCE_CHANGESET="${GECKO_HEAD_REV}"
# support multiple, space delimited, config files
config_cmds=""
for cfg in $MOZHARNESS_CONFIG; do
config_cmds="${config_cmds} --config-file ${cfg}"
done
rm -rf build logs properties target.dmg
# run the given mozharness script and configs, but pass the rest of the
# arguments in from our own invocation
python2.7 $WORKSPACE/mozharness/scripts/${MOZHARNESS_SCRIPT} ${config_cmds} "${@}"

Просмотреть файл

@ -47,6 +47,7 @@ JOB_NAME_WHITELIST = set([
'macosx64-st-an-opt',
'nexus-5-l-eng-debug',
'nexus-5-l-eng-opt',
'osx-10-10',
'shell-haz-debug',
'sm-arm64-sim-debug',
'sm-arm-sim-debug',

Просмотреть файл

@ -250,6 +250,30 @@ task_description_schema = Schema({
'product': basestring,
Extra: basestring, # additional properties are allowed
},
}, {
'implementation': 'macosx-engine',
# A link for an executable to download
Optional('link'): basestring,
# the command to run
Required('command'): [taskref_or_string],
# environment variables
Optional('env'): {basestring: taskref_or_string},
# artifacts to extract from the task image after completion
Optional('artifacts'): [{
# type of artifact -- simple file, or recursive directory
Required('type'): Any('file', 'directory'),
# task image path from which to read artifact
Required('path'): basestring,
# name of the produced artifact (root of the names for
# type=directory)
Required('name'): basestring,
}],
}),
# The "when" section contains descriptions of the circumstances
@ -429,6 +453,22 @@ def build_generic_worker_payload(config, task, task_def):
if 'retry-exit-status' in worker:
raise Exception("retry-exit-status not supported in generic-worker")
@payload_builder('macosx-engine')
def build_macosx_engine_payload(config, task, task_def):
worker = task['worker']
artifacts = map(lambda artifact: {
'name': artifact['name'],
'path': artifact['path'],
'type': artifact['type'],
'expires': task_def['expires'],
}, worker['artifacts'])
task_def['payload'] = {
'link': worker['link'],
'command': worker['command'],
'env': worker['env'],
'artifacts': artifacts,
}
transforms = TransformSequence()

Просмотреть файл

@ -26,6 +26,8 @@ def set_worker_implementation(config, tests):
for test in tests:
if test['test-platform'].startswith('win'):
test['worker-implementation'] = 'generic-worker'
elif test['test-platform'].startswith('macosx'):
test['worker-implementation'] = 'macosx-engine'
else:
test['worker-implementation'] = 'docker-worker'
yield test

Просмотреть файл

@ -21,7 +21,12 @@ transforms = TransformSequence()
@transforms.add
def set_defaults(config, tests):
for test in tests:
test['mozharness']['build-artifact-name'] = 'public/build/target.tar.bz2'
build_platform = test['build-platform']
if build_platform.startswith('macosx'):
target = 'target.dmg'
else:
target = 'target.tar.bz2'
test['mozharness']['build-artifact-name'] = 'public/build/' + target
# all desktop tests want to run the bits that require node
test['mozharness']['set-moz-node-path'] = True
yield test
@ -35,7 +40,9 @@ def set_treeherder_machine_platform(config, tests):
# platforms
translation = {
'linux64-asan/opt': 'linux64/asan',
'linux64-pgo/opt': 'linux64/pgo'
'linux64-pgo/opt': 'linux64/pgo',
'macosx64/debug': 'osx-10-10/debug',
'macosx64/opt': 'osx-10-10/opt',
}
for test in tests:
build_platform = test['build-platform']

Просмотреть файл

@ -25,6 +25,7 @@ from taskgraph.transforms.job.common import (
)
import logging
import os.path
ARTIFACT_URL = 'https://queue.taskcluster.net/v1/task/{}/artifacts/{}'
WORKER_TYPE = {
@ -40,6 +41,13 @@ WORKER_TYPE = {
'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu'
}
ARTIFACTS = [
# (artifact name prefix, in-image path)
("public/logs/", "build/upload/logs/"),
("public/test", "artifacts/"),
("public/test_info/", "build/blobber_upload_dir/"),
]
logger = logging.getLogger(__name__)
transforms = TransformSequence()
@ -157,7 +165,7 @@ def docker_worker_setup(config, test, taskdesc):
worker['artifacts'] = [{
'name': prefix,
'path': path,
'path': os.path.join('/home/worker/workspace', path),
'type': 'directory',
} for (prefix, path) in artifacts]
@ -369,3 +377,68 @@ def generic_worker_setup(config, test, taskdesc):
'xcopy build\\blobber_upload_dir public\\test_info /e /i',
'copy /y logs\\*.* public\\logs\\'
]
@worker_setup_function("macosx-engine")
def macosx_engine_setup(config, test, taskdesc):
mozharness = test['mozharness']
installer_url = ARTIFACT_URL.format('<build>', mozharness['build-artifact-name'])
test_packages_url = ARTIFACT_URL.format('<build>',
'public/build/target.test_packages.json')
mozharness_url = ARTIFACT_URL.format('<build>',
'public/build/mozharness.zip')
# for now we have only 10.10 machines
taskdesc['worker-type'] = 'tc-worker-provisioner/gecko-t-osx-10-10'
worker = taskdesc['worker'] = {}
worker['implementation'] = test['worker-implementation']
worker['artifacts'] = [{
'name': prefix.rstrip('/'),
'path': path.rstrip('/'),
'type': 'directory',
} for (prefix, path) in ARTIFACTS]
env = worker['env'] = {
'GECKO_HEAD_REPOSITORY': config.params['head_repository'],
'GECKO_HEAD_REV': config.params['head_rev'],
'MOZHARNESS_CONFIG': ' '.join(mozharness['config']),
'MOZHARNESS_SCRIPT': mozharness['script'],
'MOZHARNESS_URL': {'task-reference': mozharness_url},
'MOZILLA_BUILD_URL': {'task-reference': installer_url},
}
# assemble the command line
worker['link'] = '{}/raw-file/{}/taskcluster/scripts/tester/test-macosx.sh'.format(
config.params['head_repository'], config.params['head_rev']
)
command = worker['command'] = ["./test-macosx.sh"]
if mozharness.get('no-read-buildbot-config'):
command.append("--no-read-buildbot-config")
command.extend([
{"task-reference": "--installer-url=" + installer_url},
{"task-reference": "--test-packages-url=" + test_packages_url},
])
if mozharness.get('include-blob-upload-branch'):
command.append('--blob-upload-branch=' + config.params['project'])
command.extend(mozharness.get('extra-options', []))
# TODO: remove the need for run['chunked']
if mozharness.get('chunked') or test['chunks'] > 1:
# Implement mozharness['chunking-args'], modifying command in place
if mozharness['chunking-args'] == 'this-chunk':
command.append('--total-chunk={}'.format(test['chunks']))
command.append('--this-chunk={}'.format(test['this-chunk']))
elif mozharness['chunking-args'] == 'test-suite-suffix':
suffix = mozharness['chunk-suffix'].replace('<CHUNK>', str(test['this-chunk']))
for i, c in enumerate(command):
if isinstance(c, basestring) and c.startswith('--test-suite'):
command[i] += suffix
if 'download-symbols' in mozharness:
download_symbols = mozharness['download-symbols']
download_symbols = {True: 'true', False: 'false'}.get(download_symbols, download_symbols)
command.append('--download-symbols=' + download_symbols)

Просмотреть файл

@ -106,6 +106,7 @@ test_description_schema = Schema({
# test platform.
Optional('worker-implementation'): Any(
'docker-worker',
'macosx-engine',
'generic-worker',
# coming soon:
'docker-engine',
@ -168,6 +169,9 @@ test_description_schema = Schema({
# buildbot config file, so tell it not to do so in TaskCluster
Required('no-read-buildbot-config', default=False): bool,
# Add --blob-upload-branch=<project> mozharness parameter
Optional('include-blob-upload-branch'): bool,
# The setting for --download-symbols (if omitted, the option will not
# be passed to mozharness)
Optional('download-symbols'): Any(True, 'ondemand'),