mirror of
				https://github.com/openimsdk/open-im-server.git
				synced 2025-10-26 21:22:16 +08:00 
			
		
		
		
	update milestone merge contents.
This commit is contained in:
		
							parent
							
								
									4309fb0ae1
								
							
						
					
					
						commit
						252f94be39
					
				
							
								
								
									
										181
									
								
								.github/workflows/merge-from-milestone.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										181
									
								
								.github/workflows/merge-from-milestone.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,4 +1,4 @@ | |||||||
| name: Create Pre-Release PR from Milestone | name: Create Individual PRs from Milestone | ||||||
| 
 | 
 | ||||||
| permissions: | permissions: | ||||||
|   contents: write |   contents: write | ||||||
| @ -9,24 +9,24 @@ on: | |||||||
|   workflow_dispatch: |   workflow_dispatch: | ||||||
|     inputs: |     inputs: | ||||||
|       milestone_name: |       milestone_name: | ||||||
|         description: 'Milestone name to collect closed PRs from' |         description: "Milestone name to collect closed PRs from" | ||||||
|         required: true |         required: true | ||||||
|         default: 'v3.8.2' |         default: "v3.8.4" | ||||||
|       target_branch: |       target_branch: | ||||||
|         description: 'Target branch to merge the consolidated PR' |         description: "Target branch to merge the consolidated PR" | ||||||
|         required: true |         required: true | ||||||
|         default: 'pre-release-v3.8.2' |         default: "pre-release-v3.8.4" | ||||||
| 
 | 
 | ||||||
| env: | env: | ||||||
|   MILESTONE_NAME: ${{ github.event.inputs.milestone_name || 'v3.8.2' }} |   MILESTONE_NAME: ${{ github.event.inputs.milestone_name || 'v3.8.4' }} | ||||||
|   TARGET_BRANCH: ${{ github.event.inputs.target_branch || 'pre-release-v3.8.2' }} |   TARGET_BRANCH: ${{ github.event.inputs.target_branch || 'pre-release-v3.8.4' }} | ||||||
|   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||||||
|   BOT_TOKEN: ${{ secrets.BOT_TOKEN }} |   BOT_TOKEN: ${{ secrets.BOT_TOKEN }} | ||||||
|   LABEL_NAME: cherry-picked |   LABEL_NAME: cherry-picked | ||||||
|   TEMP_DIR: /tmp  # Using /tmp as the temporary directory |   TEMP_DIR: /tmp | ||||||
| 
 | 
 | ||||||
| jobs: | jobs: | ||||||
|   cherry_pick_milestone_prs: |   merge_milestone_prs: | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: Setup temp directory |       - name: Setup temp directory | ||||||
| @ -47,7 +47,6 @@ jobs: | |||||||
| 
 | 
 | ||||||
|       - name: Setup Git User for OpenIM-Robot |       - name: Setup Git User for OpenIM-Robot | ||||||
|         run: | |         run: | | ||||||
|           # Set up Git credentials for the bot |  | ||||||
|           git config --global user.email "OpenIM-Robot@users.noreply.github.com" |           git config --global user.email "OpenIM-Robot@users.noreply.github.com" | ||||||
|           git config --global user.name "OpenIM-Robot" |           git config --global user.name "OpenIM-Robot" | ||||||
| 
 | 
 | ||||||
| @ -83,136 +82,66 @@ jobs: | |||||||
|             if ! echo "$labels" | grep -q "${LABEL_NAME}"; then |             if ! echo "$labels" | grep -q "${LABEL_NAME}"; then | ||||||
|               echo "PR #$pr_number does not have the 'cherry-picked' label. Adding to the list." |               echo "PR #$pr_number does not have the 'cherry-picked' label. Adding to the list." | ||||||
|               echo "$pr_number" >> ${{ env.TEMP_DIR }}/pr_numbers.txt |               echo "$pr_number" >> ${{ env.TEMP_DIR }}/pr_numbers.txt | ||||||
|             else |  | ||||||
|               echo "PR #$pr_number already has the 'cherry-picked' label. Skipping." |  | ||||||
|             fi |             fi | ||||||
|           done |           done | ||||||
| 
 | 
 | ||||||
