mirror of
https://github.com/ReScienceLab/opc-skills.git
synced 2026-09-14 18:03:27 +08:00
a0fa99d14a
- Automatically closes issues when referenced PR is merged - Adds comment to issue specifying which PR caused closure - Supports keywords: Fixes, Closes, Resolves (case-insensitive) - Extracts issue numbers from both PR title and body
90 lines
3.4 KiB
YAML
90 lines
3.4 KiB
YAML
name: Auto-close Issues on PR Merge
|
|
|
|
on:
|
|
pull_request:
|
|
types: [closed]
|
|
|
|
jobs:
|
|
close-linked-issues:
|
|
# Only run if PR was actually merged (not just closed)
|
|
if: github.event.pull_request.merged == true
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
issues: write
|
|
pull-requests: read
|
|
|
|
steps:
|
|
- name: Extract issue numbers from PR
|
|
id: extract-issues
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
const prNumber = context.payload.pull_request.number;
|
|
const prTitle = context.payload.pull_request.title;
|
|
const prBody = context.payload.pull_request.body || '';
|
|
const prUrl = context.payload.pull_request.html_url;
|
|
|
|
// Regex to find issue references like "Fixes #123", "Closes #456", "Resolves #789"
|
|
const issuePattern = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s*:?\s*#(\d+)/gi;
|
|
|
|
const issueNumbers = new Set();
|
|
let match;
|
|
|
|
// Search in PR title
|
|
while ((match = issuePattern.exec(prTitle)) !== null) {
|
|
issueNumbers.add(match[1]);
|
|
}
|
|
|
|
// Search in PR body
|
|
issuePattern.lastIndex = 0; // Reset regex
|
|
while ((match = issuePattern.exec(prBody)) !== null) {
|
|
issueNumbers.add(match[1]);
|
|
}
|
|
|
|
const issues = Array.from(issueNumbers);
|
|
console.log(`Found issues: ${issues.join(', ')}`);
|
|
|
|
// Store for next step
|
|
core.setOutput('issue_numbers', issues.join(','));
|
|
core.setOutput('pr_number', prNumber);
|
|
core.setOutput('pr_url', prUrl);
|
|
core.setOutput('pr_title', prTitle);
|
|
|
|
- name: Comment and close issues
|
|
if: steps.extract-issues.outputs.issue_numbers != ''
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
const issueNumbers = '${{ steps.extract-issues.outputs.issue_numbers }}'.split(',');
|
|
const prNumber = '${{ steps.extract-issues.outputs.pr_number }}';
|
|
const prUrl = '${{ steps.extract-issues.outputs.pr_url }}';
|
|
const prTitle = `${{ steps.extract-issues.outputs.pr_title }}`;
|
|
|
|
for (const issueNumber of issueNumbers) {
|
|
if (!issueNumber) continue;
|
|
|
|
try {
|
|
// Add comment to the issue
|
|
await github.rest.issues.createComment({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: parseInt(issueNumber),
|
|
body: `✅ This issue has been automatically closed because PR #${prNumber} was merged.\n\n**PR Title:** ${prTitle}\n**PR Link:** ${prUrl}`
|
|
});
|
|
|
|
console.log(`Added comment to issue #${issueNumber}`);
|
|
|
|
// Close the issue
|
|
await github.rest.issues.update({
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
issue_number: parseInt(issueNumber),
|
|
state: 'closed'
|
|
});
|
|
|
|
console.log(`Closed issue #${issueNumber}`);
|
|
} catch (error) {
|
|
console.error(`Error processing issue #${issueNumber}:`, error.message);
|
|
}
|
|
}
|