зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1442545: [partner-repack] Add parameters needed for doing partner repacks; r=Callek
Differential Revision: https://phabricator.services.mozilla.com/D977 --HG-- extra : rebase_source : 0f2ef4edf6093d644c82c6b0475ba7796ebaa90b extra : histedit_source : b446b09b30a0f709f4c80eaf69ec40952562ce6d
This commit is contained in:
Родитель
eda1a9a23c
Коммит
8ad6e70430
|
@ -159,6 +159,21 @@ Release Promotion
|
||||||
``release_eta``
|
``release_eta``
|
||||||
The time and date when a release is scheduled to live. This value is passed to Balrog.
|
The time and date when a release is scheduled to live. This value is passed to Balrog.
|
||||||
|
|
||||||
|
``release_enable_partners``
|
||||||
|
Boolean which controls repacking vanilla Firefox builds for partners.
|
||||||
|
|
||||||
|
``release_partners``
|
||||||
|
List of partners to repack. A null value defaults to all.
|
||||||
|
|
||||||
|
``release_partner_config``
|
||||||
|
Configuration for partner repacks.
|
||||||
|
|
||||||
|
``release_partner_build_number``
|
||||||
|
The build number for partner repacks. We sometimes have multiple partner build numbers per release build number; this parameter lets us bump them independently. Defaults to 1.
|
||||||
|
|
||||||
|
``release_enable_emefree``
|
||||||
|
Boolean which controls repacking vanilla Firefox builds into EME-free builds.
|
||||||
|
|
||||||
Comm Push Information
|
Comm Push Information
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ from .util import (find_decision_task, find_existing_tasks_from_previous_kinds,
|
||||||
find_hg_revision_pushlog_id)
|
find_hg_revision_pushlog_id)
|
||||||
from taskgraph.util.taskcluster import get_artifact
|
from taskgraph.util.taskcluster import get_artifact
|
||||||
from taskgraph.util.partials import populate_release_history
|
from taskgraph.util.partials import populate_release_history
|
||||||
|
from taskgraph.util.partners import fix_partner_config
|
||||||
from taskgraph.taskgraph import TaskGraph
|
from taskgraph.taskgraph import TaskGraph
|
||||||
from taskgraph.decision import taskgraph_decision
|
from taskgraph.decision import taskgraph_decision
|
||||||
from taskgraph.parameters import Parameters
|
from taskgraph.parameters import Parameters
|
||||||
|
@ -56,6 +57,18 @@ RELEASE_PROMOTION_CONFIG = {
|
||||||
'product': 'firefox',
|
'product': 'firefox',
|
||||||
'release_type': 'rc',
|
'release_type': 'rc',
|
||||||
},
|
},
|
||||||
|
'promote_firefox_partners': {
|
||||||
|
'target_tasks_method': 'promote_firefox',
|
||||||
|
'product': 'firefox',
|
||||||
|
'rebuild_kinds': [
|
||||||
|
'release-partner-repack',
|
||||||
|
'release-partner-beetmover',
|
||||||
|
'release-partner-repack-chunking-dummy',
|
||||||
|
'release-partner-repackage-signing',
|
||||||
|
'release-partner-repackage',
|
||||||
|
'release-partner-signing',
|
||||||
|
],
|
||||||
|
},
|
||||||
'promote_devedition': {
|
'promote_devedition': {
|
||||||
'target_tasks_method': 'promote_devedition',
|
'target_tasks_method': 'promote_devedition',
|
||||||
'product': 'devedition',
|
'product': 'devedition',
|
||||||
|
@ -88,6 +101,9 @@ PARTIAL_UPDATES_FLAVORS = (
|
||||||
'ship_devedition',
|
'ship_devedition',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
PARTNER_BRANCHES = ('mozilla-beta', 'mozilla-release', 'maple', 'birch', 'jamun')
|
||||||
|
EMEFREE_BRANCHES = ('mozilla-beta', 'mozilla-release', 'maple', 'birch', 'jamun')
|
||||||
|
|
||||||
|
|
||||||
def is_release_promotion_available(parameters):
|
def is_release_promotion_available(parameters):
|
||||||
return parameters['project'] in RELEASE_PROMOTION_PROJECTS
|
return parameters['project'] in RELEASE_PROMOTION_PROJECTS
|
||||||
|
@ -203,11 +219,42 @@ def is_release_promotion_available(parameters):
|
||||||
'additionalProperties': False,
|
'additionalProperties': False,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
'release_eta': {
|
'release_eta': {
|
||||||
'type': 'string',
|
'type': 'string',
|
||||||
'default': '',
|
'default': '',
|
||||||
},
|
},
|
||||||
|
'release_enable_partners': {
|
||||||
|
'type': 'boolean',
|
||||||
|
'default': False,
|
||||||
|
'description': ('Toggle for creating partner repacks'),
|
||||||
|
},
|
||||||
|
'release_partner_build_number': {
|
||||||
|
'type': 'integer',
|
||||||
|
'default': 1,
|
||||||
|
'minimum': 1,
|
||||||
|
'description': ('The partner build number. This translates to, e.g. '
|
||||||
|
'`v1` in the path. We generally only have to '
|
||||||
|
'bump this on off-cycle partner rebuilds.'),
|
||||||
|
},
|
||||||
|
'release_partners': {
|
||||||
|
'type': 'array',
|
||||||
|
'description': ('A list of partners to repack, or if null or empty then use '
|
||||||
|
'the current full set'),
|
||||||
|
'items': {
|
||||||
|
'type': 'string',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'release_partner_config': {
|
||||||
|
'type': 'object',
|
||||||
|
'description': ('Partner configuration to use for partner repacks.'),
|
||||||
|
'properties': {},
|
||||||
|
'additionalProperties': True,
|
||||||
|
},
|
||||||
|
'release_enable_emefree': {
|
||||||
|
'type': 'boolean',
|
||||||
|
'default': False,
|
||||||
|
'description': ('Toggle for creating EME-free repacks'),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
"required": ['release_promotion_flavor', 'build_number'],
|
"required": ['release_promotion_flavor', 'build_number'],
|
||||||
}
|
}
|
||||||
|
@ -253,6 +300,14 @@ def release_promotion_action(parameters, graph_config, input, task_group_id, tas
|
||||||
do_not_optimize = input.get(
|
do_not_optimize = input.get(
|
||||||
'do_not_optimize', promotion_config.get('do_not_optimize', [])
|
'do_not_optimize', promotion_config.get('do_not_optimize', [])
|
||||||
)
|
)
|
||||||
|
release_enable_partners = input.get(
|
||||||
|
'release_enable_partners',
|
||||||
|
parameters['project'] in PARTNER_BRANCHES and product in ('firefox',)
|
||||||
|
)
|
||||||
|
release_enable_emefree = input.get(
|
||||||
|
'release_enable_emefree',
|
||||||
|
parameters['project'] in EMEFREE_BRANCHES and product in ('firefox',)
|
||||||
|
)
|
||||||
|
|
||||||
# make parameters read-write
|
# make parameters read-write
|
||||||
parameters = dict(parameters)
|
parameters = dict(parameters)
|
||||||
|
@ -287,6 +342,12 @@ def release_promotion_action(parameters, graph_config, input, task_group_id, tas
|
||||||
parameters['release_history'] = release_history
|
parameters['release_history'] = release_history
|
||||||
parameters['release_type'] = promotion_config.get('release_type', '')
|
parameters['release_type'] = promotion_config.get('release_type', '')
|
||||||
parameters['release_eta'] = input.get('release_eta', '')
|
parameters['release_eta'] = input.get('release_eta', '')
|
||||||
|
parameters['release_enable_partners'] = release_enable_partners
|
||||||
|
parameters['release_partners'] = input.get('release_partners')
|
||||||
|
if input.get('release_partner_config'):
|
||||||
|
parameters['release_partner_config'] = fix_partner_config(input['release_partner_config'])
|
||||||
|
parameters['release_enable_emefree'] = release_enable_emefree
|
||||||
|
|
||||||
if input['version']:
|
if input['version']:
|
||||||
parameters['version'] = input['version']
|
parameters['version'] = input['version']
|
||||||
|
|
||||||
|
|
|
@ -198,6 +198,11 @@ def get_decision_parameters(options):
|
||||||
parameters['next_version'] = None
|
parameters['next_version'] = None
|
||||||
parameters['release_type'] = ''
|
parameters['release_type'] = ''
|
||||||
parameters['release_eta'] = ''
|
parameters['release_eta'] = ''
|
||||||
|
parameters['release_enable_partners'] = False
|
||||||
|
parameters['release_partners'] = []
|
||||||
|
parameters['release_partner_config'] = {}
|
||||||
|
parameters['release_partner_build_number'] = 1
|
||||||
|
parameters['release_enable_emefree'] = False
|
||||||
|
|
||||||
# owner must be an email, but sometimes (e.g., for ffxbld) it is not, in which
|
# owner must be an email, but sometimes (e.g., for ffxbld) it is not, in which
|
||||||
# case, fake it
|
# case, fake it
|
||||||
|
|
|
@ -60,8 +60,13 @@ PARAMETERS = {
|
||||||
'project': 'mozilla-central',
|
'project': 'mozilla-central',
|
||||||
'pushdate': lambda: int(time.time()),
|
'pushdate': lambda: int(time.time()),
|
||||||
'pushlog_id': '0',
|
'pushlog_id': '0',
|
||||||
|
'release_enable_emefree': False,
|
||||||
|
'release_enable_partners': False,
|
||||||
'release_eta': '',
|
'release_eta': '',
|
||||||
'release_history': {},
|
'release_history': {},
|
||||||
|
'release_partners': None,
|
||||||
|
'release_partner_config': None,
|
||||||
|
'release_partner_build_number': 1,
|
||||||
'release_type': '',
|
'release_type': '',
|
||||||
'target_tasks_method': 'default',
|
'target_tasks_method': 'default',
|
||||||
'try_mode': None,
|
'try_mode': None,
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||||||
|
|
||||||
|
from copy import deepcopy
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
|
||||||
|
LOCALES_FILE = os.path.join(
|
||||||
|
os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))),
|
||||||
|
'browser', 'locales', 'l10n-changesets.json'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def check_if_partners_enabled(config, tasks):
|
||||||
|
if (
|
||||||
|
config.params['release_enable_partners'] and
|
||||||
|
config.kind.startswith('release-partner-repack')
|
||||||
|
) or (
|
||||||
|
config.params['release_enable_emefree'] and
|
||||||
|
config.kind.startswith('release-eme-free-repack')
|
||||||
|
):
|
||||||
|
for task in tasks:
|
||||||
|
yield task
|
||||||
|
|
||||||
|
|
||||||
|
def get_partner_config_by_kind(config, kind):
|
||||||
|
""" Retrieve partner data starting from the manifest url, which points to a repository
|
||||||
|
containing a default.xml that is intended to be drive the Google tool 'repo'. It
|
||||||
|
descends into each partner repo to lookup and parse the repack.cfg file(s).
|
||||||
|
|
||||||
|
Supports caching data by kind to avoid repeated requests, relying on the related kinds for
|
||||||
|
partner repacking, signing, repackage, repackage signing all having the same kind prefix.
|
||||||
|
"""
|
||||||
|
partner_subset = config.params['release_partners']
|
||||||
|
partner_configs = config.params['release_partner_config'] or {}
|
||||||
|
|
||||||
|
# TODO eme-free should be a partner; we shouldn't care about per-kind
|
||||||
|
for k in partner_configs:
|
||||||
|
if kind.startswith(k):
|
||||||
|
kind_config = partner_configs[k]
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
return {}
|
||||||
|
# if we're only interested in a subset of partners we remove the rest
|
||||||
|
if isinstance(partner_subset, (list, tuple)):
|
||||||
|
# TODO - should be fatal to have an unknown partner in partner_subset
|
||||||
|
for partner in kind_config.keys():
|
||||||
|
if partner not in partner_subset:
|
||||||
|
del(kind_config[partner])
|
||||||
|
|
||||||
|
return kind_config
|
||||||
|
|
||||||
|
|
||||||
|
def _fix_subpartner_locales(orig_config, all_locales):
|
||||||
|
subpartner_config = deepcopy(orig_config)
|
||||||
|
# Get an ordered list of subpartner locales that is a subset of all_locales
|
||||||
|
subpartner_config['locales'] = sorted(list(
|
||||||
|
set(orig_config['locales']) & set(all_locales)
|
||||||
|
))
|
||||||
|
return subpartner_config
|
||||||
|
|
||||||
|
|
||||||
|
def fix_partner_config(orig_config):
|
||||||
|
pc = {}
|
||||||
|
with open(LOCALES_FILE, 'r') as fh:
|
||||||
|
all_locales = json.load(fh).keys()
|
||||||
|
# l10n-changesets.json doesn't include en-US, but the repack list does
|
||||||
|
if 'en-US' not in all_locales:
|
||||||
|
all_locales.append('en-US')
|
||||||
|
for kind, kind_config in orig_config.iteritems():
|
||||||
|
for partner, partner_config in kind_config.iteritems():
|
||||||
|
for subpartner, subpartner_config in partner_config.iteritems():
|
||||||
|
# get rid of empty subpartner configs
|
||||||
|
if not subpartner_config:
|
||||||
|
continue
|
||||||
|
# Make sure our locale list is a subset of all_locales
|
||||||
|
pc.setdefault(kind, {}).setdefault(partner, {})[subpartner] = \
|
||||||
|
_fix_subpartner_locales(subpartner_config, all_locales)
|
||||||
|
return pc
|
||||||
|
|
||||||
|
|
||||||
|
# seems likely this exists elsewhere already
|
||||||
|
def get_ftp_platform(platform):
|
||||||
|
if platform.startswith('win32'):
|
||||||
|
return 'win32'
|
||||||
|
elif platform.startswith('win64'):
|
||||||
|
return 'win64'
|
||||||
|
elif platform.startswith('macosx'):
|
||||||
|
return 'mac'
|
||||||
|
elif platform.startswith('linux-'):
|
||||||
|
return 'linux-i686'
|
||||||
|
elif platform.startswith('linux64'):
|
||||||
|
return 'linux-x86_64'
|
||||||
|
else:
|
||||||
|
raise ValueError('Unimplemented platform %s'.format(platform))
|
||||||
|
|
||||||
|
|
||||||
|
# Ugh
|
||||||
|
def locales_per_build_platform(build_platform, locales):
|
||||||
|
if build_platform.startswith('mac'):
|
||||||
|
exclude = ['ja']
|
||||||
|
else:
|
||||||
|
exclude = ['ja-JP-mac']
|
||||||
|
return [locale for locale in locales if locale not in exclude]
|
Загрузка…
Ссылка в новой задаче