|           # Sort the filtered PR numbers |  | ||||||
|           sort -n ${{ env.TEMP_DIR }}/pr_numbers.txt -o ${{ env.TEMP_DIR }}/pr_numbers.txt |           sort -n ${{ env.TEMP_DIR }}/pr_numbers.txt -o ${{ env.TEMP_DIR }}/pr_numbers.txt | ||||||
| 
 | 
 | ||||||
|           echo "Filtered and sorted PR numbers:" |       - name: Create Individual PRs | ||||||
|           cat ${{ env.TEMP_DIR }}/pr_numbers.txt || echo "No closed PR numbers found for milestone." |  | ||||||
| 
 |  | ||||||
|       - name: Fetch Merge Commits for PRs and Generate Title and Body |  | ||||||
|         run: | |         run: | | ||||||
|           # Ensure the files are initialized |  | ||||||
|           > ${{ env.TEMP_DIR }}/commit_hashes.txt |  | ||||||
|           > ${{ env.TEMP_DIR }}/pr_title.txt |  | ||||||
|           > ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
| 
 |  | ||||||
|           # Write description to the PR body |  | ||||||
|           echo "### Description:" >> ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
|           echo "Merging PRs from milestone \`$MILESTONE_NAME\` into target branch \`$TARGET_BRANCH\`." >> ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
|           echo "" >> ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
|           echo "### Need Merge PRs:" >> ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
| 
 |  | ||||||
|           pr_numbers_in_title="" |  | ||||||
| 
 |  | ||||||
|           # Process sorted PR numbers and generate commit hashes |  | ||||||
|           for pr_number in $(cat ${{ env.TEMP_DIR }}/pr_numbers.txt); do |           for pr_number in $(cat ${{ env.TEMP_DIR }}/pr_numbers.txt); do | ||||||
|             echo "Processing PR #$pr_number" |  | ||||||
|             pr_details=$(curl -s -H "Authorization: token $BOT_TOKEN" \ |             pr_details=$(curl -s -H "Authorization: token $BOT_TOKEN" \ | ||||||
|               -H "Accept: application/vnd.github+json" \ |               -H "Accept: application/vnd.github+json" \ | ||||||
|               "https://api.github.com/repos/${{ github.repository }}/pulls/$pr_number") |               "https://api.github.com/repos/${{ github.repository }}/pulls/$pr_number") | ||||||
|             pr_title=$(echo "$pr_details" | jq -r '.title') |             pr_title=$(echo "$pr_details" | jq -r '.title') | ||||||
|  |             pr_body=$(echo "$pr_details" | jq -r '.body') | ||||||
|  |             pr_creator=$(echo "$pr_details" | jq -r '.user.login') | ||||||
|             merge_commit=$(echo "$pr_details" | jq -r '.merge_commit_sha') |             merge_commit=$(echo "$pr_details" | jq -r '.merge_commit_sha') | ||||||
|             short_commit_hash=$(echo "$merge_commit" | cut -c 1-7) |             short_commit_hash=$(echo "$merge_commit" | cut -c 1-7) | ||||||
| 
 | 
 | ||||||
|             # Append PR details to the body |  | ||||||
|             echo "- $pr_title: (#$pr_number) ($short_commit_hash)" >> ${{ env.TEMP_DIR }}/pr_body.txt |  | ||||||
| 
 |  | ||||||
|             if [ "$merge_commit" != "null" ];then |             if [ "$merge_commit" != "null" ];then | ||||||
|               echo "$merge_commit" >> ${{ env.TEMP_DIR }}/commit_hashes.txt |               git fetch origin | ||||||
|               echo "#$pr_number" >> ${{ env.TEMP_DIR }}/pr_title.txt |                | ||||||
|               pr_numbers_in_title="$pr_numbers_in_title #$pr_number" |               echo "Checking out target branch: $TARGET_BRANCH" | ||||||
|  |               git checkout $TARGET_BRANCH | ||||||
|  | 
 | ||||||
|  |               echo "Pulling latest changes from target branch: $TARGET_BRANCH" | ||||||
|  |               git pull origin $TARGET_BRANCH | ||||||
|  |                | ||||||
|  |               cherry_pick_branch="cherry-pick-${short_commit_hash}" | ||||||
|  |               git checkout -b $cherry_pick_branch | ||||||
|  | 
 | ||||||
