mirror of
				https://github.com/juspay/hyperswitch.git
				synced 2025-10-31 18:17:13 +08:00 
			
		
		
		
	ci: add ci workflow for validating hotfix pr (#2597)
This commit is contained in:
		
							
								
								
									
										167
									
								
								.github/workflows/hotfix-pr-check.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								.github/workflows/hotfix-pr-check.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,167 @@ | ||||
| name: Hotfix-PR-Check | ||||
|  | ||||
| on: | ||||
|   pull_request: | ||||
|     types: | ||||
|       - opened | ||||
|       - edited | ||||
|       - synchronize | ||||
|     branches: | ||||
|       - "hotfix-*" | ||||
|  | ||||
| jobs: | ||||
|   hotfix_pr_check: | ||||
|     name: Verify Hotfix PR | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@v3 | ||||
|  | ||||
|       - name: Get hotfix pull request body | ||||
|         shell: bash | ||||
|         run: | | ||||
|           echo '${{ github.event.pull_request.body }}' > hotfix_pr_body.txt | ||||
|  | ||||
|       - name: Get a list of all original PR numbers | ||||
|         shell: bash | ||||
|         run: | | ||||
|  | ||||
|           # Extract a list of lines with the format 'juspay/hyperswitch/pull/1200' or '#1200' using 'sed'. | ||||
|           # If empty, then error out and exit. | ||||
|           # else, use 'grep' to extract out 'juspay/hyperswitch/pull/1200' or '#1200' patterns from each line. | ||||
|           # Use 'sed' to remove the part of the matched strings that precedes the last "/" character (in cases like, juspay/hyperswitch/pull/1200 - 1200)  | ||||
|           # and sed again to remove any "#" characters from the extracted numeric part (in cases like #1200 - 1200), ultimately getting PR/issue number.  | ||||
|           # Finally, remove (if any) duplicates from the list | ||||
|  | ||||
|           SED_OUTPUT=$(sed -E '/\/juspay\/hyperswitch\/pull\/[0-9]+|#[0-9]+/!d' hotfix_pr_body.txt) | ||||
|  | ||||
|           if [ -z "$SED_OUTPUT" ]; then | ||||
|             echo "::error::No original PRs found" | ||||
|             exit 1 | ||||
|           else | ||||
|              PR_NUMBERS=($(echo "$SED_OUTPUT" | grep -oE 'juspay/hyperswitch/pull/[0-9]+|#([0-9]+)' | sed 's/.*\///' | sed 's/#//' | sort -u)) | ||||
|              echo "PR_NUMBERS=${PR_NUMBERS[@]}" >> $GITHUB_ENV | ||||
|              echo "Original PR's found: ("${PR_NUMBERS[*]/#/#}")" | ||||
|           fi | ||||
|  | ||||
|       - name: Verify Original PRs | ||||
|         shell: bash | ||||
|         env: | ||||
|           GH_TOKEN: ${{ github.token }} | ||||
|         run: | | ||||
|           PR_NUMBERS="${PR_NUMBERS[*]}" | ||||
|           all_checks_failed=1 | ||||
|  | ||||
|           PR_AUTHORS=() | ||||
|           PR_TITLES=() | ||||
|           PR_BASE_REFS=() | ||||
|           PR_STATES=() | ||||
|  | ||||
|           for pr_number in ${PR_NUMBERS}; do | ||||
|             is_pull_request="$(gh api -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" "/repos/juspay/hyperswitch/issues/${pr_number}" | jq '.pull_request')" | ||||
|  | ||||
|             if [[ "$is_pull_request" == null ]]; then | ||||
|               continue | ||||
|             else | ||||
|               pr_info=$(gh pr view "${pr_number}" --json number,title,baseRefName,state,author) | ||||
|               pr_author=$(echo "${pr_info}" | jq -r '.author.login') | ||||
|               pr_title=$(echo "${pr_info}" | jq -r '.title') | ||||
|               pr_base_ref=$(echo "${pr_info}" | jq -r '.baseRefName') | ||||
|               pr_state=$(echo "${pr_info}" | jq -r '.state') | ||||
|  | ||||
|               if [[ "${pr_author}" == "${{ github.event.pull_request.user.login }}" && \ | ||||
|                     "${pr_title}" == "${{ github.event.pull_request.title }}" && \ | ||||
|                     "${pr_base_ref}" == "main" && \ | ||||
|                     "${pr_state}" == "MERGED" ]]; then | ||||
|  | ||||
|                 all_checks_failed=0 | ||||
|                 break | ||||
|               fi | ||||
|  | ||||
|               PR_AUTHORS+=("$pr_author") | ||||
|               PR_TITLES+=("$pr_title") | ||||
|               PR_BASE_REFS+=("$pr_base_ref") | ||||
|               PR_STATES+=("$pr_state") | ||||
|                | ||||
|             fi | ||||
|           done | ||||
|  | ||||
|           if [[ $all_checks_failed -eq 1 ]]; then | ||||
|  | ||||
|             # Set a flag to track if a author match is found | ||||
|             author_match_found=0 | ||||
|  | ||||
|             for ((i = 0; i < ${#PR_AUTHORS[@]}; i++)); do | ||||
|               if [[ "${{github.event.pull_request.user.login}}" == "${PR_AUTHORS[i]}" ]]; then | ||||
|                 # If a match is found, set the flag to 1 and break out of the loop | ||||
|                 author_match_found=1 | ||||
|                 break | ||||
|               fi | ||||
|             done | ||||
|  | ||||
|             if [[ $author_match_found -eq 0 ]]; then | ||||
|               echo "::error::Hotfix PR author does not match any of the Original PR authors. Hotfix PR author: '${{ github.event.pull_request.user.login }}'" | ||||
|             fi | ||||
|  | ||||
|  | ||||
|             # Set a flag to track if a title match is found | ||||
|             title_match_found=0 | ||||
|  | ||||
|             for ((i = 0; i < ${#PR_TITLES[@]}; i++)); do | ||||
|               if [[ "${{github.event.pull_request.title}}" == "${PR_TITLES[i]}" ]]; then | ||||
|                 # If a match is found, set the flag to 1 and break out of the loop | ||||
|                 title_match_found=1 | ||||
|                 break | ||||
|               fi | ||||
|             done | ||||
|  | ||||
|             if [[ $title_match_found -eq 0 ]]; then | ||||
|               echo "::error::Hotfix PR title does not match any of the Original PR titles. Hotfix PR title: '${{ github.event.pull_request.title }}'" | ||||
|             fi | ||||
|  | ||||
|  | ||||
|             # Set a flag to track if any of the original PRs point to the 'main' | ||||
|             original_pr_points_to_main=0 | ||||
|  | ||||
|             for ((i = 0; i < ${#PR_BASE_REFS[@]}; i++)); do | ||||
|               if [[ "${PR_BASE_REFS[i]}" == "main" ]]; then | ||||
|                 # If a match is found, set the flag to 1 and break out of the loop | ||||
|                 original_pr_points_to_main=1 | ||||
|                 break | ||||
|               fi | ||||
|             done | ||||
|  | ||||
|             if [[ $original_pr_points_to_main -eq 0 ]]; then | ||||
|               echo "::error::None of the Original PR's baseRef is 'main'" | ||||
|             fi | ||||
|  | ||||
|  | ||||
|             # Set a flag to track if any of the original PR's state is 'MERGED' | ||||
|             original_pr_merged=0 | ||||
|  | ||||
|             for ((i = 0; i < ${#PR_STATES[@]}; i++)); do | ||||
|               if [[ "${PR_STATES[i]}" == "MERGED" ]]; then | ||||
|                 # If a match is found, set the flag to 1 and break out of the loop | ||||
|                 original_pr_merged=1 | ||||
|                 break | ||||
|               fi | ||||
|             done | ||||
|  | ||||
|             if [[ $original_pr_merged -eq 0 ]]; then | ||||
|               echo "::error::None of the Original PR is merged" | ||||
|             fi | ||||
|  | ||||
|             # Print all Original PR's (number), (pr_title), (pr_author), (pr_base_ref) and (pr_state) | ||||
|             i=0 | ||||
|             echo "Original PR info:" | ||||
|             for pr_number in ${PR_NUMBERS}; do | ||||
|               echo "#${pr_number} - pr_title: '${PR_TITLES[i]}' - pr_author: '${PR_AUTHORS[i]}' - pr_base_ref: '${PR_BASE_REFS[i]}' - pr_state: '${PR_STATES[i]}'" | ||||
|               i+=1 | ||||
|             done | ||||
|  | ||||
|             exit 1 | ||||
|  | ||||
|           else | ||||
|             echo "::notice::Hotfix PR satisfies all the required conditions" | ||||
|  | ||||
|           fi | ||||
		Reference in New Issue
	
	Block a user
	 Chethan Rao
					Chethan Rao