fix: handle duplicate ZIP assets in Gitea releases

- When re-publishing, delete old ZIP assets before uploading new one
- Take last ZIP asset when duplicates exist in deploy flow
- Handle empty response body from DELETE API calls

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-30 11:34:38 +00:00
parent fc28ef2d7c
commit f546b7d660
+15 -4
View File
@@ -126,7 +126,10 @@ def gitea_api(method, path, data=None, raw=False):
req = urllib.request.Request(url, data=data, headers=headers, method=method)
try:
resp = urllib.request.urlopen(req, context=SSL_CTX, timeout=60)
return json.loads(resp.read()) if not raw else resp.read()
body = resp.read()
if raw:
return body
return json.loads(body) if body else {}
except urllib.error.HTTPError as e:
body = e.read().decode()
return {'error': True, 'code': e.code, 'message': body[:300]}
@@ -244,7 +247,15 @@ def build_and_publish(module, version):
})
release_id = release_result.get('id')
asset_status = 'skipped'
if release_id and not release_result.get('error'):
# If release already exists, fetch its ID and delete old ZIP assets
if not release_id or release_result.get('error'):
existing = gitea_api('GET', f'/repos/{GITEA_ORG}/{module}/releases/tags/{tag}')
release_id = existing.get('id')
if release_id:
for old_asset in existing.get('assets', []):
if old_asset['name'].endswith('.zip'):
gitea_api('DELETE', f'/repos/{GITEA_ORG}/{module}/releases/{release_id}/assets/{old_asset["id"]}')
if release_id:
# Upload asset using multipart
boundary = '----FormBoundary7MA4YWxkTrZu0gW'
body = (
@@ -264,7 +275,7 @@ def build_and_publish(module, version):
asset_status = 'uploaded'
except urllib.error.HTTPError as e:
asset_status = f'error:{e.code}'
elif release_result.get('error'):
else:
asset_status = f'release_failed:{release_result.get("message","")[:100]}'
# 7. Update DB
@@ -309,7 +320,7 @@ def deploy_to_customer(customer, module, version):
for asset in releases.get('assets', []):
if asset['name'].endswith('.zip'):
zip_url = asset['browser_download_url']
break
# Don't break - take the last ZIP (newest upload) in case of duplicates
if not zip_url:
return {'status': 'error', 'step': 'find_zip', 'message': 'No ZIP asset in release'}