ci: add 3-try retry loop and timeouts for ISO release upload
Tests / tests (push) Successful in 2m17s

This commit is contained in:
alvinlollo
2026-09-22 22:06:33 +10:00
parent c71168371d
commit 0755091721
+86 -14
View File
@@ -90,11 +90,22 @@ jobs:
TAG_NAME: ${{ steps.tag.outputs.tag_name }} TAG_NAME: ${{ steps.tag.outputs.tag_name }}
RELEASE_NAME: ${{ steps.tag.outputs.release_name }} RELEASE_NAME: ${{ steps.tag.outputs.release_name }}
run: | run: |
set -euo pipefail set -eu
shopt -s nullglob shopt -s nullglob
test -n "$GITEA_TOKEN" tmpdir=$(mktemp -d)
test -n "$TAG_NAME" trap 'rm -rf "$tmpdir"' EXIT
test -n "$RELEASE_NAME" if [ -z "$GITEA_TOKEN" ]; then
echo "❌ GITEA_TOKEN is empty" >&2
exit 1
fi
if [ -z "$TAG_NAME" ]; then
echo "❌ TAG_NAME is empty" >&2
exit 1
fi
if [ -z "$RELEASE_NAME" ]; then
echo "❌ RELEASE_NAME is empty" >&2
exit 1
fi
# Pre-flight: confirm the internal Gitea API is reachable so failures are clear # Pre-flight: confirm the internal Gitea API is reachable so failures are clear
if ! curl -sfS -o /dev/null "$GITEA_API/version"; then if ! curl -sfS -o /dev/null "$GITEA_API/version"; then
@@ -119,6 +130,10 @@ jobs:
exit 1 exit 1
fi fi
sha=$(sha256sum "$iso" | awk '{print $1}') sha=$(sha256sum "$iso" | awk '{print $1}')
if [ -z "$sha" ]; then
echo "❌ Failed to compute SHA-256 for '$iso'" >&2
exit 1
fi
echo " ✅ $fname: $(( size / 1024 / 1024 )) MiB, sha256=$sha" echo " ✅ $fname: $(( size / 1024 / 1024 )) MiB, sha256=$sha"
sha256sums+=("$sha") sha256sums+=("$sha")
done done
@@ -130,28 +145,85 @@ jobs:
body+="$line" body+="$line"
done done
# Create the release # Create the release (curl result written to a file, checked with if)
payload=$(jq -nc --arg tag "$TAG_NAME" --arg name "$RELEASE_NAME" --arg body "$body" \ payload=$(jq -nc --arg tag "$TAG_NAME" --arg name "$RELEASE_NAME" --arg body "$body" \
'{tag_name:$tag,name:$name,body:$body}') '{tag_name:$tag,name:$name,body:$body}')
RELEASE_ID=$(curl -sf -X POST \ if ! curl -sf -X POST \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
"$GITEA_API/repos/$REPOSITORY/releases" \ "$GITEA_API/repos/$REPOSITORY/releases" \
-d "$payload" | jq -er '.id') -d "$payload" -o "$tmpdir/release.json"; then
echo "❌ Failed to create release $TAG_NAME" >&2
exit 1
fi
if ! RELEASE_ID=$(jq -er '.id' "$tmpdir/release.json"); then
echo "❌ Release response contained no id" >&2
exit 1
fi
echo " ✅ Created release $TAG_NAME (ID: $RELEASE_ID)" echo " ✅ Created release $TAG_NAME (ID: $RELEASE_ID)"
# Upload each ISO as a release asset # Upload each ISO as a release asset, up to 3 attempts per file
MAX_ATTEMPTS=3
for i in "${!isos[@]}"; do for i in "${!isos[@]}"; do
fname=$(basename "${isos[$i]}") iso=${isos[$i]}
size=$(stat -c %s "${isos[$i]}") fname=$(basename "$iso")
size=$(stat -c %s "$iso")
echo "Uploading $fname ($(( size / 1024 / 1024 )) MiB) to release $TAG_NAME..." echo "Uploading $fname ($(( size / 1024 / 1024 )) MiB) to release $TAG_NAME..."
curl -sf -X POST \ uploaded=0
attempt=1
while [ "$attempt" -le "$MAX_ATTEMPTS" ]; do
# A previous attempt may have saved the asset but lost the
# response; Gitea rejects duplicate names, so only after the
# first attempt check for and remove same-name leftovers
if [ "$attempt" -gt 1 ]; then
if curl -sf -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
-o "$tmpdir/assets.json"; then
asset_ids=$(jq -r --arg name "$fname" \
'.[] | select(.name == $name) | .id' "$tmpdir/assets.json")
while read -r asset_id; do
if [ -n "$asset_id" ]; then
echo " ↻ Removing leftover asset id=$asset_id from a previous attempt"
if ! curl -sf -X DELETE -H "Authorization: token $GITEA_TOKEN" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets/$asset_id" \
-o /dev/null; then
echo " ⚠️ Could not remove leftover asset id=$asset_id (continuing)" >&2
fi
fi
done <<< "$asset_ids"
fi
fi
if curl -sf -X POST --max-time 600 \
-H "Authorization: token $GITEA_TOKEN" \ -H "Authorization: token $GITEA_TOKEN" \
-F "attachment=@${isos[$i]}" \ -F "attachment=@$iso" \
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" | jq -er '.browser_download_url' "$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
echo " ✅ Uploaded $fname" -o "$tmpdir/upload.json"; then
if download_url=$(jq -er '.browser_download_url' "$tmpdir/upload.json"); then
echo " ✅ Uploaded $fname (attempt $attempt/$MAX_ATTEMPTS): $download_url"
uploaded=1
break
fi
echo " ⚠️ Upload of $fname returned no download URL (attempt $attempt/$MAX_ATTEMPTS)" >&2
else
echo " ⚠️ Upload of $fname failed (attempt $attempt/$MAX_ATTEMPTS)" >&2
fi
if [ "$attempt" -lt "$MAX_ATTEMPTS" ]; then
sleep $(( attempt * 10 ))
fi
attempt=$(( attempt + 1 ))
done done
if [ "$uploaded" -ne 1 ]; then
echo "❌ Failed to upload $fname after $MAX_ATTEMPTS attempts — aborting." >&2
exit 1
fi
done
echo "✅ All ISOs uploaded to release $TAG_NAME"
exit 0
- name: Keep only latest 2 releases - name: Keep only latest 2 releases
if: success() if: success()
env: env: