google.golang.org/grpc@v1.74.2/.github/workflows/pr-validation.yml (about) 1 name: PR Validation 2 on: 3 pull_request: 4 types: [opened, edited, synchronize, labeled, unlabeled, milestoned, demilestoned] 5 6 jobs: 7 validate: 8 name: Validate PR 9 runs-on: ubuntu-latest 10 steps: 11 - name: Validate Label 12 uses: actions/github-script@v6 13 with: 14 script: | 15 const labels = context.payload.pull_request.labels.map(label => label.name); 16 const requiredRegex = new RegExp('^Type:'); 17 const hasRequiredLabel = labels.some(label => requiredRegex.test(label)); 18 if (!hasRequiredLabel) { 19 core.setFailed("This PR must have a label starting with 'Type:'."); 20 } 21 22 - name: Validate Description 23 uses: actions/github-script@v6 24 with: 25 script: | 26 const body = context.payload.pull_request.body; 27 const requiredRegex = new RegExp('^RELEASE NOTES:\\s*([Nn][Oo][Nn][Ee]|[Nn]/[Aa]|\\n(\\*|-)\\s*.+)$', 'm'); 28 if (!requiredRegex.test(body)) { 29 core.setFailed(` 30 The PR description must include a RELEASE NOTES section. 31 It should be in one of the following formats: 32 - "RELEASE NOTES: none" (case-insensitive) 33 - "RELEASE NOTES: N/A" (case-insensitive) 34 - A bulleted list under "RELEASE NOTES:", for example: 35 RELEASE NOTES: 36 * my_package: Fix bug causing crash... 37 `); 38 } 39 40 - name: Validate Milestone 41 uses: actions/github-script@v6 42 with: 43 script: | 44 const milestone = context.payload.pull_request.milestone; 45 if (!milestone) { 46 core.setFailed("This PR must be associated with a milestone."); 47 } else { 48 const requiredRegex = new RegExp('Release$'); 49 if (!requiredRegex.test(milestone.title)) { 50 core.setFailed("The milestone for this PR must end with 'Release'."); 51 } 52 }