Skip to content

Add configurable timeout and retry for git network operations#2390

Open
arabkin wants to merge 2 commits intoactions:mainfrom
arabkin:feat/timeout-retries
Open

Add configurable timeout and retry for git network operations#2390
arabkin wants to merge 2 commits intoactions:mainfrom
arabkin:feat/timeout-retries

Conversation

@arabkin
Copy link

@arabkin arabkin commented Mar 18, 2026

Summary

  • Add per-attempt timeout (default 300s) for git network operations (fetch, lfs-fetch, ls-remote) using Promise.race — a hanging operation is killed and retried instead of blocking until the job-level timeout
  • Add Kubernetes probe-style retry configuration with new action inputs: retry-max-attempts, retry-min-backoff, retry-max-backoff
  • Existing timeout input controls per-attempt deadline (like timeoutSeconds), new inputs control retry behavior (like failureThreshold and periodSeconds)

Example usage

- uses: actions/checkout@v4                                                                                                                                                                                                                                               
  with:                                                                                                                                                                                                                                                                   
    timeout: 30                                                                                                                                                                                                                                                           
    retry-max-attempts: 5                                                                                                                                                                                                                                                 
    retry-min-backoff: 5                                                                                                                                                                                                                                                  
    retry-max-backoff: 15                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                          
Test plan                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                          
- npm run build compiles successfully                                                                                                                                                                                                                                     
- npm test — existing tests pass                                                                                                                                                                                                                                          
- Manual test with timeout: 5 on a large repo to verify timeout triggers retry                                                                                                                                                                                            
- Manual test with default values on normal repos to verify no regression                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                          
Fixes https://github.com/actions/checkout/issues/631                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                          
🤖 Generated with https://claude.com/claude-code  

Add per-attempt timeout (default 300s) and Kubernetes probe-style retry
configuration for git fetch, lfs-fetch, and ls-remote. New action inputs:
timeout, retry-max-attempts, retry-min-backoff, retry-max-backoff.

Fixes actions#631

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@arabkin arabkin marked this pull request as draft March 18, 2026 16:52
@arabkin arabkin force-pushed the feat/timeout-retries branch 2 times, most recently from 61a10d5 to 33c1ac5 Compare March 18, 2026 17:19
- Kill git process on timeout: use child_process.spawn directly for
  timeout-eligible operations so we have a ChildProcess handle to send
  SIGTERM (then SIGKILL after 5s). On Windows, SIGTERM is a forced kill
  so the SIGKILL fallback is effectively a no-op there.

- Fix timeout:0 not working: replace falsy || coalescion with explicit
  empty-string check so that '0' is not replaced by the default '300'.

- Refactor execGit to use an options object instead of 5 positional
  parameters, eliminating error-prone filler args (false, false, {}).

- Pass allowAllExitCodes through to execGitWithTimeout so both code
  paths have consistent behavior for non-zero exit codes.

- Add settled guard to prevent double-reject when both close and error
  events fire on the spawned process.

- Handle null exit code (process killed by signal) as an error rather
  than silently treating it as success.

- Capture stderr in error messages for the timeout path, matching the
  information level of the non-timeout exec path.

- Log SIGKILL failures at debug level instead of empty catch block.

- Warn on customListeners being ignored in the timeout path.

- Emit core.warning() when invalid input values are silently replaced
  with defaults, so users know their configuration was rejected.

- Add input validation in setTimeout (reject negative values).

- Clarify retry-max-attempts semantics: total attempts including the
  initial attempt (3 = 1 initial + 2 retries).

- Remove Kubernetes probe references from descriptions.

- Use non-exhaustive list (e.g.) for network operations in docs to
  avoid staleness if new operations are added.

- Add tests for timeout/retry input parsing (defaults, timeout:0,
  custom values, invalid input with warnings, backoff clamping) and
  command manager configuration (setTimeout, setRetryConfig, fetch).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@arabkin arabkin force-pushed the feat/timeout-retries branch from 33c1ac5 to 3ff67ab Compare March 18, 2026 21:52
@arabkin arabkin marked this pull request as ready for review March 18, 2026 22:08
@leuasseurfarrelds247-arch

[]b9ed7bc40e697b67da34cd9d68743dfc3b29fc1e

@leuasseurfarrelds247-arch

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants