Skip to content

Commit 26cd767

Browse files
authored
add pr vaidation - issue must exist (#410)
* add pr vaidation - issue must exist * Rename validate-commit-issues.yaml to validate-issue-references.yaml Signed-off-by: danbar2 <118804663+danbar2@users.noreply.github.com> --------- Signed-off-by: danbar2 <118804663+danbar2@users.noreply.github.com>
1 parent 91283f2 commit 26cd767

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
name: Validate PR Issue References
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize, reopened, edited]
6+
7+
jobs:
8+
validate-pr-issues:
9+
runs-on: ubuntu-latest
10+
permissions:
11+
contents: read
12+
pull-requests: read
13+
issues: read
14+
15+
steps:
16+
- name: Validate PR references at least one open issue
17+
uses: actions/github-script@v7
18+
with:
19+
script: |
20+
const { owner, repo } = context.repo;
21+
const prNumber = context.payload.pull_request.number;
22+
const prBody = context.payload.pull_request.body || '';
23+
24+
// Issue reference pattern: #123
25+
const issuePattern = /#(\d+)/g;
26+
27+
// Find all issue references in PR description
28+
const matches = [...prBody.matchAll(issuePattern)];
29+
const issueNumbers = matches.map(m => parseInt(m[1])).filter(Boolean);
30+
31+
if (issueNumbers.length === 0) {
32+
core.setFailed('❌ PR description must reference at least one issue.\n\n' +
33+
'Please add an issue reference to your PR description using the format: #123');
34+
return;
35+
}
36+
37+
console.log(`Found ${issueNumbers.length} issue reference(s): ${[...new Set(issueNumbers)].map(n => `#${n}`).join(', ')}`);
38+
39+
// Validate each referenced issue
40+
let hasValidIssue = false;
41+
const errors = [];
42+
43+
for (const issueNumber of [...new Set(issueNumbers)]) {
44+
try {
45+
const issue = await github.rest.issues.get({
46+
owner,
47+
repo,
48+
issue_number: issueNumber,
49+
});
50+
51+
// Check if issue is open
52+
if (issue.data.state === 'closed') {
53+
errors.push(`❌ Issue #${issueNumber} is closed`);
54+
} else if (issue.data.state_reason === 'completed') {
55+
errors.push(`❌ Issue #${issueNumber} is marked as Done/Completed`);
56+
} else {
57+
// Found at least one valid open issue
58+
hasValidIssue = true;
59+
console.log(`✅ Issue #${issueNumber} is open - validation passed`);
60+
break;
61+
}
62+
} catch (error) {
63+
if (error.status === 404) {
64+
errors.push(`❌ Issue #${issueNumber} does not exist`);
65+
} else {
66+
errors.push(`❌ Issue #${issueNumber}: ${error.message}`);
67+
}
68+
}
69+
}
70+
71+
// Report results
72+
if (!hasValidIssue) {
73+
const issueList = [...new Set(issueNumbers)].map(n => `#${n}`).join(', ');
74+
core.setFailed(
75+
`❌ PR references ${issueList}, but none are open issues.\n\n` +
76+
errors.join('\n') + '\n\n' +
77+
'Please reference at least one open (not closed or Done) issue in your PR description.'
78+
);
79+
} else {
80+
console.log('✅ PR references at least one open issue - validation passed');
81+
}

CONTRIBUTING.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,33 @@ You must use your real name (sorry, no pseudonyms or anonymous contributions).
5959

6060
If you set your `user.name` and `user.email` using git config, you can sign
6161
your commit automatically with `git commit -s`.
62+
63+
## Pull Request Requirements
64+
65+
Every pull request must reference at least one **open** GitHub issue in its description. This ensures that all changes are tracked and linked to project requirements or bug reports.
66+
67+
### Valid Issue References
68+
69+
Your PR description must include an issue reference in the format: `#123`
70+
71+
You can use it with optional keywords like `fixes`, `closes`, or `resolves`, but the simple `#123` format is sufficient.
72+
73+
**Examples of Valid PR Descriptions:**
74+
75+
```markdown
76+
## Summary
77+
Implements Redis caching layer for API responses to improve performance.
78+
79+
Issue: #789
80+
81+
## Changes
82+
- Added Redis client configuration
83+
- Implemented cache middleware
84+
- Updated API response handlers
85+
```
86+
87+
### Requirements
88+
89+
1. **At least one open issue** - The PR description must reference at least one issue that is currently open (not closed or marked as Done)
90+
2. **Issue must exist** - The referenced issue number must exist in the repository
91+
3. **Automated validation** - A GitHub Actions workflow will automatically validate all PRs

0 commit comments

Comments
 (0)