fix: checking pr issue validator #4168
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Validate Pull Request | |
on: | |
pull_request: | |
types: | |
- opened | |
- synchronize | |
- edited | |
- reopened | |
branches: | |
- 'main' | |
- 'release-**' | |
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 | |
env: | |
GH_TOKEN: ${{ github.token }} | |
PR_BODY: ${{ github.event.pull_request.body }} | |
PRNUM: ${{ github.event.pull_request.number }} | |
TITLE: ${{ github.event.pull_request.title }} | |
run: | | |
set -x | |
# Skip validation for documentation or chore PRs | |
if [[ "$TITLE" =~ ^(doc:|docs:|chore:) ]]; 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]+)" | |
) | |
# Extract issue number and repo from PR body | |
extract_issue_number() { | |
local pattern="$1" | |
if [[ "$PR_BODY" =~ $pattern ]]; then | |
echo "matched for this pattern $pattern" | |
issue_num=$(echo "${BASH_REMATCH[0]}" | grep -oE "[0-9]+" | tr -d '\r\n') | |
repo=$(echo "$PR_BODY" | grep -oE "devtron-labs/[a-zA-Z0-9_-]+") | |
echo "Extracted issue number: $issue_num from repo: $repo" | |
return 0 | |
else | |
echo "No match for the pattern $pattern" | |
fi | |
return 1 | |
} | |
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." | |
gh pr edit $PRNUM --remove-label "PR:Issue-verification-failed" | |
gh pr edit $PRNUM --add-label "PR:Ready-to-Review" | |
else | |
echo "Issue not found. Invalid URL or issue number." | |
gh pr comment $PRNUM --body "PR is not linked to a valid issue. Please update." | |
gh pr edit $PRNUM --add-label "PR:Issue-verification-failed" | |
gh pr edit $PRNUM --remove-label "PR:Ready-to-Review" | |
exit 1 | |
fi |