зеркало из https://github.com/mozilla/gecko-dev.git
170 строки
5.4 KiB
Python
170 строки
5.4 KiB
Python
# 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/.
|
|
"""
|
|
Transform the release-sign-and-push task into an actual task description.
|
|
"""
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
from taskgraph.loader.single_dep import schema
|
|
from taskgraph.transforms.base import TransformSequence
|
|
from taskgraph.util.attributes import copy_attributes_from_dependent_job
|
|
from taskgraph.util.schema import resolve_keyed_by, optionally_keyed_by
|
|
from taskgraph.transforms.task import task_description_schema
|
|
from voluptuous import Any, Required
|
|
|
|
task_description_schema = {str(k): v for k, v in task_description_schema.schema.iteritems()}
|
|
|
|
transforms = TransformSequence()
|
|
|
|
langpack_sign_push_description_schema = schema.extend({
|
|
Required('label'): basestring,
|
|
Required('description'): basestring,
|
|
Required('worker-type'): optionally_keyed_by('release-level', basestring),
|
|
Required('worker'): {
|
|
Required('implementation'): 'sign-and-push-addons',
|
|
Required('channel'): optionally_keyed_by(
|
|
'project',
|
|
optionally_keyed_by('platform', Any('listed', 'unlisted'))),
|
|
Required('upstream-artifacts'): None, # Processed here below
|
|
},
|
|
|
|
Required('run-on-projects'): [],
|
|
Required('scopes'): optionally_keyed_by('release-level', [basestring]),
|
|
Required('shipping-phase'): task_description_schema['shipping-phase'],
|
|
Required('shipping-product'): task_description_schema['shipping-product'],
|
|
})
|
|
|
|
|
|
@transforms.add
|
|
def set_label(config, jobs):
|
|
for job in jobs:
|
|
label = 'sign-and-push-langpacks-{}'.format(job['primary-dependency'].label)
|
|
job['label'] = label
|
|
|
|
yield job
|
|
|
|
|
|
transforms.add_validate(langpack_sign_push_description_schema)
|
|
|
|
|
|
@transforms.add
|
|
def resolve_keys(config, jobs):
|
|
for job in jobs:
|
|
resolve_keyed_by(
|
|
job, 'worker-type', item_name=job['label'],
|
|
**{'release-level': config.params.release_level()}
|
|
)
|
|
resolve_keyed_by(
|
|
job, 'scopes', item_name=job['label'],
|
|
**{'release-level': config.params.release_level()}
|
|
)
|
|
resolve_keyed_by(
|
|
job, 'worker.channel', item_name=job['label'],
|
|
project=config.params['project'],
|
|
platform=job['primary-dependency'].attributes['build_platform'],
|
|
)
|
|
|
|
yield job
|
|
|
|
|
|
@transforms.add
|
|
def copy_attributes(config, jobs):
|
|
for job in jobs:
|
|
dep_job = job['primary-dependency']
|
|
job['attributes'] = copy_attributes_from_dependent_job(dep_job)
|
|
job['attributes']['chunk_locales'] = dep_job.attributes.get('chunk_locales', ['en-US'])
|
|
|
|
yield job
|
|
|
|
|
|
@transforms.add
|
|
def filter_out_macos_jobs_but_mac_only_locales(config, jobs):
|
|
for job in jobs:
|
|
build_platform = job['primary-dependency'].attributes.get('build_platform')
|
|
|
|
if build_platform in ('linux64-nightly', 'linux64-devedition-nightly'):
|
|
yield job
|
|
elif build_platform in ('macosx64-nightly', 'macosx64-devedition-nightly') and \
|
|
'ja-JP-mac' in job['attributes']['chunk_locales']:
|
|
# Other locales of the same job shouldn't be processed
|
|
job['attributes']['chunk_locales'] = ['ja-JP-mac']
|
|
job['label'] = job['label'].replace(
|
|
job['attributes']['l10n_chunk'], 'ja-JP-mac'
|
|
)
|
|
yield job
|
|
|
|
|
|
@transforms.add
|
|
def make_task_description(config, jobs):
|
|
for job in jobs:
|
|
dep_job = job['primary-dependency']
|
|
|
|
treeherder = job.get('treeherder', {})
|
|
treeherder.setdefault('symbol', 'langpack(SnP{})'.format(
|
|
job['attributes'].get('l10n_chunk', '')
|
|
))
|
|
dep_th_platform = dep_job.task.get('extra', {}).get(
|
|
'treeherder', {}).get('machine', {}).get('platform', '')
|
|
treeherder.setdefault('platform', '{}/opt'.format(dep_th_platform))
|
|
treeherder.setdefault('tier', 1)
|
|
treeherder.setdefault('kind', 'build')
|
|
|
|
job['description'] = job['description'].format(
|
|
locales='/'.join(job['attributes']['chunk_locales']),
|
|
)
|
|
|
|
job['dependencies'] = {
|
|
str(dep_job.kind): dep_job.label
|
|
}
|
|
job['treeherder'] = treeherder
|
|
|
|
yield job
|
|
|
|
|
|
def generate_upstream_artifacts(upstream_task_ref, locales):
|
|
return [{
|
|
'taskId': {'task-reference': upstream_task_ref},
|
|
'taskType': 'build',
|
|
'paths': [
|
|
'public/build{locale}/target.langpack.xpi'.format(
|
|
locale='' if locale == 'en-US' else '/' + locale
|
|
)
|
|
for locale in locales
|
|
],
|
|
}]
|
|
|
|
|
|
@transforms.add
|
|
def make_task_worker(config, jobs):
|
|
for job in jobs:
|
|
upstream_task_ref = get_upstream_task_ref(job, expected_kinds=('build', 'nightly-l10n'))
|
|
|
|
job['worker']['upstream-artifacts'] = generate_upstream_artifacts(
|
|
upstream_task_ref, job['attributes']['chunk_locales']
|
|
)
|
|
|
|
yield job
|
|
|
|
|
|
def get_upstream_task_ref(job, expected_kinds):
|
|
upstream_tasks = [
|
|
job_kind
|
|
for job_kind in job['dependencies'].keys()
|
|
if job_kind in expected_kinds
|
|
]
|
|
|
|
if len(upstream_tasks) > 1:
|
|
raise Exception('Only one dependency expected')
|
|
|
|
return '<{}>'.format(upstream_tasks[0])
|
|
|
|
|
|
@transforms.add
|
|
def strip_unused_data(config, jobs):
|
|
for job in jobs:
|
|
del job['primary-dependency']
|
|
|
|
yield job
|