diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 8b486f9ae9c..34b6f650172 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -49,38 +49,57 @@ jobs: validate-pr-template: if: github.event_name == 'pull_request' - runs-on: ubuntu-latest steps: - - name: Validate PR template + - name: Validate PR template and comment uses: actions/github-script@v7 with: script: | - const body = context.payload.pull_request.body || ""; + const pr = context.payload.pull_request; + const body = pr.body || ""; - // 1. Check both checkboxes const checkbox1 = /\[x\].*?There is reasonable content/i.test(body); const checkbox2 = /\[x\].*?I have read and accepted/i.test(body); - - // 2. URL must be on the exact "The site content can be seen at ..." line - // https://regex101.com/r/N36fsT const urlLineRegex = /^[ \t]*-[ \t]*The site content can be seen at[ \t]+(?:<)?(?:\[.*?\]\()?https?:\/\/[^\s>()]+(?:\))?(?:>)?/m; - const urlMatch = urlLineRegex.exec(body); - const urlValid = urlMatch !== null; - - // 3. Explanation must follow the blockquote marker + const urlValid = urlLineRegex.exec(body) !== null; const explanationMatch = />\s*The site content is(?:\s*|\s*\n)(.+)/i.exec(body); const explanation = explanationMatch && explanationMatch[1].trim().length > 10; - if (!checkbox1 || !checkbox2 || !urlValid || !explanation) { - core.setFailed( - "❌ PR template is not properly filled:\n" + - `Checkbox1: ${checkbox1 ? '✅' : '❌'}\n` + - `Checkbox2: ${checkbox2 ? '✅' : '❌'}\n` + - `URL on correct line: ${urlValid ? '✅' : '❌'}\n` + - `Explanation: ${explanation ? '✅' : '❌'}` - ); + const failed = !checkbox1 || !checkbox2 || !urlValid || !explanation; + + if (!failed) { + console.log("✅ PR template is valid."); + return; + } + + const commentBody = `❌ **PR template is not properly filled:**\n\n- Checkbox1 (reasonable content): ${checkbox1 ? "✅" : "❌"}\n- Checkbox2 (read and accepted): ${checkbox2 ? "✅" : "❌"}\n- URL on correct line: ${urlValid ? "✅" : "❌"}\n- Explanation (> The site content is...): ${explanation ? "✅" : "❌"}\n\nPlease update your PR description accordingly.`; + + const { data: comments } = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + }); + + const existingComment = comments.find(c => + c.user.login === 'github-actions[bot]' && + c.body.includes("**PR template is not properly filled:**") + ); + + if (existingComment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existingComment.id, + body: commentBody + }); } else { - console.log("✅ PR template format is valid."); + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + body: commentBody + }); } + + core.setFailed("PR template validation failed.");