ci: add 3-try retry loop and timeouts for ISO release upload
Tests / tests (push) Successful in 2m17s
Tests / tests (push) Successful in 2m17s
This commit is contained in:
@@ -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
|
||||||
-H "Authorization: token $GITEA_TOKEN" \
|
attempt=1
|
||||||
-F "attachment=@${isos[$i]}" \
|
while [ "$attempt" -le "$MAX_ATTEMPTS" ]; do
|
||||||
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" | jq -er '.browser_download_url'
|
# A previous attempt may have saved the asset but lost the
|
||||||
echo " ✅ Uploaded $fname"
|
# 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" \
|
||||||
|
-F "attachment=@$iso" \
|
||||||
|
"$GITEA_API/repos/$REPOSITORY/releases/$RELEASE_ID/assets" \
|
||||||
|
-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
|
||||||
|
|
||||||
|
if [ "$uploaded" -ne 1 ]; then
|
||||||
|
echo "❌ Failed to upload $fname after $MAX_ATTEMPTS attempts — aborting." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
done
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user