-
Notifications
You must be signed in to change notification settings - Fork 27
Expand file tree
/
Copy pathpartner_repack.py
More file actions
181 lines (157 loc) · 6.56 KB
/
partner_repack.py
File metadata and controls
181 lines (157 loc) · 6.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# 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 partner repack task into an actual task description.
"""
from taskgraph.transforms.base import TransformSequence
from taskgraph.util.dependencies import get_dependencies
from taskgraph.util.schema import resolve_keyed_by
from gecko_taskgraph.util.attributes import release_level
from gecko_taskgraph.util.partners import (
apply_partner_priority,
check_if_partners_enabled,
get_partner_config_by_kind,
get_partner_url_config,
get_repack_ids_by_platform,
)
from gecko_taskgraph.util.scriptworker import get_release_config
transforms = TransformSequence()
transforms.add(check_if_partners_enabled)
transforms.add(apply_partner_priority)
@transforms.add
def skip_unnecessary_platforms(config, tasks):
for task in tasks:
if config.kind == "release-partner-repack":
platform = task["attributes"]["build_platform"]
repack_ids = get_repack_ids_by_platform(config, platform)
if not repack_ids:
continue
yield task
@transforms.add
def remove_mac_dependency(config, tasks):
"""Remove mac dependency depending on current level
to accomodate for mac notarization not running on level 1
"""
level = int(config.params.get("level", 0))
for task in tasks:
if "macosx" not in task["attributes"]["build_platform"]:
yield task
continue
skipped_kind = "mac-signing" if level == 3 else "mac-notarization"
for dep_label in list(task["dependencies"].keys()):
if skipped_kind in dep_label:
del task["dependencies"][dep_label]
yield task
@transforms.add
def populate_repack_manifests_url(config, tasks):
for task in tasks:
partner_url_config = get_partner_url_config(config.params, config.graph_config)
for k in partner_url_config:
if config.kind.startswith(k):
task["worker"].setdefault("env", {})["REPACK_MANIFESTS_URL"] = (
partner_url_config[k]
)
break
else:
raise Exception("Can't find partner REPACK_MANIFESTS_URL")
for property in ("limit-locales",):
property = f"extra.{property}"
resolve_keyed_by(
task,
property,
property,
**{"release-level": release_level(config.params["project"])},
)
if task["worker"]["env"]["REPACK_MANIFESTS_URL"].startswith("git@"):
if "enterprise" in task["name"]:
task.setdefault("scopes", []).append(
"secrets:get:project/enterprise/level-{level}/partner-github-ssh".format(
**config.params
)
)
else:
task.setdefault("scopes", []).append(
"secrets:get:project/releng/gecko/build/level-{level}/partner-github-ssh".format(
**config.params
)
)
yield task
@transforms.add
def make_label(config, tasks):
for task in tasks:
task["label"] = "{}-{}".format(config.kind, task["name"])
yield task
@transforms.add
def add_command_arguments(config, tasks):
release_config = get_release_config(config)
# staging releases - pass reduced set of locales to the repacking script
all_locales = set()
partner_config = get_partner_config_by_kind(config, config.kind)
for partner in partner_config.values():
for sub_partner in partner.values():
all_locales.update(sub_partner.get("locales", []))
for task in tasks:
# add the MOZHARNESS_OPTIONS, eg version=61.0, build-number=1, platform=win64
if not config.kind.startswith("enterprise-repack") and not task["attributes"][
"build_platform"
].endswith("-shippable"):
raise Exception(
"Unexpected partner repack platform: {}".format(
task["attributes"]["build_platform"],
),
)
platform = (
task["attributes"]["build_platform"]
.partition("-shippable")[0]
.partition("-enterprise")[0]
)
task["run"]["options"] = [
"version={}".format(release_config["version"]),
"build-number={}".format(release_config["build_number"]),
f"platform={platform}",
]
if task["extra"]["limit-locales"]:
for locale in all_locales:
task["run"]["options"].append(f"limit-locale={locale}")
if "partner" in config.kind and config.params["release_partners"]:
for partner in config.params["release_partners"]:
task["run"]["options"].append(f"partner={partner}")
# The upstream taskIds are stored a special environment variable, because we want to use
# task-reference's to resolve dependencies, but the string handling of MOZHARNESS_OPTIONS
# blocks that. It's space-separated string of ids in the end.
task["worker"]["env"]["UPSTREAM_TASKIDS"] = {
# We only want signing related tasks here, not build (used by mac builds for signing artifact resolution)
"task-reference": " ".join(
[
f"<{dep}>"
for dep in task["dependencies"]
if ("signing" in dep or "notarization" in dep)
]
)
}
# Forward the release type for bouncer product construction
task["worker"]["env"]["RELEASE_TYPE"] = config.params["release_type"]
yield task
@transforms.add
def add_macos_signing_artifacts(config, tasks):
for task in tasks:
if "macosx" not in task["name"]:
yield task
continue
build_dep = None
for dep_task in get_dependencies(config, task):
if dep_task.kind == "build":
build_dep = dep_task
break
assert build_dep, f"repackage job {task['name']} has no build dependency"
for path, artifact in build_dep.task["payload"]["artifacts"].items():
if path.startswith("public/build/security/"):
task["worker"].setdefault("artifacts", []).append(
{
"name": path,
"path": artifact["path"],
"type": "file",
}
)
yield task