|  |               echo "Cherry-picking commit: $merge_commit" | ||||||
|  |               if ! git cherry-pick "$merge_commit" --strategy=recursive -X theirs; then | ||||||
|  |                 echo "Cherry-pick encountered conflicts, attempting to continue..." | ||||||
|  |                 git cherry-pick --continue || { echo "Cherry-pick failed"; exit 1; } | ||||||
|  |               fi | ||||||
|  | 
 | ||||||
|  |               git cherry-pick "$merge_commit" --strategy=recursive -X theirs || git cherry-pick --continue | ||||||
|  |               git remote set-url origin "https://${BOT_TOKEN}@github.com/${{ github.repository }}.git" | ||||||
|  |                | ||||||
|  |               echo "Pushing branch: $cherry_pick_branch" | ||||||
|  |               git push origin $cherry_pick_branch --force || { echo "Push failed"; exit 1; } | ||||||
|  | 
 | ||||||
|  |               new_pr_title="$pr_title [Created by @$pr_creator from #$pr_number]" | ||||||
|  |               new_pr_body="$pr_body | ||||||
|  |               > This PR cherry-picks commit from original PR #$pr_number." | ||||||
|  | 
 | ||||||
|  |               response=$(curl -s -X POST -H "Authorization: token $BOT_TOKEN" \ | ||||||
|  |                 -H "Accept: application/vnd.github+json" \ | ||||||
|  |                 https://api.github.com/repos/${{ github.repository }}/pulls \ | ||||||
|  |                 -d "$(jq -n --arg title "$new_pr_title" \ | ||||||
|  |                   --arg head "$cherry_pick_branch" \ | ||||||
|  |                   --arg base "$TARGET_BRANCH" \ | ||||||
|  |                   --arg body "$new_pr_body" \ | ||||||
|  |                   '{title: $title, head: $head, base: $base, body: $body}')") | ||||||
|  | 
 | ||||||
|  |               new_pr_number=$(echo "$response" | jq -r '.number') | ||||||
|  |               echo "Created PR #$new_pr_number" | ||||||
|  | 
 | ||||||
|  |               curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" \ | ||||||
|  |                 -H "Accept: application/vnd.github+json" \ | ||||||
|  |                 -d '{"labels": ["milestone-merge"]}' \ | ||||||
|  |                 "https://api.github.com/repos/${{ github.repository }}/issues/$new_pr_number/labels" | ||||||
|             fi |             fi | ||||||
|           done |           done | ||||||
| 
 |  | ||||||
|           commit_hashes=$(cat ${{ env.TEMP_DIR }}/commit_hashes.txt | tr '\n' ' ') |  | ||||||
|           first_commit_hash=$(head -n 1 ${{ env.TEMP_DIR }}/commit_hashes.txt) |  | ||||||
|           cherry_pick_branch="cherry-pick-${first_commit_hash:0:7}" |  | ||||||
|           echo "COMMIT_HASHES=$commit_hashes" >> $GITHUB_ENV |  | ||||||
|           echo "CHERRY_PICK_BRANCH=$cherry_pick_branch" >> $GITHUB_ENV |  | ||||||
|           echo "pr_numbers_in_title=$pr_numbers_in_title" >> $GITHUB_ENV |  | ||||||
| 
 |  | ||||||
|       - name: Pull and Cherry-pick Commits, Then Push |  | ||||||
|         env: |  | ||||||
|           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |  | ||||||
|           BOT_TOKEN: ${{ secrets.BOT_TOKEN }} |  | ||||||
|         run: | |  | ||||||
|           # Fetch and pull the latest changes from the target branch |  | ||||||
|           git fetch origin |  | ||||||
|           git checkout $TARGET_BRANCH |  | ||||||
|           git pull origin $TARGET_BRANCH |  | ||||||
| 
 |  | ||||||
|           # Create a new branch for cherry-picking |  | ||||||
|           git checkout -b $CHERRY_PICK_BRANCH |  | ||||||
| 
 |  | ||||||
|           # Cherry-pick the commits and handle conflicts |  | ||||||
|           for commit_hash in $COMMIT_HASHES; do |  | ||||||
|             echo "Attempting to cherry-pick commit $commit_hash" |  | ||||||
|             if ! git cherry-pick "$commit_hash" --strategy=recursive -X theirs; then |  | ||||||
|               echo "Conflict detected for $commit_hash. Resolving with incoming changes." |  | ||||||
|               conflict_files=$(git diff --name-only --diff-filter=U) |  | ||||||
|               echo "Conflicting files:" |  | ||||||
|               echo "$conflict_files" |  | ||||||
| 
 |  | ||||||
|               for file in $conflict_files; do |  | ||||||
|                 if [ -f "$file" ]; then |  | ||||||
|                   echo "Resolving conflict for $file" |  | ||||||
|                   git add "$file" |  | ||||||
|                 else |  | ||||||
|                   echo "File $file has been deleted. Skipping." |  | ||||||
|                   git rm "$file" |  | ||||||
|                 fi |  | ||||||
|               done |  | ||||||
| 
 |  | ||||||
|               echo "Conflicts resolved. Continuing cherry-pick." |  | ||||||
|               git cherry-pick --continue |  | ||||||
|             else |  | ||||||
|               echo "Cherry-pick successful for commit $commit_hash." |  | ||||||
|             fi |  | ||||||
|           done |  | ||||||
| 
 |  | ||||||
|           # Push the cherry-pick branch to the repository |  | ||||||
|           git remote set-url origin "https://${BOT_TOKEN}@github.com/${{ github.repository }}.git" |  | ||||||
|           git push origin $CHERRY_PICK_BRANCH --force |  | ||||||
| 
 |  | ||||||
|       - name: Create Pull Request |  | ||||||
|         run: | |  | ||||||
|           # Prepare and create the PR |  | ||||||
|           pr_title="deps: Merge ${{ env.pr_numbers_in_title }} PRs into $TARGET_BRANCH" |  | ||||||
|           pr_body=$(cat ${{ env.TEMP_DIR }}/pr_body.txt) |  | ||||||
| 
 |  | ||||||
|           echo "Prepared PR title:" |  | ||||||
|           echo "$pr_title" |  | ||||||
|           echo "Prepared PR body:" |  | ||||||
|           echo "$pr_body" |  | ||||||
| 
 |  | ||||||
|           # Create the PR using the GitHub API |  | ||||||
|           response=$(curl -s -X POST -H "Authorization: token $BOT_TOKEN" \ |  | ||||||
|             -H "Accept: application/vnd.github+json" \ |  | ||||||
|             https://api.github.com/repos/${{ github.repository }}/pulls \ |  | ||||||
|             -d "$(jq -n --arg title "$pr_title" \ |  | ||||||
|               --arg head "$CHERRY_PICK_BRANCH" \ |  | ||||||
|               --arg base "$TARGET_BRANCH" \ |  | ||||||
|               --arg body "$pr_body" \ |  | ||||||
|               '{title: $title, head: $head, base: $base, body: $body}')") |  | ||||||
| 
 |  | ||||||
|           pr_number=$(echo "$response" | jq -r '.number') |  | ||||||
|           echo "$pr_number" > ${{ env.TEMP_DIR }}/created_pr_number.txt |  | ||||||
|           echo "Created PR #$pr_number" |  | ||||||
| 
 |  | ||||||
|       - name: Add Label to Created Pull Request |  | ||||||
|         run: | |  | ||||||
|           # Add 'milestone-merge' label to the created PR |  | ||||||
|           pr_number=$(cat ${{ env.TEMP_DIR }}/created_pr_number.txt) |  | ||||||
|           echo "Adding label to PR #$pr_number" |  | ||||||
| 
 |  | ||||||
|           curl -s -X POST -H "Authorization: token $GITHUB_TOKEN" \ |  | ||||||
|             -H "Accept: application/vnd.github+json" \ |  | ||||||
|             -d '{"labels": ["milestone-merge"]}' \ |  | ||||||
|             "https://api.github.com/repos/${{ github.repository }}/issues/$pr_number/labels" |  | ||||||
| 
 |  | ||||||
|           echo "Added 'milestone-merge' label to PR #$pr_number." |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user