Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/workflows/close-open-prs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# One-off / admin: close open PRs when the integration token cannot.
# Run: Actions → Close open pull requests → Run workflow

name: Close open pull requests

on:
workflow_dispatch:
inputs:
pr_numbers:
description: Comma-separated PR numbers to close (leave empty to close all open PRs)
required: false
type: string

permissions:
pull-requests: write
issues: write

jobs:
close:
runs-on: ubuntu-latest
steps:
- name: Close pull requests
uses: actions/github-script@v7
with:
script: |
const input = (context.payload.inputs?.pr_numbers || "").trim();
let prNumbers = [];

if (input) {
prNumbers = input.split(",").map((n) => Number(n.trim())).filter(Boolean);
} else {
const { data } = await github.rest.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: "open",
per_page: 100,
});
Comment on lines +32 to +37

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Paginate when closing all open PRs

When pr_numbers is left empty, the workflow advertises that it closes all open PRs, but this request only fetches a single page capped at 100 PRs. In repositories or cleanup bursts with more than 100 open PRs, PRs beyond the first page remain open while the job summary reports success for the fetched set; use Octokit's pagination helper or loop over pages before building prNumbers.

Useful? React with 👍 / 👎.

prNumbers = data.map((pr) => pr.number);
}

if (prNumbers.length === 0) {
core.info("No open pull requests to close.");
return;
}

for (const number of prNumbers) {
core.info(`Closing PR #${number}`);
await github.rest.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: number,
state: "closed",
});
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: number,
body: "Closed via **Close open pull requests** workflow (team cleanup).",
});
}

core.summary.addRaw(`Closed ${prNumbers.length} pull request(s): ${prNumbers.map((n) => `#${n}`).join(", ")}`);
Loading