Skip to content

Commit f10abc3

Browse files
Enhance release cleanup process with improved error handling, detailed logging, and authentication checks for GitHub CLI
1 parent deb96f7 commit f10abc3

File tree

1 file changed

+67
-21
lines changed

1 file changed

+67
-21
lines changed

.github/workflows/build.yaml

Lines changed: 67 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -194,54 +194,100 @@ jobs:
194194
&& sudo apt install gh -y
195195
196196
- name: Delete old releases
197+
# This step runs after the GitHub CLI setup and release creation
198+
if: github.ref == 'refs/heads/main' && success()
197199
env:
198-
# We need to use a token with sufficient permissions
199-
# Using GITHUB_TOKEN with proper permissions defined at workflow level
200200
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
201201
run: |
202+
set +e # Don't exit on error
203+
204+
echo "::group::Release Cleanup"
205+
202206
# Get current release tag we're creating
203207
current_tag="v${{ env.VERSION }}"
204-
echo "Current release tag: $current_tag"
208+
echo "ℹ️ Current release tag: $current_tag"
209+
210+
# Explicitly authenticate with GitHub CLI using the token
211+
echo "$GITHUB_TOKEN" | gh auth login --with-token
212+
213+
if [ $? -ne 0 ]; then
214+
echo "::warning::Failed to authenticate with GitHub CLI. Skipping release cleanup."
215+
exit 0 # Continue workflow
216+
fi
217+
218+
# List all releases
219+
echo "ℹ️ Listing existing releases..."
220+
221+
# Use simple list format first to check if releases exist
222+
release_count=$(gh release list | wc -l)
223+
224+
if [ $release_count -eq 0 ]; then
225+
echo "ℹ️ No existing releases found. Nothing to clean up."
226+
echo "::endgroup::"
227+
exit 0
228+
fi
205229
206-
# List all releases excluding the current one we're creating
207-
echo "Listing existing releases..."
230+
echo "ℹ️ Found $release_count releases in total"
208231
209-
# Try to get releases, handling potential errors
210-
if ! releases=$(gh release list --limit 100 --exclude-drafts --exclude-pre-releases --json tagName,createdAt); then
211-
echo "::warning::Unable to list releases, skipping cleanup"
232+
# Get detailed release info with JSON
233+
releases=$(gh release list --limit 100 --json tagName,createdAt 2>/dev/null)
234+
235+
if [ $? -ne 0 ] || [ -z "$releases" ]; then
236+
echo "::warning::Unable to get detailed release information. Skipping cleanup."
237+
echo "::endgroup::"
212238
exit 0
213239
fi
214240
215-
# Parse the JSON output and extract tag names sorted by creation date
216-
readarray -t old_releases < <(echo "$releases" | jq -r 'sort_by(.createdAt) | .[].tagName')
241+
# Check if jq command is available
242+
if ! command -v jq &> /dev/null; then
243+
echo "::warning::jq command not found. Installing jq..."
244+
sudo apt-get update && sudo apt-get install -y jq
245+
fi
246+
247+
# Parse releases, handling potential JSON parsing errors
248+
if ! old_releases=($(echo "$releases" | jq -r 'sort_by(.createdAt) | .[].tagName' 2>/dev/null)); then
249+
echo "::warning::Failed to parse release information. Skipping cleanup."
250+
echo "::endgroup::"
251+
exit 0
252+
fi
217253
218-
# Keep no old releases (excluding current new release)
254+
# Number of releases to keep (0 means delete all old releases)
219255
keep=0
220256
count=0
221257
total=${#old_releases[@]}
222258
223-
echo "Found $total existing releases"
259+
echo "ℹ️ Found $total releases after parsing"
224260
225-
# Delete all releases except the most recent 'keep' number
261+
# Delete all releases except the most recent 'keep' number and current release
226262
for tag in "${old_releases[@]}"; do
227-
# Skip the current release if it somehow appears in the list
263+
# Skip the current release
228264
if [[ "$tag" == "$current_tag" ]]; then
229-
echo "Skipping current release: $tag"
265+
echo "ℹ️ Skipping current release: $tag"
230266
continue
231267
fi
232268
233269
((count++))
234270
if ((count > keep)); then
235-
echo "Attempting to delete release: $tag"
236-
if gh release delete "$tag" --yes; then
237-
echo "Successfully deleted release: $tag"
271+
echo "🗑️ Attempting to delete release: $tag"
272+
273+
# Try to delete the release with a timeout
274+
if timeout 30s gh release delete "$tag" --yes; then
275+
echo "✅ Successfully deleted release: $tag"
238276
else
239-
echo "::warning::Failed to delete release $tag - this is non-fatal"
277+
deletion_status=$?
278+
echo "::warning::Failed to delete release $tag (exit code: $deletion_status) - continuing with next release"
240279
fi
280+
281+
# Small delay to avoid rate limiting
282+
sleep 1
241283
else
242-
echo "Keeping release: $tag"
284+
echo "🔒 Keeping release: $tag (within keep limit)"
243285
fi
244286
done
245287
246-
echo "Release cleanup complete"
288+
echo "🏁 Release cleanup completed"
289+
echo "::endgroup::"
290+
291+
# Always return success to avoid workflow failures
292+
exit 0
247293

0 commit comments

Comments
 (0)