-
Notifications
You must be signed in to change notification settings - Fork 1
Harden Dependabot auto-merge CI gating and polling timeout bounds #146
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
474bd35
e776920
fc2d8f9
446e60f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -5,6 +5,25 @@ set -euo pipefail | |||||
| : "${PR_HEAD_SHA:?PR_HEAD_SHA is required}" | ||||||
| : "${GITHUB_REPOSITORY:?GITHUB_REPOSITORY is required}" | ||||||
|
|
||||||
| REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS="${REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS:-120}" | ||||||
| REQUIRED_CHECKS_POLL_INTERVAL_SECONDS="${REQUIRED_CHECKS_POLL_INTERVAL_SECONDS:-10}" | ||||||
| REQUIRED_CHECKS_WATCH_INTERVAL_SECONDS="${REQUIRED_CHECKS_WATCH_INTERVAL_SECONDS:-10}" | ||||||
|
|
||||||
| if ! [[ "$REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS" =~ ^[0-9]+$ ]]; then | ||||||
| echo "REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS must be a non-negative integer." >&2 | ||||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| if ! [[ "$REQUIRED_CHECKS_POLL_INTERVAL_SECONDS" =~ ^[1-9][0-9]*$ ]]; then | ||||||
| echo "REQUIRED_CHECKS_POLL_INTERVAL_SECONDS must be a positive integer." >&2 | ||||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| if ! [[ "$REQUIRED_CHECKS_WATCH_INTERVAL_SECONDS" =~ ^[1-9][0-9]*$ ]]; then | ||||||
| echo "REQUIRED_CHECKS_WATCH_INTERVAL_SECONDS must be a positive integer." >&2 | ||||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| get_pr_field() { | ||||||
| local jq_expr="$1" | ||||||
| local output | ||||||
|
|
@@ -35,6 +54,54 @@ attempt_automerge() { | |||||
| return 1 | ||||||
| } | ||||||
|
|
||||||
| required_checks_count() { | ||||||
| gh pr checks "$PR_URL" --required --json name --jq 'length' | ||||||
| } | ||||||
|
|
||||||
| wait_for_required_checks() { | ||||||
| local elapsed=0 | ||||||
| local remaining | ||||||
| local sleep_for | ||||||
| local required_count | ||||||
|
|
||||||
| while ((elapsed <= REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS)); do | ||||||
| if is_stale_event; then | ||||||
| echo "PR head moved while waiting for required checks; skipping stale auto-merge attempt." | ||||||
| return 2 | ||||||
| fi | ||||||
|
|
||||||
| required_count="$(required_checks_count)" | ||||||
| if [[ "$required_count" =~ ^[0-9]+$ ]] && ((required_count > 0)); then | ||||||
| if is_stale_event; then | ||||||
| echo "PR head moved after required checks appeared; skipping stale auto-merge attempt." | ||||||
| return 2 | ||||||
| fi | ||||||
| echo "Waiting for $required_count required checks to pass before enabling auto-merge." | ||||||
| if ! gh pr checks "$PR_URL" --required --watch --fail-fast --interval "$REQUIRED_CHECKS_WATCH_INTERVAL_SECONDS"; then | ||||||
| echo "Required checks did not pass; refusing to enable auto-merge." >&2 | ||||||
| return 1 | ||||||
| fi | ||||||
| return 0 | ||||||
| fi | ||||||
|
|
||||||
| remaining=$((REQUIRED_CHECKS_APPEAR_TIMEOUT_SECONDS - elapsed)) | ||||||
| if ((remaining <= 0)); then | ||||||
| break | ||||||
| fi | ||||||
|
|
||||||
| sleep_for="$REQUIRED_CHECKS_POLL_INTERVAL_SECONDS" | ||||||
| if ((sleep_for > remaining)); then | ||||||
| sleep_for="$remaining" | ||||||
| fi | ||||||
|
|
||||||
| sleep "$sleep_for" | ||||||
| elapsed=$((elapsed + sleep_for)) | ||||||
| done | ||||||
|
|
||||||
| echo "No required checks detected for PR within timeout; refusing to enable auto-merge." >&2 | ||||||
| return 1 | ||||||
| } | ||||||
|
|
||||||
| if [[ "$(get_pr_field '.state')" != "OPEN" ]]; then | ||||||
| echo "PR is not open; skipping auto-merge enable." | ||||||
| exit 0 | ||||||
|
|
@@ -69,6 +136,23 @@ if [[ "$allow_rebase_merge" == "true" || "$allow_merge_commit" == "true" ]]; the | |||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| if wait_for_required_checks; then | ||||||
| wait_status=0 | ||||||
| else | ||||||
| wait_status=$? | ||||||
| fi | ||||||
| if [[ "$wait_status" -eq 2 ]]; then | ||||||
| exit 0 | ||||||
| fi | ||||||
| if [[ "$wait_status" -ne 0 ]]; then | ||||||
| exit 1 | ||||||
| fi | ||||||
|
|
||||||
| if is_stale_event; then | ||||||
| echo "PR head moved after required checks completed; skipping stale auto-merge attempt." | ||||||
|
||||||
| echo "PR head moved after required checks completed; skipping stale auto-merge attempt." | |
| echo "PR head moved before auto-merge could be enabled; skipping stale auto-merge attempt." |
Uh oh!
There was an error while loading. Please reload this page.