diff --git a/.github/workflows/update-version.yml b/.github/workflows/update-version.yml index b291946f..6b63cf8f 100644 --- a/.github/workflows/update-version.yml +++ b/.github/workflows/update-version.yml @@ -210,130 +210,85 @@ jobs: fi fi - - name: Enable Auto-merge + - name: Auto-merge PR if: steps.create_pr.outputs.pr_number != '' env: GH_TOKEN: ${{ secrets.GH_PAT || secrets.GITHUB_TOKEN }} run: | PR_NUMBER="${{ steps.create_pr.outputs.pr_number }}" - VERSION="${{ steps.update_version.outputs.version }}" + echo "🔀 Attempting to merge PR #$PR_NUMBER via squash..." - echo "🔀 Enabling auto-merge for PR #$PR_NUMBER (v$VERSION)..." - - # Enable auto-merge with squash method + # Check PR status set +e - AUTO_MERGE_OUTPUT=$(gh pr merge "$PR_NUMBER" \ - --repo "${{ github.repository }}" \ - --squash \ - --auto \ - --delete-branch 2>&1) - AUTO_MERGE_EXIT=$? + PR_STATE=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json state --jq '.state' 2>&1) + PR_VIEW_EXIT=$? set -e - if [ $AUTO_MERGE_EXIT -eq 0 ]; then - echo "✅ Auto-merge enabled for PR #$PR_NUMBER (v$VERSION)" - echo "$AUTO_MERGE_OUTPUT" - echo "⏳ PR will be merged automatically once all checks pass" + if [ $PR_VIEW_EXIT -ne 0 ] || [ -z "$PR_STATE" ]; then + echo "⚠️ Could not retrieve PR state, attempting merge anyway..." else - echo "::warning::Failed to enable auto-merge for PR #$PR_NUMBER (v$VERSION)" - echo "::group::Auto-merge Error Output" - echo "$AUTO_MERGE_OUTPUT" - echo "::endgroup::" - - # Fall back to waiting for checks and then merging - echo "🔄 Falling back to wait-and-merge strategy..." - - # Wait for checks to start - echo "⏳ Waiting 30 seconds for checks to start..." - sleep 30 - - # Wait for checks to complete (max 5 minutes) - echo "⏳ Waiting for checks to complete..." - WAIT_COUNT=0 - MAX_WAIT=60 # 60 * 5 seconds = 5 minutes - - while [ $WAIT_COUNT -lt $MAX_WAIT ]; do - set +e - CHECK_STATUS=$(gh pr checks "$PR_NUMBER" --repo "${{ github.repository }}" 2>&1) - CHECK_EXIT=$? - set -e - - if [ $CHECK_EXIT -eq 0 ]; then - echo "📊 Current check status:" - echo "$CHECK_STATUS" - - # Check if all checks passed - if echo "$CHECK_STATUS" | grep -q "All checks have passed"; then - echo "✅ All checks passed!" - break - fi - - # Check if any check failed - if echo "$CHECK_STATUS" | grep -qE "(fail|failure|error)"; then - echo "❌ Some checks failed, aborting merge" - exit 1 - fi - fi - - WAIT_COUNT=$((WAIT_COUNT + 1)) - echo "⏳ Waiting... ($WAIT_COUNT/$MAX_WAIT)" - sleep 5 - done - - if [ $WAIT_COUNT -ge $MAX_WAIT ]; then - echo "::warning::Timeout waiting for checks to complete" - echo "::warning::PR #$PR_NUMBER requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" + echo "📊 PR State: $PR_STATE" + if [ "$PR_STATE" != "OPEN" ]; then + echo "⚠️ PR is not open (state: $PR_STATE), skipping merge" exit 0 fi + fi + + # Brief wait for GitHub to compute PR mergeability + sleep 5 + + # Check if PR is mergeable + set +e + MERGEABLE=$(gh pr view "$PR_NUMBER" --repo "${{ github.repository }}" --json mergeable --jq '.mergeable' 2>&1) + set -e + echo "📊 Mergeable: $MERGEABLE" + + # Attempt merge with error handling + set +e + MERGE_OUTPUT=$(gh pr merge "$PR_NUMBER" \ + --repo "${{ github.repository }}" \ + --squash \ + --delete-branch \ + --yes 2>&1) + MERGE_EXIT=$? + set -e + + if [ $MERGE_EXIT -eq 0 ]; then + echo "✅ PR #$PR_NUMBER merged successfully" + echo "$MERGE_OUTPUT" + else + echo "::warning::Standard merge failed for PR #$PR_NUMBER" + echo "::group::Merge Error Output" + echo "$MERGE_OUTPUT" + echo "::endgroup::" - # Try to merge now that checks passed - echo "🔀 Attempting to merge PR #$PR_NUMBER..." + # Try with admin flag (bypasses branch protection if user has admin rights) + echo "🔧 Attempting merge with admin override..." set +e - MERGE_OUTPUT=$(gh pr merge "$PR_NUMBER" \ + ADMIN_OUTPUT=$(gh pr merge "$PR_NUMBER" \ --repo "${{ github.repository }}" \ --squash \ --delete-branch \ - --yes 2>&1) - MERGE_EXIT=$? + --admin 2>&1) + ADMIN_EXIT=$? set -e - if [ $MERGE_EXIT -eq 0 ]; then - echo "✅ PR #$PR_NUMBER (v$VERSION) merged successfully" - echo "$MERGE_OUTPUT" + if [ $ADMIN_EXIT -eq 0 ]; then + echo "✅ PR #$PR_NUMBER merged successfully with admin override" + echo "$ADMIN_OUTPUT" else - echo "::error::Failed to merge PR #$PR_NUMBER (v$VERSION)" - echo "::group::Merge Error Output" - echo "$MERGE_OUTPUT" + echo "::error::Failed to merge PR #$PR_NUMBER even with admin override" + echo "::group::Admin Merge Error Output" + echo "$ADMIN_OUTPUT" echo "::endgroup::" - - # Try with admin flag - echo "🔧 Attempting merge with admin override..." - set +e - ADMIN_OUTPUT=$(gh pr merge "$PR_NUMBER" \ - --repo "${{ github.repository }}" \ - --squash \ - --delete-branch \ - --admin 2>&1) - ADMIN_EXIT=$? - set -e - - if [ $ADMIN_EXIT -eq 0 ]; then - echo "✅ PR #$PR_NUMBER (v$VERSION) merged with admin override" - echo "$ADMIN_OUTPUT" - else - echo "::error::Failed to merge even with admin override" - echo "::group::Admin Merge Error Output" - echo "$ADMIN_OUTPUT" - echo "::endgroup::" - echo "::warning::Consider configuring a Personal Access Token (PAT) with full repo permissions as GH_PAT secret" - echo "::warning::PR #$PR_NUMBER requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" - exit 0 - fi + echo "::warning::Consider configuring a Personal Access Token (PAT) with full repo permissions as GH_PAT secret" + echo "::warning::PR #$PR_NUMBER was created but requires manual merge: https://github.com/${{ github.repository }}/pull/$PR_NUMBER" + # Don't exit with error to avoid blocking the workflow + exit 0 fi fi - name: Summary - if: always() run: | echo "### WhatsApp Version Update" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY @@ -352,7 +307,7 @@ jobs: fi if [ "$HAS_CHANGES" == "true" ]; then - echo "✅ New version detected and PR created with auto-merge" >> $GITHUB_STEP_SUMMARY + echo "✅ New version detected and PR created" >> $GITHUB_STEP_SUMMARY elif [ "$FORCE_MODE" == "true" ]; then echo "🔄 Force mode: PR created (no version change)" >> $GITHUB_STEP_SUMMARY else