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:
@@ -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'}
|
||||
|
||||
Reference in New Issue
Block a user