Fix CleanUpStalePRChecks to handle UNKNOWN mergeable state#8165
Draft
Copilot wants to merge 1 commit into
Draft
Conversation
Previously, the workflow only processed PRs in MERGEABLE state, skipping PRs where GitHub reports the mergeable state as UNKNOWN (which happens when mergeability hasn't been computed yet). Now the workflow only skips PRs with CONFLICTING state (actual merge conflicts), and processes PRs in both MERGEABLE and UNKNOWN states. Agent-Logs-Url: https://github.com/microsoft/BCApps/sessions/9253504e-b5c0-4cd7-90a0-cf30c897fbe3 Co-authored-by: mazhelez <43066499+mazhelez@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
mazhelez
May 15, 2026 10:14
View session
Contributor
|
Could not find a linked ADO work item. Please link one by using the pattern 'AB#' followed by the relevant work item number. You may use the 'Fixes' keyword to automatically resolve the work item when the pull request is merged. E.g. 'Fixes AB#1234' |
onbuyuka
pushed a commit
that referenced
this pull request
Jun 1, 2026
## Summary
Adds a scheduled workflow that automatically labels open PRs whose
GitHub Actions workflow runs are in the `action_required` state — i.e.
waiting for a maintainer with write access to click *Approve and run*.
This lets us easily find PRs that need a manual approval click via:
```
is:pr is:open label:needs-approval
```
…or:
```
gh pr list --repo microsoft/BCApps --label needs-approval
```
## How it works
- **Trigger**: `cron: '*/15 * * * *'` + `workflow_dispatch` (with
optional `whatIf` dry-run input). Mirrors the pattern in
`CleanUpStalePRChecks.yaml`.
- **Reconciliation** is idempotent on every run:
1. Ensures the `needs-approval` label exists (creates it if missing,
color `#FBCA04`).
2. Fetches workflow runs with `status=action_required` from the Actions
API.
3. Resolves each run to a PR number (with a fork-PR fallback via
`commits/{sha}/pulls` since fork-PR workflow runs have an empty
`pull_requests` array).
4. Computes the diff against PRs currently carrying the label.
5. Adds the label to new awaiters, removes it from PRs no longer
awaiting (approved, or PR closed).
- Guarded by `if: github.repository_owner == 'microsoft'` so forks don't
run it.
- Follows existing repo conventions: pwsh, SHA-pinned
`actions/checkout`, composite action under `.github/actions/`, GitHub
step summary.
## Files
- `.github/workflows/LabelPRsAwaitingApproval.yaml` — workflow (schedule
+ manual)
- `.github/actions/LabelPRsAwaitingApproval/action.yaml` — composite
action wrapper
- `.github/actions/LabelPRsAwaitingApproval/action.ps1` — reconciliation
logic
## Validation
Dry-run against `microsoft/BCApps` (using `-WhatIf`) successfully:
- Detected 100 `action_required` workflow runs
- Deduped to 5 unique open PRs awaiting approval (#7410, #7699, #7843,
#8165, #8313)
- Correctly computed: would add label to 5 PRs, remove from 0
## Permissions
The workflow requests minimum required scopes:
- `actions: read` — list action_required runs
- `contents: read` — checkout the composite action
- `issues: write` + `pull-requests: write` — manage the label
Uses `github.token` — no additional secrets needed.
## Caveats / future enhancements
- Page size is 100 with no pagination. Given BCApps' volume of
currently-awaiting runs, this is well within bounds; can be paginated
later if needed.
- Latency is up to 15 minutes. A future enhancement could add
`workflow_run: types: [completed]` for near-instant labelling.
[AB#637233](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/637233)
---------
Co-authored-by: Magnus Hartvig Grønbech <magnushar@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This file contains hidden or 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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The "Clean Up Stale PR Status Checks" workflow only cleans up stale PR builds when the PR's mergeable state is
MERGEABLE. However, GitHub sometimes reports the mergeable state asUNKNOWN(when it hasn't computed mergeability yet), causing those PRs to be skipped and their stale status checks to remain.Fix
Changed the condition to only skip PRs with
CONFLICTINGstate (actual merge conflicts that need manual resolution). PRs in bothMERGEABLEandUNKNOWNstates are now processed for stale check cleanup.Changes
.github/actions/CleanUpStalePRChecks/action.ps1: Replaced$pr.mergeable -ne "MERGEABLE"check with$pr.mergeable -eq "CONFLICTING"to allow processing of PRs inUNKNOWNstate.