diff --git a/.github/scripts/cleanup_pr_body.sh b/.github/scripts/cleanup_pr_body.sh deleted file mode 100755 index 25af344aa..000000000 --- a/.github/scripts/cleanup_pr_body.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -set -eu - -# ensure 1 argument is passed -if [ "$#" -ne 1 ]; then - echo "Usage: $0 " - exit 1 -fi - -PR_NUMBER=$1 -OLD=/tmp/orig_pr_body.txt -NEW=/tmp/new_pr_body.txt - -gh pr view --json body --template "{{.body}}" "${PR_NUMBER}" > "${OLD}" -cp "${OLD}" "${NEW}" - -# Remove markdown comments (like the at the start) -sed -i '/$/d' "${NEW}" - -# Remove "PLEASE FILL IN THE PR DESCRIPTION HERE ENSURING ALL CHECKLIST ITEMS (AT THE BOTTOM) HAVE BEEN CONSIDERED." -sed -i '/PLEASE FILL IN THE PR DESCRIPTION HERE.*$/d' "${NEW}" - -# Remove all lines after and including "**BEFORE SUBMITTING, PLEASE READ THE CHECKLIST BELOW AND FILL IN THE DESCRIPTION ABOVE**" -sed -i '/\*\*BEFORE SUBMITTING, PLEASE READ.*\*\*/,$d' "${NEW}" - -# Remove HTML
section that includes text of "PR Checklist (Click to Expand)" -python3 - <.*?.*?PR Checklist \(Click to Expand\).*?.*?
', re.DOTALL) -content = re.sub(pattern, '', content) - -with open("${NEW}", "w") as file: - file.write(content) -EOF - -# Run this only if ${NEW} is different than ${OLD} -if ! cmp -s "${OLD}" "${NEW}"; then - gh pr edit --body-file "${NEW}" "${PR_NUMBER}" - echo - echo "Updated PR body:" - echo - cat "${NEW}" -else - echo "No changes needed" -fi diff --git a/.github/workflows/cleanup_pr_body.yml b/.github/workflows/cleanup_pr_body.yml deleted file mode 100644 index f1a91a7cd..000000000 --- a/.github/workflows/cleanup_pr_body.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Cleanup PR Body - -on: - pull_request_target: - types: [opened, reopened, edited] - -permissions: - pull-requests: write - -jobs: - update-description: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - - name: Set up Python - uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0 - with: - python-version: '3.12' - cache: 'pip' - - - name: Install Python dependencies - run: | - python3 -m pip install --upgrade pip - python3 -m pip install regex - - - name: Update PR description - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: bash .github/scripts/cleanup_pr_body.sh "${{ github.event.number }}" diff --git a/.github/workflows/new_pr_bot.yml b/.github/workflows/new_pr_bot.yml new file mode 100644 index 000000000..a8141cd47 --- /dev/null +++ b/.github/workflows/new_pr_bot.yml @@ -0,0 +1,96 @@ +name: New PR Bot + +on: + pull_request_target: + types: [opened] + +permissions: + pull-requests: write + +jobs: + update-description: + runs-on: ubuntu-latest + steps: + - name: Update PR description + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const { owner, repo } = context.repo; + const pr_number = context.issue.number; + + const { data: pr } = await github.rest.pulls.get({ + owner, + repo, + pull_number: pr_number, + }); + + let body = pr.body || ''; + const original = body; + + // Remove markdown comments () + body = body.replace(/^$/gm, ''); + + // Remove "PLEASE FILL IN THE PR DESCRIPTION HERE ..." + body = body.replace(/^PLEASE FILL IN THE PR DESCRIPTION HERE.*$/gm, ''); + + // Remove all lines after and including "**BEFORE SUBMITTING, PLEASE READ ..." + body = body.replace(/\*\*BEFORE SUBMITTING, PLEASE READ.*\*\*[\s\S]*$/, ''); + + // Remove
section containing "PR Checklist (Click to Expand)" + body = body.replace(/(---\n\n)?
[\s\S]*?[\s\S]*?PR Checklist \(Click to Expand\)[\s\S]*?<\/summary>[\s\S]*?<\/details>/g, ''); + + if (body !== original) { + await github.rest.pulls.update({ + owner, + repo, + pull_number: pr_number, + body, + }); + console.log('Updated PR body'); + } else { + console.log('No changes needed'); + } + + reminder-comment: + runs-on: ubuntu-latest + steps: + - name: Post welcome comment for first-time contributors + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const { owner, repo } = context.repo; + const prAuthor = context.payload.pull_request.user.login; + + const { data: searchResults } = await github.rest.search.issuesAndPullRequests({ + q: `repo:${owner}/${repo} type:pr author:${prAuthor}`, + per_page: 1, + }); + + const authorPRCount = searchResults.total_count; + console.log(`Found ${authorPRCount} PRs by ${prAuthor}`); + + if (authorPRCount === 1) { + console.log(`Posting welcome comment for first-time contributor: ${prAuthor}`); + await github.rest.issues.createComment({ + owner, + repo, + issue_number: context.issue.number, + body: [ + '\u{1f44b} Hi! Thank you for contributing to the vLLM project.', + '', + '\u{1f4ac} Join our developer Slack at https://slack.vllm.ai to discuss your PR in #pr-reviews, coordinate on features in #feat- channels, or join special interest groups in #sig- channels.', + '', + 'Just a reminder: PRs would not trigger full CI run by default.', + '', + 'Once the PR is approved and ready to go, your PR reviewer(s) can run CI to test the changes comprehensively before merging.', + '', + 'To run CI, PR reviewers can either: Add `ready` label to the PR or enable auto-merge.', + '', + 'If you have any questions, please reach out to us on Slack at https://slack.vllm.ai.', + '', + '\u{1f680}', + ].join('\n'), + }); + } else { + console.log(`Skipping comment for ${prAuthor} - not their first PR (${authorPRCount} PRs found)`); + } diff --git a/.github/workflows/reminder_comment.yml b/.github/workflows/reminder_comment.yml deleted file mode 100644 index 8884359fa..000000000 --- a/.github/workflows/reminder_comment.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: PR Reminder Comment Bot -permissions: - pull-requests: write -on: - pull_request_target: - types: [opened] -jobs: - pr_reminder: - runs-on: ubuntu-latest - steps: - - name: Remind to run full CI on PR - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - script: | - try { - // Get the PR author - const prAuthor = context.payload.pull_request.user.login; - - // Check if this is the author's first PR in this repository - // Use GitHub's search API to find all PRs by this author - const { data: searchResults } = await github.rest.search.issuesAndPullRequests({ - q: `repo:${context.repo.owner}/${context.repo.repo} type:pr author:${prAuthor}`, - per_page: 100 - }); - - const authorPRCount = searchResults.total_count; - - console.log(`Found ${authorPRCount} PRs by ${prAuthor}`); - - // Only post comment if this is the first PR (only one PR by this author) - if (authorPRCount === 1) { - console.log(`Posting welcome comment for first-time contributor: ${prAuthor}`); - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: context.issue.number, - body: '👋 Hi! Thank you for contributing to the vLLM project.\n\n' + - '💬 Join our developer Slack at https://slack.vllm.ai to discuss your PR in #pr-reviews, coordinate on features in #feat- channels, or join special interest groups in #sig- channels.\n\n' + - 'Just a reminder: PRs would not trigger full CI run by default. Instead, it would only run `fastcheck` CI which starts running only a small and essential subset of CI tests to quickly catch errors. \n\n' + - 'You ask your reviewers to trigger select CI tests on top of `fastcheck` CI. \n\n' + - 'Once the PR is approved and ready to go, your PR reviewer(s) can run CI to test the changes comprehensively before merging.\n\n' + - 'To run CI, PR reviewers can either: Add `ready` label to the PR or enable auto-merge.\n\n' + - 'If you have any questions, please reach out to us on Slack at https://slack.vllm.ai.\n\n' + - '🚀' - }); - } else { - console.log(`Skipping comment for ${prAuthor} - not their first PR (${authorPRCount} PRs found)`); - } - } catch (error) { - console.error('Error checking PR history or posting comment:', error); - // Don't fail the workflow, just log the error - } - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}