gecko-dev/taskcluster/taskgraph/transforms/chunk_partners.py
Aki Sasaki 64e8635656 bug 1456620 - chunk mac partner signing. r=nthomas
Previously, we had a single mac signing task that signed all mac locales and subpartners in a single signing task. This task required us to bump the signing task timeout. Chunking gives us a speed boost and a bit more resiliency if a single signing task fails - we don't have to re-sign everything, only the tasks that fail.

MozReview-Commit-ID: 4vPZE1vzZoQ

--HG--
extra : rebase_source : 320e9b51061b57d65d08aed1e621983e911c7b6d
extra : source : 00c8d34184b954d259c04459da916bda8baaca78
2018-04-23 17:12:43 -07:00

58 lines
2.3 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/.
"""
Chunk the partner repack tasks by subpartner and locale
"""
from __future__ import absolute_import, print_function, unicode_literals
import copy
from taskgraph.transforms.base import TransformSequence
from taskgraph.util.partners import get_partner_config_by_kind, locales_per_build_platform
transforms = TransformSequence()
repack_ids_by_platform = {}
def _check_repack_ids_by_platform(platform, repack_id):
"""avoid dup chunks, since mac signing and repackages both chunk"""
if repack_ids_by_platform.get(platform, {}).get(repack_id):
return True
repack_ids_by_platform.setdefault(platform, {})['repack_id'] = True
@transforms.add
def chunk_partners(config, jobs):
partner_configs = get_partner_config_by_kind(config, config.kind)
for job in jobs:
dep_job = job['dependent-task']
build_platform = dep_job.attributes["build_platform"]
# already chunked
if dep_job.task.get('extra', {}).get('repack_id'):
repack_id = dep_job.task['extra']['repack_id']
if _check_repack_ids_by_platform(build_platform, repack_id):
continue
partner_job = copy.deepcopy(job)
partner_job.setdefault('extra', {}).setdefault('repack_id', repack_id)
yield partner_job
continue
# not already chunked
for partner, partner_config in partner_configs.iteritems():
for sub_partner, cfg in partner_config.iteritems():
if build_platform not in cfg.get("platforms", []):
continue
locales = locales_per_build_platform(build_platform, cfg.get('locales', []))
for locale in locales:
repack_id = "{}/{}/{}".format(partner, sub_partner, locale)
if _check_repack_ids_by_platform(build_platform, repack_id):
continue
partner_job = copy.deepcopy(job) # don't overwrite dict values here
partner_job.setdefault('extra', {})
partner_job['extra']['repack_id'] = repack_id
yield partner_job