name: "Set up uv with retries" description: >- Install uv via astral-sh/setup-uv, retrying on transient failures. Even with an exact pinned version, the action resolves the artifact URL by fetching https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson in a single request with no retry, timeout, or fallback, so one connection-level network error ("fetch failed") fails the whole job before any test runs. Retrying the full step covers the manifest fetch and the binary download. inputs: version: description: "uv version to install" required: true runs: using: composite steps: - name: Set up uv (attempt 1) id: attempt-1 continue-on-error: true uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 with: version: ${{ inputs.version }} - name: Wait before attempt 2 if: steps.attempt-1.outcome == 'failure' shell: bash run: sleep 15 - name: Set up uv (attempt 2) id: attempt-2 if: steps.attempt-1.outcome == 'failure' continue-on-error: true uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 with: version: ${{ inputs.version }} - name: Wait before attempt 3 if: steps.attempt-2.outcome == 'failure' shell: bash run: sleep 30 - name: Set up uv (attempt 3) if: steps.attempt-2.outcome == 'failure' uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0 with: version: ${{ inputs.version }}