scriptworker 63.1.0__tar.gz → 63.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {scriptworker-63.1.0 → scriptworker-63.3.0}/HISTORY.rst +36 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/PKG-INFO +1 -1
- {scriptworker-63.1.0 → scriptworker-63.3.0}/pyproject.toml +1 -1
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/artifacts.py +23 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/config.py +13 -2
- scriptworker-63.3.0/src/scriptworker/constants.py +840 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/context.py +17 -9
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/cot/verify.py +3 -6
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/log.py +13 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/task.py +3 -2
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/utils.py +65 -14
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/worker.py +22 -4
- scriptworker-63.1.0/src/scriptworker/constants.py +0 -811
- {scriptworker-63.1.0 → scriptworker-63.3.0}/.gitignore +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/CONTRIBUTING.rst +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/LICENSE +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/README.rst +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/renovate.json +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/scripts/gen_ed25519_key.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/scriptworker.yaml.tmpl +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/__init__.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/client.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/cot/__init__.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/cot/generate.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/data/cot_v1_schema.json +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/data/scriptworker_task_schema.json +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/ed25519.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/exceptions.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/github.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/src/scriptworker/task_process.py +0 -0
- {scriptworker-63.1.0 → scriptworker-63.3.0}/tox.ini +0 -0
|
@@ -4,6 +4,42 @@ Change Log
|
|
|
4
4
|
All notable changes to this project will be documented in this file.
|
|
5
5
|
This project adheres to `Semantic Versioning <http://semver.org/>`__.
|
|
6
6
|
|
|
7
|
+
63.3.0 - 2026-08-05
|
|
8
|
+
-------------------
|
|
9
|
+
|
|
10
|
+
Added
|
|
11
|
+
~~~~~
|
|
12
|
+
|
|
13
|
+
- `cot_product` is now optional. When unset, `by-cot-product` mappings resolve to
|
|
14
|
+
`None`, and `check_config` requires `verify_chain_of_trust` to be off (#810)
|
|
15
|
+
- `download_file` accepts an optional `expected_content_type` kwarg that rejects
|
|
16
|
+
`text/html` responses when another type was requested (#791)
|
|
17
|
+
|
|
18
|
+
Fixed
|
|
19
|
+
~~~~~
|
|
20
|
+
|
|
21
|
+
- Event loop creation in a fresh process, which raised a `RuntimeError` on
|
|
22
|
+
Python 3.14 since `asyncio.get_event_loop()` no longer creates a loop (#811)
|
|
23
|
+
- JSON/YAML load failures now include the file path and, for downloaded
|
|
24
|
+
artifacts, the source URL in the error message (#791)
|
|
25
|
+
- `load_json_or_yaml_from_url` retries the download when the cached file fails
|
|
26
|
+
to parse, turning transient artifact-server glitches into self-healing
|
|
27
|
+
retries instead of hard failures (#791)
|
|
28
|
+
|
|
29
|
+
63.2.0 - 2026-06-18
|
|
30
|
+
-------------------
|
|
31
|
+
|
|
32
|
+
Added
|
|
33
|
+
~~~~~
|
|
34
|
+
- When Chain of Trust verification fails, the log is also exposed as public/logs/live_backing.log
|
|
35
|
+
(https://bugzilla.mozilla.org/show_bug.cgi?id=2039779)
|
|
36
|
+
- Values for ESR 153 to scriptworker constants (https://bugzilla.mozilla.org/show_bug.cgi?id=2046216)
|
|
37
|
+
|
|
38
|
+
Fixed
|
|
39
|
+
~~~~~
|
|
40
|
+
- The TASKCLUSTER_CREDENTIALS_FD feature uses a regular temporary file rather than a memfd, to
|
|
41
|
+
make things work again on macOS
|
|
42
|
+
|
|
7
43
|
63.1.0 - 2026-05-26
|
|
8
44
|
-------------------
|
|
9
45
|
|
|
@@ -183,6 +183,29 @@ async def create_artifact(context, path, target_path, content_type, content_enco
|
|
|
183
183
|
raise ScriptWorkerRetryException("Bad status {}".format(resp.status))
|
|
184
184
|
|
|
185
185
|
|
|
186
|
+
async def create_link_artifact(context, target_path, link_to, content_type, expires=None):
|
|
187
|
+
"""Create a Taskcluster link artifact that redirects to another artifact in the same task.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
context (scriptworker.context.Context): the scriptworker context.
|
|
191
|
+
target_path (str): the artifact name to create (e.g., ``public/logs/live_backing.log``).
|
|
192
|
+
link_to (str): the artifact name to link to (e.g., ``public/logs/chain_of_trust.log``).
|
|
193
|
+
content_type (str): Content type (MIME type) of the linked artifact.
|
|
194
|
+
expires (str, optional): ISO datestring of when the artifact expires.
|
|
195
|
+
Defaults to ``context.task["expires"]``.
|
|
196
|
+
|
|
197
|
+
"""
|
|
198
|
+
payload = {
|
|
199
|
+
"storageType": "link",
|
|
200
|
+
"expires": expires or get_expiration_arrow(context).isoformat(),
|
|
201
|
+
"contentType": content_type,
|
|
202
|
+
"artifact": link_to,
|
|
203
|
+
}
|
|
204
|
+
args = [get_task_id(context.claim_task), get_run_id(context.claim_task), target_path, payload]
|
|
205
|
+
log.info("Creating link artifact {} -> {}".format(target_path, link_to))
|
|
206
|
+
await context.temp_queue.createArtifact(*args)
|
|
207
|
+
|
|
208
|
+
|
|
186
209
|
def _craft_artifact_put_headers(content_type, encoding=None):
|
|
187
210
|
log.debug("{} {}".format(content_type, encoding))
|
|
188
211
|
headers = {aiohttp.hdrs.CONTENT_TYPE: content_type}
|
|
@@ -125,11 +125,17 @@ def check_config(config, path):
|
|
|
125
125
|
if key not in DEFAULT_CONFIG:
|
|
126
126
|
messages.append("Unknown key {} in {}!".format(key, path))
|
|
127
127
|
continue
|
|
128
|
+
is_by_cot_product = isinstance(DEFAULT_CONFIG[key], Mapping) and "by-cot-product" in DEFAULT_CONFIG[key]
|
|
128
129
|
if value is None:
|
|
129
|
-
|
|
130
|
+
if key != "cot_product" and not is_by_cot_product:
|
|
131
|
+
messages.append(_VALUE_UNDEFINED_MESSAGE.format(path=path, key=key))
|
|
130
132
|
else:
|
|
131
133
|
value_type = type(value)
|
|
132
|
-
if
|
|
134
|
+
if key == "cot_product":
|
|
135
|
+
# `cot_product`'s own default is `None`, so its type can't be
|
|
136
|
+
# inferred from `DEFAULT_CONFIG` the way other keys' can.
|
|
137
|
+
default_type = str
|
|
138
|
+
elif is_by_cot_product:
|
|
133
139
|
default_type = type(DEFAULT_CONFIG[key]["by-cot-product"][config["cot_product"]])
|
|
134
140
|
else:
|
|
135
141
|
default_type = type(DEFAULT_CONFIG[key])
|
|
@@ -139,6 +145,8 @@ def check_config(config, path):
|
|
|
139
145
|
messages.append(_VALUE_UNDEFINED_MESSAGE.format(path=path, key=key))
|
|
140
146
|
if key in ("provisioner_id", "worker_group", "worker_type", "worker_id") and not _is_id_valid(value):
|
|
141
147
|
messages.append('{} doesn\'t match "{}" (required by Taskcluster)'.format(key, _GENERIC_ID_REGEX.pattern))
|
|
148
|
+
if config.get("cot_product") is None and config.get("verify_chain_of_trust"):
|
|
149
|
+
messages.append("{} verify_chain_of_trust can't be True when cot_product is not set!".format(path))
|
|
142
150
|
return messages
|
|
143
151
|
|
|
144
152
|
|
|
@@ -161,6 +169,9 @@ def apply_product_config(config):
|
|
|
161
169
|
|
|
162
170
|
for key in config:
|
|
163
171
|
if isinstance(config[key], Mapping) and "by-cot-product" in config[key]:
|
|
172
|
+
if cot_product is None:
|
|
173
|
+
config[key] = None
|
|
174
|
+
continue
|
|
164
175
|
try:
|
|
165
176
|
config[key] = config[key]["by-cot-product"][cot_product]
|
|
166
177
|
except KeyError:
|