Close Issues with Stale Needs More Info Label #247
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: 'Close Issues with Stale Needs More Info Label' | |
on: | |
schedule: | |
# Run this workflow at 00:00 every day | |
- cron: '0 0 * * *' | |
workflow_dispatch: | |
permissions: | |
issues: write | |
contents: read | |
jobs: | |
close-stale-issues: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
- name: Close Stale Issues with Needs More Info Label and Comment | |
uses: actions/github-script@v6 | |
with: | |
github-token: ${{secrets.GITHUB_TOKEN}} | |
script: | | |
const labelName = 'needs-more-info'; | |
const excludedLabel = 'enhancement'; | |
const staleDays = 14; | |
const closingComment = "This issue has been automatically closed due to inactivity and having the 'needs-more-info' label for more than 14 days. If the issue still persists, please reopen the issue with the requested information."; | |
const currentDate = new Date(); | |
const staleDaysInMilliseconds = staleDays * 24 * 60 * 60 * 1000; | |
// Fetch all open issues with 'needs-more-info' label | |
const issues = await github.paginate(github.rest.issues.listForRepo, { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
labels: labelName, | |
state: 'open', | |
}); | |
for (const issue of issues) { | |
// Skip if the issue has 'enhancement' label | |
const labels = issue.labels.map(label => label.name); | |
if (labels.includes(excludedLabel)) { | |
continue; | |
} | |
let labelAddedDate = null; | |
// Fetch events for the issue to find when the label was added | |
const events = await github.paginate(github.rest.issues.listEvents, { | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
}); | |
// Look for the event where the label was added and capture the date | |
for (const event of events) { | |
if (event.event === 'labeled' && event.label.name === labelName) { | |
labelAddedDate = new Date(event.created_at); | |
break; | |
} | |
} | |
if (labelAddedDate) { | |
const issueUpdatedDate = new Date(issue.updated_at); | |
const labelAddedTime = labelAddedDate.getTime(); | |
const issueUpdatedTime = issueUpdatedDate.getTime(); | |
const diffTime = currentDate.getTime() - labelAddedTime; | |
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); | |
// Check if the issue was not updated after the label was added and if it has been more than 'staleDays' since the label was added | |
if (issueUpdatedTime <= labelAddedTime && diffDays > staleDays) { | |
// Post a closing comment before closing the issue | |
await github.rest.issues.createComment({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
body: closingComment, | |
}); | |
// Close the issue | |
await github.rest.issues.update({ | |
owner: context.repo.owner, | |
repo: context.repo.repo, | |
issue_number: issue.number, | |
state: 'closed', | |
}); | |
console.log(`Issue #${issue.number} has been closed with a comment as it has had the '${labelName}' label for more than ${staleDays} days and was not updated since the label was applied.`); | |
} | |
} | |
} |