--- /dev/null
+name: PR Validation
+on:
+ pull_request:
+ types: [opened, edited, synchronize, labeled, unlabeled, milestoned, demilestoned]
+
+jobs:
+ validate:
+ name: Validate PR
+ runs-on: ubuntu-latest
+ steps:
+ - name: Validate Label
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const labels = context.payload.pull_request.labels.map(label => label.name);
+ const requiredRegex = new RegExp('^Type:');
+ const hasRequiredLabel = labels.some(label => requiredRegex.test(label));
+ if (!hasRequiredLabel) {
+ core.setFailed("This PR must have a label starting with 'Type:'.");
+ }
+
+ - name: Validate Description
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const body = context.payload.pull_request.body;
+ const requiredRegex = new RegExp('^RELEASE NOTES:\\s*([Nn][Oo][Nn][Ee]|[Nn]/[Aa]|\\n(\\*|-)\\s*.+)$', 'm');
+ if (!requiredRegex.test(body)) {
+ core.setFailed(`
+ The PR description must include a RELEASE NOTES section.
+ It should be in one of the following formats:
+ - "RELEASE NOTES: none" (case-insensitive)
+ - "RELEASE NOTES: N/A" (case-insensitive)
+ - A bulleted list under "RELEASE NOTES:", for example:
+ RELEASE NOTES:
+ * my_package: Fix bug causing crash...
+ `);
+ }
+
+ - name: Validate Milestone
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const milestone = context.payload.pull_request.milestone;
+ if (!milestone) {
+ core.setFailed("This PR must be associated with a milestone.");
+ } else {
+ const requiredRegex = new RegExp('Release$');
+ if (!requiredRegex.test(milestone.title)) {
+ core.setFailed("The milestone for this PR must end with 'Release'.");
+ }
+ }