From b930c6ddf54df92e12524ab919b9dc4c6ff3b6e3 Mon Sep 17 00:00:00 2001 From: Massimiliano Pippi Date: Fri, 13 Sep 2019 17:15:35 +0200 Subject: [PATCH] add stale bot for issues --- .github/workflows/stale.yaml | 106 +++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 .github/workflows/stale.yaml diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml new file mode 100644 index 00000000000..06c8e5e8951 --- /dev/null +++ b/.github/workflows/stale.yaml @@ -0,0 +1,106 @@ +name: stale-bot + +on: + schedule: + # run every day at midnight + - cron: '0 0 * * *' + issue_comment: + types: ['created'] + +jobs: + stale-bot: + runs-on: ubuntu-latest + steps: + - name: Mark stale + if: github.event_name == 'schedule' + uses: actions/github-script@0.2.0 + with: + github-token: ${{github.token}} + script: | + // Get a list of all open issues labeled `waiting for feedback` + const opts = github.issues.listForRepo.endpoint.merge({ + ...context.repo, + state: 'open', + labels: ['waiting for feedback'], + }); + const issues = await github.paginate(opts); + + // Set this value to whatever makes sense for the repo. + let elapsedDays = 15 + + let elapsed = elapsedDays * 24 * 60 * 60 * 1000; + let now = new Date(); + for (const issue of issues) { + // If an issue was active in the past 15 days, leave it alone. + if (now - new Date(issue.updated_at).getTime() < elapsedDays) { + continue; + } + + // If we're here, we've been waiting for feedback for more than + // 15 days, mark as stale. + github.issues.addLabels({ + ...context.repo, + issue_number: issue.number, + labels: ['stale'] + }); + } + + - name: Mark active + uses: actions/github-script@0.2.0 + with: + github-token: ${{github.token}} + script: | + // Every time a comment is added to an issue, close it if it contains + // the `stale` label. + + // Load issue's labels. + const opts = github.issues.listLabelsOnIssue.endpoint.merge({ + ...context.repo, + issue_number: context.issue.number + }); + const labels = await github.paginate(opts); + + // Search for `stale`. + for (const label of labels) { + if (label.name === 'stale') { + await github.issues.removeLabel({ + ...context.repo, + issue_number: context.issue.number, + name: 'stale' + }) + return; + } + } + + - name: Close stale + if: github.event_name == 'schedule' + uses: actions/github-script@0.2.0 + with: + github-token: ${{github.token}} + script: | + // Load all the `stale` issues + const opts = github.issues.listForRepo.endpoint.merge({ + ...context.repo, + state: 'open', + labels: ['stale'], + }); + const issues = await github.paginate(opts); + + // Set this value to whatever makes sense for the repo. + let elapsedDays = 30; + + let elapsed = elapsedDays * 24 * 60 * 60 * 1000; + let now = new Date(); + for (const issue of issues) { + // If an issue was stale for less than elapsed time, leave it alone. + if (now - new Date(issue.updated_at).getTime() < elapsed) { + continue; + } + + // Close the stale issue. + await github.issues.update({ + ...context.repo, + issue_number: issue.number, + state: 'closed' + }); + }