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)
|
req = urllib.request.Request(url, data=data, headers=headers, method=method)
|
||||||
try:
|
try:
|
||||||
resp = urllib.request.urlopen(req, context=SSL_CTX, timeout=60)
|
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:
|
except urllib.error.HTTPError as e:
|
||||||
body = e.read().decode()
|
body = e.read().decode()
|
||||||
return {'error': True, 'code': e.code, 'message': body[:300]}
|
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')
|
release_id = release_result.get('id')
|
||||||
asset_status = 'skipped'
|
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
|
# Upload asset using multipart
|
||||||
boundary = '----FormBoundary7MA4YWxkTrZu0gW'
|
boundary = '----FormBoundary7MA4YWxkTrZu0gW'
|
||||||
body = (
|
body = (
|
||||||
@@ -264,7 +275,7 @@ def build_and_publish(module, version):
|
|||||||
asset_status = 'uploaded'
|
asset_status = 'uploaded'
|
||||||
except urllib.error.HTTPError as e:
|
except urllib.error.HTTPError as e:
|
||||||
asset_status = f'error:{e.code}'
|
asset_status = f'error:{e.code}'
|
||||||
elif release_result.get('error'):
|
else:
|
||||||
asset_status = f'release_failed:{release_result.get("message","")[:100]}'
|
asset_status = f'release_failed:{release_result.get("message","")[:100]}'
|
||||||
|
|
||||||
# 7. Update DB
|
# 7. Update DB
|
||||||
@@ -309,7 +320,7 @@ def deploy_to_customer(customer, module, version):
|
|||||||
for asset in releases.get('assets', []):
|
for asset in releases.get('assets', []):
|
||||||
if asset['name'].endswith('.zip'):
|
if asset['name'].endswith('.zip'):
|
||||||
zip_url = asset['browser_download_url']
|
zip_url = asset['browser_download_url']
|
||||||
break
|
# Don't break - take the last ZIP (newest upload) in case of duplicates
|
||||||
|
|
||||||
if not zip_url:
|
if not zip_url:
|
||||||
return {'status': 'error', 'step': 'find_zip', 'message': 'No ZIP asset in release'}
|
return {'status': 'error', 'step': 'find_zip', 'message': 'No ZIP asset in release'}
|
||||||
|
|||||||
Reference in New Issue
Block a user