scriptworker 63.4.1__tar.gz → 63.4.3__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.
Files changed (30) hide show
  1. {scriptworker-63.4.1 → scriptworker-63.4.3}/HISTORY.rst +17 -0
  2. {scriptworker-63.4.1 → scriptworker-63.4.3}/PKG-INFO +1 -1
  3. {scriptworker-63.4.1 → scriptworker-63.4.3}/pyproject.toml +1 -1
  4. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/artifacts.py +4 -34
  5. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/constants.py +16 -3
  6. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/cot/verify.py +5 -1
  7. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/github.py +2 -0
  8. {scriptworker-63.4.1 → scriptworker-63.4.3}/.gitignore +0 -0
  9. {scriptworker-63.4.1 → scriptworker-63.4.3}/CONTRIBUTING.rst +0 -0
  10. {scriptworker-63.4.1 → scriptworker-63.4.3}/LICENSE +0 -0
  11. {scriptworker-63.4.1 → scriptworker-63.4.3}/README.rst +0 -0
  12. {scriptworker-63.4.1 → scriptworker-63.4.3}/renovate.json +0 -0
  13. {scriptworker-63.4.1 → scriptworker-63.4.3}/scripts/gen_ed25519_key.py +0 -0
  14. {scriptworker-63.4.1 → scriptworker-63.4.3}/scriptworker.yaml.tmpl +0 -0
  15. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/__init__.py +0 -0
  16. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/client.py +0 -0
  17. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/config.py +0 -0
  18. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/context.py +0 -0
  19. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/cot/__init__.py +0 -0
  20. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/cot/generate.py +0 -0
  21. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/data/cot_v1_schema.json +0 -0
  22. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/data/scriptworker_task_schema.json +0 -0
  23. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/ed25519.py +0 -0
  24. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/exceptions.py +0 -0
  25. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/log.py +0 -0
  26. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/task.py +0 -0
  27. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/task_process.py +0 -0
  28. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/utils.py +0 -0
  29. {scriptworker-63.4.1 → scriptworker-63.4.3}/src/scriptworker/worker.py +0 -0
  30. {scriptworker-63.4.1 → scriptworker-63.4.3}/tox.ini +0 -0
@@ -4,6 +4,23 @@ 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.4.3 - 2026-09-02
8
+ -------------------
9
+
10
+ Fixed
11
+ ~~~~~
12
+
13
+ - Added 'thunderbird' as a secondary owner for enterprise repos
14
+
15
+ 63.4.2 - 2026-08-12
16
+ -------------------
17
+
18
+ Fixed
19
+ ~~~~~
20
+
21
+ - Reverted #815 for permanent bustage when uploading logs (#821)
22
+ - Don't raise on mismatched source if no repositories configured (#820)
23
+
7
24
  63.4.1 - 2026-08-11
8
25
  -------------------
9
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: scriptworker
3
- Version: 63.4.1
3
+ Version: 63.4.3
4
4
  Summary: Taskcluster scriptworker
5
5
  Author-email: Mozilla Release Engineering <releng@mozilla.com>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "scriptworker"
3
- version = "63.4.1"
3
+ version = "63.4.3"
4
4
  description = "Taskcluster scriptworker"
