Files

Ultralytics logo

🔄 Step-Level Retry Action

Retries a step while preserving its full context and environment.

🚀 Usage

Basic Usage

Retry failed step up to 3 times (default):

steps:
  - uses: ultralytics/actions/retry@main
    with:
      run: python train.py

Advanced Usage

Full configuration with custom retries, timeout, backoff, and jitter:

steps:
  - uses: ultralytics/actions/retry@main
    with:
      run: |
        python setup.py install
        pytest tests/
      retries: 2 # Retry twice after initial attempt (3 total runs)
      timeout_minutes: 30 # Total timeout across all attempts
      retry_delay_seconds: 10 # Base delay between retries
      backoff: exponential # exponential (10s, 20s, 40s, ...) or fixed
      jitter: true # Randomize delay to 80-120% to avoid thundering herd
      shell: bash # Use python or bash shell

Python Shell Example

steps:
  - uses: ultralytics/actions/retry@main
    with:
      shell: python
      retries: 5
      run: |
        import requests
        response = requests.get('https://api.example.com/data')
        response.raise_for_status()

📋 Inputs

Input Description Required Default
run Command to run Yes -
retries Number of retry attempts after initial run No 3
timeout_minutes Maximum total time in minutes, checked between attempts No 360
retry_delay_seconds Base delay between retries in seconds No 10
backoff Backoff strategy: exponential (base * 2^n) or fixed No exponential
jitter Randomize delay to 80-120% of value to avoid thundering herd No true
shell Shell to use (bash or python) No bash

✨ Features

  • Preserves environment variables and step context
  • Exponential backoff with ±20% jitter (best-practice defaults)
  • Configurable total timeout across all attempts (individual sleeps auto-capped to remaining budget)
  • GitHub Actions grouping for retry attempts
  • Supports both Bash and Python shells