mirror of
https://github.com/jdx/mise-action.git
synced 2026-05-18 07:21:53 +00:00
chore(ci): close failing or conflicted PRs sooner (#480)
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Check dist/ / Check dist/ (push) Waiting to run
Continuous Integration / TypeScript Tests (push) Waiting to run
release-plz / release-plz (push) Waiting to run
Test Redacted Environment Variables / test-redacted-env (push) Waiting to run
build-test / build (push) Waiting to run
build-test / alpine (push) Waiting to run
build-test / macos (push) Waiting to run
build-test / ubuntu (push) Waiting to run
build-test / windows (push) Waiting to run
build-test / specific_version (push) Waiting to run
build-test / checksum_failure (push) Waiting to run
build-test / custom_cache_key (push) Waiting to run
build-test / fetch_from_github (push) Waiting to run
build-test / final (push) Blocked by required conditions
zizmor / zizmor (push) Waiting to run
Some checks are pending
CodeQL / Analyze (push) Waiting to run
Check dist/ / Check dist/ (push) Waiting to run
Continuous Integration / TypeScript Tests (push) Waiting to run
release-plz / release-plz (push) Waiting to run
Test Redacted Environment Variables / test-redacted-env (push) Waiting to run
build-test / build (push) Waiting to run
build-test / alpine (push) Waiting to run
build-test / macos (push) Waiting to run
build-test / ubuntu (push) Waiting to run
build-test / windows (push) Waiting to run
build-test / specific_version (push) Waiting to run
build-test / checksum_failure (push) Waiting to run
build-test / custom_cache_key (push) Waiting to run
build-test / fetch_from_github (push) Waiting to run
build-test / final (push) Blocked by required conditions
zizmor / zizmor (push) Waiting to run
## Summary
- close inactive PRs after 7 days only when they have failing checks or
merge conflicts
- include merge state in the PR closer query and close with the specific
reason
- keep existing exclusions for @jdx-authored and keep-open PRs
## Validation
- actionlint .github/workflows/pr-closer.yml
- git diff --check
- jq filter sample validation
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Medium Risk**
> Automates PR closure based on CI/merge-state signals; a bug in the
query or jq logic could incorrectly close active or recoverable PRs.
Limited to GitHub Actions workflow changes but impacts contributor
workflow.
>
> **Overview**
> Updates the `pr-closer` GitHub Actions workflow to **close PRs much
sooner (7 days inactivity)**, but only when they have *failing checks
and/or merge conflicts*.
>
> The workflow now queries `mergeStateStatus` and expanded check
conclusions to generate a specific closure reason, skips “warn-only”
states (e.g., cancelled checks/unknown merge state), increases the
listing limit to 500, and adds `concurrency` plus additional read
permissions (`checks`, `statuses`) to support the new filtering.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
34aded28f6. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
This commit is contained in:
parent
6e1ac6be91
commit
5b3e4e007b
1 changed files with 35 additions and 12 deletions
47
.github/workflows/pr-closer.yml
vendored
47
.github/workflows/pr-closer.yml
vendored
|
|
@ -5,27 +5,50 @@ on:
|
|||
- cron: "0 0 * * *" # daily at midnight
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: pr-closer
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
close-stale-prs:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
checks: read
|
||||
statuses: read
|
||||
steps:
|
||||
- name: Close stale PRs
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
run: |
|
||||
gh pr list -R "${{ github.repository }}" --state open --json number,author,labels,updatedAt,statusCheckRollup --limit 100 | \
|
||||
jq -r '.[] | select(
|
||||
(.updatedAt | fromdateiso8601) < (now - 30*24*60*60) and
|
||||
.author.login != "jdx" and
|
||||
([.labels[].name] | index("keep-open") | not)
|
||||
) | [.number, (if (.statusCheckRollup | length > 0) and (.statusCheckRollup | any(.conclusion == "FAILURE" or .conclusion == "failure")) then "failing" else "passing" end)] | @tsv' | \
|
||||
while read -r pr status; do
|
||||
echo "Closing PR #$pr (checks: $status)"
|
||||
if [ "$status" = "failing" ]; then
|
||||
gh pr close "$pr" -R "${{ github.repository }}" -c "This PR has been open for more than 30 days without activity. Note: CI checks were failing, which may be why it wasn't reviewed. Feel free to reopen or create a new PR if you'd like to continue working on this."
|
||||
else
|
||||
gh pr close "$pr" -R "${{ github.repository }}" -c "This PR has been open for more than 30 days without activity. Feel free to reopen or create a new PR if you'd like to continue working on this."
|
||||
set -o pipefail
|
||||
CUTOFF=$(date -u -d '6 days ago' +%Y-%m-%d)
|
||||
gh pr list -R "$REPO" --state open --search "updated:<$CUTOFF -author:jdx -label:keep-open draft:false" --json number,mergeStateStatus,statusCheckRollup --limit 500 | \
|
||||
jq -r '
|
||||
def failed_check:
|
||||
(.statusCheckRollup | length > 0) and
|
||||
([.statusCheckRollup // [] | .[] | ((.conclusion // .state // "") | ascii_upcase)] | any(. == "FAILURE" or . == "ERROR" or . == "TIMED_OUT" or . == "ACTION_REQUIRED"));
|
||||
|
||||
.[]
|
||||
| failed_check as $failed
|
||||
| ([.statusCheckRollup // [] | .[] | ((.conclusion // .state // "") | ascii_upcase)] | any(. == "CANCELLED")) as $cancelled
|
||||
| (.mergeStateStatus == "DIRTY") as $conflicted
|
||||
| (.mergeStateStatus == "UNKNOWN") as $unknown
|
||||
| if $failed and $conflicted then [.number, "failing checks and merge conflicts"]
|
||||
elif $failed then [.number, "failing checks"]
|
||||
elif $conflicted then [.number, "merge conflicts"]
|
||||
elif $cancelled then [.number, "cancelled checks", "warn"]
|
||||
elif $unknown then [.number, "unknown merge state", "warn"]
|
||||
else empty
|
||||
end
|
||||
| @tsv
|
||||
' | \
|
||||
while IFS=$'\t' read -r pr reason action; do
|
||||
if [ "$action" = "warn" ]; then
|
||||
echo "Skipping PR #$pr ($reason)"
|
||||
continue
|
||||
fi
|
||||
echo "Closing PR #$pr ($reason)"
|
||||
gh pr close "$pr" -R "$REPO" -c "This PR has been inactive for at least 7 days and currently has $reason. Feel free to reopen or create a new PR if you'd like to continue working on this." || echo "Warning: failed to close PR #$pr, skipping"
|
||||
done
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue