Files
tubestation/taskcluster/taskgraph/config.py
Dorel Luca 6fd8e69dd7 Backed out 17 changesets (bug 1562412) for for build-notarization failures.
Backed out changeset 9c3d85e9b9fe (bug 1562412)
Backed out changeset e39e5d6a77a8 (bug 1562412)
Backed out changeset aa62038d5d76 (bug 1562412)
Backed out changeset 2143a26de372 (bug 1562412)
Backed out changeset 5b7ca7cf6649 (bug 1562412)
Backed out changeset 7870fa417606 (bug 1562412)
Backed out changeset bf7896916b91 (bug 1562412)
Backed out changeset cd6f0176af52 (bug 1562412)
Backed out changeset af8ccde58367 (bug 1562412)
Backed out changeset 9be172fa19e1 (bug 1562412)
Backed out changeset 9ccdef3b8c9d (bug 1562412)
Backed out changeset 0fc1845ea46c (bug 1562412)
Backed out changeset 861e4a4a13aa (bug 1562412)
Backed out changeset 32f31a6daaa8 (bug 1562412)
Backed out changeset b51ce1cea46d (bug 1562412)
Backed out changeset b8ddcf8368c5 (bug 1562412)
Backed out changeset 19ac1668f0db (bug 1562412)
2020-02-25 02:54:24 +02:00

157 lines
5.8 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/.
from __future__ import absolute_import, print_function, unicode_literals
import os
import logging
import sys
import attr
from six import text_type
from mozpack import path
from .util.python_path import find_object
from .util.schema import validate_schema, Schema, optionally_keyed_by
from voluptuous import Required, Optional, Any
from .util.yaml import load_yaml
logger = logging.getLogger(__name__)
graph_config_schema = Schema({
# The trust-domain for this graph.
# (See https://firefox-source-docs.mozilla.org/taskcluster/taskcluster/taskgraph.html#taskgraph-trust-domain) # noqa
Required('trust-domain'): text_type,
# This specifes the prefix for repo parameters that refer to the project being built.
# This selects between `head_rev` and `comm_head_rev` and related paramters.
# (See http://firefox-source-docs.mozilla.org/taskcluster/taskcluster/parameters.html#push-information # noqa
# and http://firefox-source-docs.mozilla.org/taskcluster/taskcluster/parameters.html#comm-push-information) # noqa
Required('project-repo-param-prefix'): text_type,
# This specifies the top level directory of the application being built.
# ie. "browser/" for Firefox, "comm/mail/" for Thunderbird.
Required('product-dir'): text_type,
Required('treeherder'): {
# Mapping of treeherder group symbols to descriptive names
Required('group-names'): {text_type: text_type}
},
Required('index'): {
Required('products'): [text_type]
},
Required('try'): {
# We have a few platforms for which we want to do some "extra" builds, or at
# least build-ish things. Sort of. Anyway, these other things are implemented
# as different "platforms". These do *not* automatically ride along with "-p
# all"
Required('ridealong-builds'): {text_type: [text_type]},
},
Required('release-promotion'): {
Required('products'): [text_type],
Required('flavors'): {text_type: {
Required('product'): text_type,
Required('target-tasks-method'): text_type,
Optional('is-rc'): bool,
Optional('rebuild-kinds'): [text_type],
Optional('version-bump'): bool,
Optional('partial-updates'): bool,
}},
},
Required('scriptworker'): {
# Prefix to add to scopes controlling scriptworkers
Required('scope-prefix'): text_type,
},
Required('task-priority'): optionally_keyed_by('project', Any(
'highest',
'very-high',
'high',
'medium',
'low',
'very-low',
'lowest',
)),
Required('partner-urls'): {
Required('release-partner-repack'):
optionally_keyed_by('release-product', 'release-level', 'release-type',
Any(text_type, None)),
Required('release-eme-free-repack'):
optionally_keyed_by('release-product', 'release-level', 'release-type',
Any(text_type, None)),
},
Required('workers'): {
Required('aliases'): {
text_type: {
Required('provisioner'): optionally_keyed_by('level', text_type),
Required('implementation'): text_type,
Required('os'): text_type,
Required('worker-type'): optionally_keyed_by('level', 'release-level', text_type),
}
},
},
Required('mac-notarization'): {
Required('mac-behavior'):
optionally_keyed_by('platform', 'release-type',
Any('mac_notarize', 'mac_geckodriver', 'mac_sign',
'mac_sign_and_pkg')),
Required('mac-entitlements'):
optionally_keyed_by('platform', 'release-level', text_type),
},
Required("taskgraph"): {
Optional(
"register",
description="Python function to call to register extensions.",
): text_type,
Optional('decision-parameters'): text_type,
},
})
@attr.s(frozen=True, cmp=False)
class GraphConfig(object):
_config = attr.ib()
root_dir = attr.ib()
_PATH_MODIFIED = False
def __getitem__(self, name):
return self._config[name]
def register(self):
"""
Add the project's taskgraph directory to the python path, and register
any extensions present.
"""
if GraphConfig._PATH_MODIFIED:
raise Exception("Can't register multiple directories on python path.")
GraphConfig._PATH_MODIFIED = True
sys.path.insert(0, os.path.dirname(self.root_dir))
register_path = self['taskgraph'].get('register')
if register_path:
find_object(register_path)(self)
@property
def taskcluster_yml(self):
if path.split(self.root_dir)[-2:] != ['taskcluster', 'ci']:
raise Exception(
"Not guessing path to `.taskcluster.yml`. "
"Graph config in non-standard location."
)
return os.path.join(
os.path.dirname(os.path.dirname(self.root_dir)),
".taskcluster.yml",
)
def validate_graph_config(config):
validate_schema(graph_config_schema, config, "Invalid graph configuration:")
def load_graph_config(root_dir):
config_yml = os.path.join(root_dir, "config.yml")
if not os.path.exists(config_yml):
raise Exception("Couldn't find taskgraph configuration: {}".format(config_yml))
logger.debug("loading config from `{}`".format(config_yml))
config = load_yaml(config_yml)
validate_graph_config(config)
return GraphConfig(config=config, root_dir=root_dir)