From 3863eb29d8a42dda8baf18c58d475ed6d4e7754f Mon Sep 17 00:00:00 2001 From: smog-root Date: Sun, 20 Oct 2024 08:50:26 +0530 Subject: [PATCH 1/2] Implement GitHub PR Issue Checker Workflow --- .github/workflows/pr-checker.yaml | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/pr-checker.yaml diff --git a/.github/workflows/pr-checker.yaml b/.github/workflows/pr-checker.yaml new file mode 100644 index 0000000000..dbab3ef4f0 --- /dev/null +++ b/.github/workflows/pr-checker.yaml @@ -0,0 +1,57 @@ +name: PR Issue Checker +# Created by @smog-root. +on: + pull_request: + types: [opened, edited] + +jobs: + check_pr_details: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Install dependencies (if needed) + run: pip install re # Install Python's regex library (not needed if using built-in) + + - name: Check PR Description and Title + id: check_pr_details + run: | + python -c " +import re +import sys +import os + +pr_description = os.getenv('GITHUB_EVENT_PULL_REQUEST_BODY', '') +pr_title = os.getenv('GITHUB_EVENT_PULL_REQUEST_TITLE', '') + +# Check if PR description is present +if not pr_description: + print('PR description is missing.') + sys.exit(1) + +# Check if the PR description contains 'Fixes #' +if not re.search(r'Fixes #[0-9]+', pr_description): + print('The PR description should include Fixes #.') + sys.exit(1) + +# Check if the PR title starts with FIX, FEAT, or DOC +if not re.match(r'^(FIX|FEAT|DOC)', pr_title): + print('The PR title should start with FIX, FEAT, or DOC.') + sys.exit(1) + +print('PR description and title are valid.') +" + env: + GITHUB_EVENT_PULL_REQUEST_BODY: ${{ github.event.pull_request.body }} + GITHUB_EVENT_PULL_REQUEST_TITLE: ${{ github.event.pull_request.title }} + + - name: Output result + run: echo "All checks passed." + From 11ad87f079be0565fcc05fbbe7aebec60e1799da Mon Sep 17 00:00:00 2001 From: smog-root Date: Tue, 22 Oct 2024 16:53:37 +0530 Subject: [PATCH 2/2] Update pr-checker.yaml --- .github/workflows/pr-checker.yaml | 132 +++++++++++++++++++----------- 1 file changed, 83 insertions(+), 49 deletions(-) diff --git a/.github/workflows/pr-checker.yaml b/.github/workflows/pr-checker.yaml index dbab3ef4f0..790a14e368 100644 --- a/.github/workflows/pr-checker.yaml +++ b/.github/workflows/pr-checker.yaml @@ -1,57 +1,91 @@ -name: PR Issue Checker -# Created by @smog-root. +name: PR Validation + +# Created by smog-root + on: pull_request: types: [opened, edited] jobs: - check_pr_details: + validate-pr: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: '3.x' - - - name: Install dependencies (if needed) - run: pip install re # Install Python's regex library (not needed if using built-in) - - - name: Check PR Description and Title - id: check_pr_details - run: | - python -c " -import re -import sys -import os - -pr_description = os.getenv('GITHUB_EVENT_PULL_REQUEST_BODY', '') -pr_title = os.getenv('GITHUB_EVENT_PULL_REQUEST_TITLE', '') - -# Check if PR description is present -if not pr_description: - print('PR description is missing.') - sys.exit(1) - -# Check if the PR description contains 'Fixes #' -if not re.search(r'Fixes #[0-9]+', pr_description): - print('The PR description should include Fixes #.') - sys.exit(1) - -# Check if the PR title starts with FIX, FEAT, or DOC -if not re.match(r'^(FIX|FEAT|DOC)', pr_title): - print('The PR title should start with FIX, FEAT, or DOC.') - sys.exit(1) - -print('PR description and title are valid.') -" - env: - GITHUB_EVENT_PULL_REQUEST_BODY: ${{ github.event.pull_request.body }} - GITHUB_EVENT_PULL_REQUEST_TITLE: ${{ github.event.pull_request.title }} - - - name: Output result - run: echo "All checks passed." - + - name: Check out code + uses: actions/checkout@v3 + + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: '14' + + - name: Validate PR Description + id: pr-check + run: | + # Fetch PR information + PR_DESCRIPTION=$(jq -r .pull_request.body < "$GITHUB_EVENT_PATH") + PR_TITLE=$(jq -r .pull_request.title < "$GITHUB_EVENT_PATH") + + # Define file paths for the output variables + PR_VALID_FILE=$(mktemp) + ERROR_MESSAGE_FILE=$(mktemp) + SUCCESS_MESSAGE_FILE=$(mktemp) + + # Default value for PR_VALID + PR_VALID="true" + + # Check if PR description is empty + if [ -z "$PR_DESCRIPTION" ] || [ "$PR_DESCRIPTION" == "null" ]; then + echo "Empty PR description" + PR_VALID="false" + echo '❌ Error: PR description is empty!' > "$ERROR_MESSAGE_FILE" + fi + + # Check for issue reference in the description + ISSUE_PATTERN="(Fixes|Close|Closes|Closed|Fix|Fixed|Resolve|Resolves) #[0-9]+" + if [[ ! "$PR_DESCRIPTION" =~ $ISSUE_PATTERN ]]; then + echo "Invalid or missing issue reference" + PR_VALID="false" + echo '❌ Error: PR must reference an issue with the format Fixes ,Close ,Closes ,Closed ,Fix ,Fixed ,Resolve ,Resolves #Issue_Number' > "$ERROR_MESSAGE_FILE" + fi + + # If both checks pass + if [ "$PR_VALID" == "true" ]; then + echo '✅ Success: PR is valid!' > "$SUCCESS_MESSAGE_FILE" + fi + + # Save the outputs to environment files + echo "PR_VALID=$PR_VALID" >> $GITHUB_ENV + echo "ERROR_MESSAGE=$(cat $ERROR_MESSAGE_FILE)" >> $GITHUB_ENV + echo "SUCCESS_MESSAGE=$(cat $SUCCESS_MESSAGE_FILE)" >> $GITHUB_ENV + + - name: Post comment on PR + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prValid = process.env.PR_VALID; + const errorMessage = process.env.ERROR_MESSAGE; + const successMessage = process.env.SUCCESS_MESSAGE; + const prNumber = context.payload.pull_request.number; + + if (prValid === 'false') { + github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: errorMessage + }); + core.setFailed(errorMessage); + } else { + github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: successMessage + }); + } + + - name: Fail if validation failed + if: env.PR_VALID == 'false' + run: exit 1