5
5
  authors = [
6
6
  { name = "Mozilla Release Engineering", email = "releng@mozilla.com" },
@@ -6,7 +6,6 @@ in S3.
6
6
  """
7
7
 
8
8
  import asyncio
9
- import base64
10
9
  import fnmatch
11
10
  import gzip
12
11
  import logging
@@ -22,15 +21,7 @@ from taskcluster.exceptions import TaskclusterFailure
22
21
  from scriptworker.client import validate_artifact_url
23
22
  from scriptworker.exceptions import DownloadError, ScriptWorkerRetryException, ScriptWorkerTaskException
24
23
  from scriptworker.task import get_decision_task_id, get_run_id, get_task_id
25
- from scriptworker.utils import (
26
- add_enumerable_item_to_dict,
27
- download_file,
28
- get_hash,
29
- get_loggable_url,
30
- raise_future_exceptions,
31
- retry_async,
32
- semaphore_wrapper,
33
- )
24
+ from scriptworker.utils import add_enumerable_item_to_dict, download_file, get_loggable_url, raise_future_exceptions, retry_async, semaphore_wrapper
34
25
 
35
26
  log = logging.getLogger(__name__)
36
27
 
@@ -172,8 +163,6 @@ async def create_artifact(context, path, target_path, content_type, content_enco
172
163
  payload = {"storageType": storage_type, "expires": expires or get_expiration_arrow(context).isoformat(), "contentType": content_type}
173
164
  args = [get_task_id(context.claim_task), get_run_id(context.claim_task), target_path, payload]
174
165
 
175
- content_md5 = await asyncio.to_thread(get_content_md5, path)
176
-
177
166
  tc_response = await context.temp_queue.createArtifact(*args)
178
167
  skip_auto_headers = [aiohttp.hdrs.CONTENT_TYPE]
179
168
  loggable_url = get_loggable_url(tc_response["putUrl"])
@@ -183,7 +172,7 @@ async def create_artifact(context, path, target_path, content_type, content_enco
183
172
  async with context.session.put(
184
173
  tc_response["putUrl"],
185
174
  data=fh,
186
- headers=_craft_artifact_put_headers(content_type, content_md5, content_encoding),
175
+ headers=_craft_artifact_put_headers(content_type, content_encoding),
187
176
  skip_auto_headers=skip_auto_headers,
188
177
  compress=False,
189
178
  ) as resp:
@@ -191,12 +180,6 @@ async def create_artifact(context, path, target_path, content_type, content_enco
191
180
  response_text = await resp.text()
192
181
  log.info(response_text)
193
182
  if resp.status not in (200, 204):
194
- if content_md5 is not None and "BadDigest" in (response_text or ""):
195
- log.error(
196
- "{} was corrupted in transit: the storage backend rejected the body as not matching Content-MD5 {}. Retrying.".format(
197
- target_path, content_md5
198
- )
199
- )
200
183
  raise ScriptWorkerRetryException("Bad status {}".format(resp.status))
201
184
 
202
185
 
@@ -223,22 +206,9 @@ async def create_link_artifact(context, target_path, link_to, content_type, expi
223
206
  await context.temp_queue.createArtifact(*args)
224
207
 
225
208
 
226
- def get_content_md5(path):
227
- """Get the base64-encoded md5 digest of a file, formatted for ``Content-MD5``.
228
-
229
- Args:
230
- path (str): the path to the file to digest.
231
-
232
- Returns:
233
- str: the base64-encoded md5 digest.
234
-
235
- """
236
- return base64.b64encode(bytes.fromhex(get_hash(path, hash_alg="md5"))).decode("ascii")
237
-
238
-
239
- def _craft_artifact_put_headers(content_type, content_md5, encoding=None):
209
+ def _craft_artifact_put_headers(content_type, encoding=None):
240
210
  log.debug("{} {}".format(content_type, encoding))
241
- headers = {aiohttp.hdrs.CONTENT_TYPE: content_type, aiohttp.hdrs.CONTENT_MD5: content_md5}
211
+ headers = {aiohttp.hdrs.CONTENT_TYPE: content_type}
242
212
 
243
213
  if encoding is not None:
244
214
  headers[aiohttp.hdrs.CONTENT_ENCODING] = encoding
@@ -335,7 +335,10 @@ DEFAULT_CONFIG: immutabledict[str, Any] = immutabledict(
335
335
  {
336
336
  "schemes": ("https", "ssh"),
337
337
  "netlocs": ("github.com",),
338
- "path_regexes": (r"^(?P<path>/mozilla/enterprise-firefox)(/|.git|$)",),
338
+ "path_regexes": (
339
+ r"^(?P<path>/mozilla/enterprise-firefox)(/|.git|$)",
340
+ r"^(?P<path>/thunderbird/thunderbird-desktop)(/|.git|$)",
341
+ ),
339
342
  }
340
343
  ),
341
344
  ),
@@ -500,7 +503,10 @@ DEFAULT_CONFIG: immutabledict[str, Any] = immutabledict(
500
503
  {
501
504
  "adhoc": "mozilla-releng",
502
505
  "app-services": "mozilla",
503
- "enterprise": "mozilla",
506
+ "enterprise": (
507
+ "mozilla",
508
+ "thunderbird",
509
+ ),
504
510
  "firefox": "",
505
511
  "glean": "mozilla",
506
512
  "mobile": "mozilla-mobile",
@@ -650,7 +656,14 @@ DEFAULT_CONFIG: immutabledict[str, Any] = immutabledict(
650
656
  }
651
657
  ),
652
658
  "app-services": immutabledict({"app-services-repo": ("/mozilla/application-services",)}),
653
- "enterprise": immutabledict({"enterprise-firefox-repo": ("/mozilla/enterprise-firefox",)}),
659
+ "enterprise": immutabledict(
660
+ {
661
+ "enterprise-firefox-repo": (
662
+ "/mozilla/enterprise-firefox",
663
+ "/thunderbird/thunderbird-desktop",
664
+ )
665
+ }
666
+ ),
654
667
  "firefox": immutabledict(
655
668
  {
656
669
  # Which repos can perform release actions?
@@ -1965,7 +1965,11 @@ def get_source_url(obj):
1965
1965
  comm_repo = get_repo(obj.task, source_env_prefix="COMM", repo_type="head")
1966
1966
  match_comm_repo = comm_repo and verify_repo_matches_url(comm_repo, source)
1967
1967
 
1968
- if not match_repo and not match_comm_repo:
1968
+ # Enterprise runs two Decision tasks, a gecko one and a comm one. If
1969
+ # the task has COMM_HEAD_REPOSITORY defined, it comes from the comm
1970
+ # Decision task and its metadata.source must match the comm repository.
1971
+ # Otherwise it must match the enterprise-firefox repository.
1972
+ if (comm_repo and not match_comm_repo) or (not comm_repo and repo and not match_repo):
1969
1973
  raise CoTError(
1970
1974
  "{name} {task_id}: {source_env_prefix} {repo} or {comm_repo} doesn't match source {source}!".format(
1971
1975
  name=obj.name, task_id=obj.task_id, source_env_prefix=source_env_prefix, repo=repo, comm_repo=comm_repo, source=source
@@ -296,6 +296,8 @@ def is_github_repo_owner_the_official_one(context, repo_owner):
296
296
  'This worker does not have a defined owner for official GitHub repositories. Given "official_github_repos_owner": {}'.format(official_repo_owner)
297
297
  )
298
298
 
299
+ elif isinstance(official_repo_owner, tuple):
300
+ return repo_owner in official_repo_owner
299
301
  return official_repo_owner == repo_owner
300
302
 
301
303
 
File without changes
File without changes
File without changes
File without changes