diff --git a/.github/workflows/pr-issue-validator.yaml b/.github/workflows/pr-issue-validator.yaml index 6132cce0a..ca7dee58f 100644 --- a/.github/workflows/pr-issue-validator.yaml +++ b/.github/workflows/pr-issue-validator.yaml @@ -11,133 +11,35 @@ on: - 'main' - 'release-**' - 'develop' - - 'hotfix-v0**' - + - 'hotfix-**' + # paths-ignore: + # - 'docs/**' + # - '.github/' + # - 'CHANGELOG/' + # - 'charts/' + # - 'manifests/' + # - 'sample-docker-templates/' jobs: validate-PR-issue: runs-on: ubuntu-latest - permissions: - issues: write - contents: read - pull-requests: write + steps: - name: Checkout repository uses: actions/checkout@v2 - - name: Validate Issue Reference + - name: Set up jq (for parsing JSON) + run: sudo apt-get install -y jq + + - name: PR Validation Script env: - GH_TOKEN: ${{ github.token }} PR_BODY: ${{ github.event.pull_request.body }} PRNUM: ${{ github.event.pull_request.number }} TITLE: ${{ github.event.pull_request.title }} + GH_TOKEN: ${{ github.token }} + GH_PR_VALIDATOR_TOKEN: ${{ secrets.GH_PR_VALIDATOR_TOKEN }} + BASE_REPO: ${{ github.event.pull_request.base.repo.full_name }} + HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }} run: | - set -x - # Skip validation for documentation or chore PRs - if [[ "$TITLE" =~ ^(doc:|docs:|chore:|misc:|sync:) ]]; then - echo "Skipping validation for docs/chore PR." - echo "PR NUMBER-: $PRNUM " - gh pr edit $PRNUM --remove-label "PR:Issue-verification-failed" - gh pr edit $PRNUM --add-label "PR:Ready-to-Review" - exit 0 - fi - - # Define all issue matching patterns - patterns=( - "((Fixes|Resolves) #[0-9]+)" - "((Fixes|Resolves) https://github.com/devtron-labs/devtron/issues/[0-9]+)" - "((Fixes|Resolves) devtron-labs/devtron#[0-9]+)" - "(Fixes|Resolves):?\\s+\\[#([0-9]+)\\]" - "((Fixes|Resolves):? #devtron-labs/devops-sprint/issues/[0-9]+)" - "((Fixes|Resolves):? #devtron-labs/sprint-tasks/issues/[0-9]+)" - "((Fixes|Resolves) https://github.com/devtron-labs/devops-sprint/issues/[0-9]+)" - "((Fixes|Resolves) https://github.com/devtron-labs/sprint-tasks/issues/[0-9]+)" - "((Fixes|Resolves):? #devtron-labs/sprint-tasks#[0-9]+)" - ) - - # Extract issue number and repo from PR body - extract_issue_number() { - local pattern="$1" # Get the pattern as the first argument to the function - - # Check if PR_BODY matches the provided pattern using Bash's =~ regex operator - if [[ "$PR_BODY" =~ $pattern ]]; then - echo "matched for this pattern $pattern" - - issue_num=$(echo "$PR_BODY" | grep -oE "$pattern" | grep -oE "[0-9]+") - - # Extract the repository name (e.g., devtron-labs/devtron) from PR_BODY using grep - repo=$(echo "$PR_BODY" | grep -oE "devtron-labs/[a-zA-Z0-9_-]+") - echo "Extracted issue number: $issue_num from repo: $repo" - - return 0 # Return success - else - echo "No match for the pattern $pattern" - fi - return 1 # Return failure if no match - } - - issue_num="" - repo="devtron-labs/devtron" # Default repo - for pattern in "${patterns[@]}"; do - echo "Now checking for $pattern" - extract_issue_number "$pattern" && break - done - - if [[ -z "$issue_num" ]]; then - echo "No valid issue number found." - gh pr edit $PRNUM --add-label "PR:Issue-verification-failed" - gh pr edit $PRNUM --remove-label "PR:Ready-to-Review" - exit 1 - fi - - # Form the issue API URL dynamically - issue_api_url="https://api.github.com/repos/$repo/issues/$issue_num" - echo "API URL: $issue_api_url" - - # Check if the issue exists in the private repo - response_code=$(curl -s -o /dev/null -w "%{http_code}" \ - --header "authorization: Bearer ${{ secrets.GH_PR_VALIDATOR_TOKEN }}" \ - "$issue_api_url") - - if [[ "$response_code" -eq 200 ]]; then - echo "Issue #$issue_num is valid and exists in $repo." - - # Fetch the current state of the issue (open/closed) from the private repository. - issue_status=$(curl -s \ - --header "authorization: Bearer ${{ secrets.GH_PR_VALIDATOR_TOKEN }}" \ - "$issue_api_url" | jq '.state'|tr -d \") - # Check if the issue is still open. - # if [[ "$issue_status" == open ]]; then - # echo "Issue #$issue_num is opened." - if [[ $forked == true ]]; then - echo "PR:Ready-to-Review, exiting gracefully" - exit 0 - fi - # Remove the 'Issue-verification-failed' label (if present) and add 'Ready-to-Review'. - gh pr edit $PRNUM --remove-label "PR:Issue-verification-failed" - gh pr edit $PRNUM --add-label "PR:Ready-to-Review" - echo "PR:Ready-to-Review, exiting gracefully" - exit 0 - # else - # echo "Issue #$issue_num is closed. Please link an open issue to proceed." - # if [[ $forked == true ]]; then - # echo "PR:Ready-to-Review, exiting gracefully" - # exit 0 - # fi - # Add a comment to the PR indicating the issue is not linked correctly. - # gh pr comment $PRNUM --body "PR is linked to a closed issue. Please link an open issue to proceed." - - # Add the 'Issue-verification-failed' label and remove 'Ready-to-Review'. - # gh pr edit $PRNUM --add-label "PR:Issue-verification-failed" - # gh pr edit $PRNUM --remove-label "PR:Ready-to-Review" - # exit 1 - #fi - else - echo "Issue not found. Invalid URL or issue number." - # Add a comment to the PR indicating the issue is not linked correctly. - gh pr comment $PRNUM --body "PR is not linked to a valid issue. Please update the issue link." - - # Apply 'Issue-verification-failed' label and remove 'Ready-to-Review' label. - gh pr edit $PRNUM --add-label "PR:Issue-verification-failed" - gh pr edit $PRNUM --remove-label "PR:Ready-to-Review" - exit 1 - fi + wget https://raw.githubusercontent.com/devtron-labs/utilities/feat/central-pr-validator/.github/workflows/validateIssue.sh + chmod +x validateIssue.sh + ./validateIssue.sh \ No newline at end of file