From 7daa241dd9c6b31b17bd366c9170c2521758effb Mon Sep 17 00:00:00 2001 From: "privilegedescalation-ceo[bot]" <269721483+privilegedescalation-ceo[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 14:33:44 +0000 Subject: [PATCH] fix: address remaining QA findings in stale-release-cleanup - Add ::warning:: annotation for git push --delete failures - Change dry_run input to type: boolean for proper validation - Handle null dry_run in scheduled runs (default to false) Co-Authored-By: Claude Opus 4.7 --- .github/workflows/stale-release-cleanup.yaml | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/stale-release-cleanup.yaml diff --git a/.github/workflows/stale-release-cleanup.yaml b/.github/workflows/stale-release-cleanup.yaml new file mode 100644 index 0000000..2d43cf6 --- /dev/null +++ b/.github/workflows/stale-release-cleanup.yaml @@ -0,0 +1,66 @@ +name: Stale Release Branch Cleanup + +on: + schedule: + - cron: '0 9 * * 1' # Weekly every Monday at 09:00 UTC + workflow_dispatch: + inputs: + dry_run: + description: 'Dry run (no changes made)' + required: false + default: false + type: boolean + +jobs: + cleanup-stale-branches: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + sparse-checkout: | + .github + sparse-checkout-cone-mode: false + + - name: Fetch all branches + run: git fetch --all --prune + + - name: Find and clean stale release branches + id: stale + env: + DRY_RUN: ${{ github.event.inputs.dry_run || false }} + run: | + DAYS=14 + + # Find release branches older than 14 days not on main + for branch in $(git for-each-ref --format '%(refname:short)' 'refs/heads/release/*' 'refs/heads/v[0-9]*'); do + ts=$(git log -1 --format='%ct' "$branch") + if [ -z "$ts" ]; then + continue + fi + age_days=$(( ($(date +%s) - ts) / 86400 )) + + if [ "$age_days" -gt "$DAYS" ]; then + # Check if branch has been merged into main + if git merge-base --is-ancestor "$branch" main 2>/dev/null; then + echo "Merged branch found: $branch (age: ${age_days}d)" + if [ "$DRY_RUN" == "true" ]; then + echo "Would delete merged branch: $branch" + else + echo "Deleting merged branch: $branch" + if ! git push origin --delete "$branch" 2>&1; then + echo "::warning::Failed to delete branch: $branch" + fi + fi + fi + fi + done + + - name: Report dry run results + if: github.event.inputs.dry_run == 'true' + run: | + echo "Dry run complete. No branches were deleted." + echo "" + echo "Release branches found:" + git for-each-ref --format '%(refname:short) - %(committerdate:relative)' \ + 'refs/heads/release/*' 'refs/heads/v[0-9]*' 2>/dev/null || echo "None found" \ No newline at end of file