mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	auto merge PRs
This commit is contained in:
		
							parent
							
								
									c118d6ad0b
								
							
						
					
					
						commit
						337e4fbc49
					
				
							
								
								
									
										113
									
								
								.github/workflows/auto_merge_approved_prs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								.github/workflows/auto_merge_approved_prs.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | ||||
| name: Auto Merge Approved PRs | ||||
| 
 | ||||
| on: | ||||
|   schedule: | ||||
|     - cron: '0 */2 * * *'  # Every 2 hours | ||||
|   workflow_dispatch:  # Allow manual triggering | ||||
| 
 | ||||
| permissions: | ||||
|   contents: write | ||||
|   pull-requests: write | ||||
|   actions: read | ||||
| 
 | ||||
| jobs: | ||||
|   auto-merge-prs: | ||||
|     runs-on: ubuntu-latest | ||||
|      | ||||
|     steps: | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@v4 | ||||
|         with: | ||||
|           token: ${{ secrets.GITHUB_TOKEN }} | ||||
|        | ||||
|       - name: Check for running workflows | ||||
|         id: check_workflows | ||||
|         run: | | ||||
|           # Get all running workflows except this one | ||||
|           running_workflows=$(gh run list --status in_progress --json workflowName,name --jq '.[].name' | grep -v "Auto Merge Approved PRs" | wc -l) | ||||
|           echo "running_workflows=$running_workflows" >> $GITHUB_OUTPUT | ||||
|            | ||||
|           if [ "$running_workflows" -gt 0 ]; then | ||||
|             echo "Found $running_workflows running workflows. Exiting to avoid conflicts." | ||||
|             exit 0 | ||||
|           fi | ||||
|         env: | ||||
|           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|        | ||||
|       - name: Get repository owner | ||||
|         id: repo_info | ||||
|         run: | | ||||
|           repo_owner=$(gh repo view --json owner --jq '.owner.login') | ||||
|           echo "repo_owner=$repo_owner" >> $GITHUB_OUTPUT | ||||
|         env: | ||||
|           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
|        | ||||
|       - name: Find and merge approved PRs | ||||
|         run: | | ||||
|           repo_owner="${{ steps.repo_info.outputs.repo_owner }}" | ||||
|           merged_count=0 | ||||
|           max_merges=2 | ||||
|            | ||||
|           echo "Repository owner: $repo_owner" | ||||
|           echo "Looking for PRs with 👍 emoji from owner..." | ||||
|            | ||||
|           # Get all open PRs | ||||
|           prs=$(gh pr list --state open --json number,title,url) | ||||
|            | ||||
|           if [ "$prs" = "[]" ]; then | ||||
|             echo "No open PRs found." | ||||
|             exit 0 | ||||
|           fi | ||||
|            | ||||
|           # Process each PR | ||||
|           echo "$prs" | jq -r '.[] | @base64' | while IFS= read -r pr_data; do | ||||
|             if [ "$merged_count" -ge "$max_merges" ]; then | ||||
|               echo "Reached maximum merge limit ($max_merges). Stopping." | ||||
|               break | ||||
|             fi | ||||
|              | ||||
|             pr_info=$(echo "$pr_data" | base64 --decode) | ||||
|             pr_number=$(echo "$pr_info" | jq -r '.number') | ||||
|             pr_title=$(echo "$pr_info" | jq -r '.title') | ||||
|             pr_url=$(echo "$pr_info" | jq -r '.url') | ||||
|              | ||||
|             echo "Checking PR #$pr_number: $pr_title" | ||||
|              | ||||
|             # Get all comments for this PR | ||||
|             comments=$(gh pr view "$pr_number" --json comments --jq '.comments[] | select(.author.login == "'"$repo_owner"'") | .body') | ||||
|              | ||||
|             # Check if any comment from the owner contains the 👍 emoji | ||||
|             has_thumbs_up=false | ||||
|             while IFS= read -r comment; do | ||||
|               if echo "$comment" | grep -q "👍"; then | ||||
|                 has_thumbs_up=true | ||||
|                 echo "Found 👍 emoji from owner in PR #$pr_number" | ||||
|                 break | ||||
|               fi | ||||
|             done <<< "$comments" | ||||
|              | ||||
|             if [ "$has_thumbs_up" = true ]; then | ||||
|               echo "Attempting to merge PR #$pr_number..." | ||||
|                | ||||
|               # Check if PR can be merged | ||||
|               pr_mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable') | ||||
|                | ||||
|               if [ "$pr_mergeable" = "MERGEABLE" ]; then | ||||
|                 # Merge the PR | ||||
|                 if gh pr merge "$pr_number" --merge --delete-branch; then | ||||
|                   echo "Successfully merged PR #$pr_number: $pr_title" | ||||
|                   merged_count=$((merged_count + 1)) | ||||
|                 else | ||||
|                   echo "Failed to merge PR #$pr_number: $pr_title" | ||||
|                 fi | ||||
|               else | ||||
|                 echo "PR #$pr_number is not mergeable (status: $pr_mergeable)" | ||||
|               fi | ||||
|             else | ||||
|               echo "No 👍 emoji found from owner in PR #$pr_number" | ||||
|             fi | ||||
|           done | ||||
|            | ||||
|           echo "Auto-merge process completed. Merged $merged_count PRs." | ||||
|         env: | ||||
|           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user