diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 7e03325d..ac43043c 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -35,8 +35,25 @@ jobs: - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27 - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Set up Python + id: setup_python + continue-on-error: true + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.11" + + - name: Wait before Python retry + if: steps.setup_python.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-python failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Python (retry) + if: steps.setup_python.outcome == 'failure' uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.11" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4b98278..91ce89dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Format check run: cargo fmt --all -- --check @@ -67,11 +69,43 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Set up Node + id: setup_node + continue-on-error: true + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: "20" - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - name: Wait before Node retry + if: steps.setup_node.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-node failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Node (retry) + if: steps.setup_node.outcome == 'failure' + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "20" + + - name: Set up Python + id: setup_python + continue-on-error: true + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.12" + + - name: Wait before Python retry + if: steps.setup_python.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-python failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Python (retry) + if: steps.setup_python.outcome == 'failure' + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.12" @@ -128,17 +162,49 @@ jobs: components: clippy - name: Set up Python + id: setup_python + continue-on-error: true + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + + - name: Wait before Python retry + if: steps.setup_python.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-python failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Python (retry) + if: steps.setup_python.outcome == 'failure' uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.12" - name: Set up Node + id: setup_node + continue-on-error: true + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "20" + + - name: Wait before Node retry + if: steps.setup_node.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-node failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Node (retry) + if: steps.setup_node.outcome == 'failure' uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: "20" - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Clippy (bindings, all targets) run: cargo clippy -p wickra-node -p wickra-python --all-targets -- -D warnings @@ -175,6 +241,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Build on MSRV run: cargo build ${{ matrix.packages }} --verbose @@ -196,9 +264,12 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Install cargo-llvm-cov uses: taiki-e/install-action@0fd46367812ee04360509b4169d9f659d6892bb2 # v2.79.15 + timeout-minutes: 10 # fail fast on a stuck download instead of hanging the job with: tool: cargo-llvm-cov @@ -248,6 +319,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 with: workspaces: fuzz @@ -260,6 +333,7 @@ jobs: # never gets off the ground. The prebuilt binary avoids the entire # transitive-dep compile. uses: taiki-e/install-action@0fd46367812ee04360509b4169d9f659d6892bb2 # v2.79.15 + timeout-minutes: 10 # fail fast on a stuck download instead of hanging the job with: tool: cargo-fuzz @@ -299,6 +373,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 # setup-python downloads the interpreter from the Actions tool cache / # nodejs CDN and occasionally hangs or 5xx's on the Windows runners. @@ -361,6 +437,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Install wasm-pack # jetli/wasm-pack-action@v0.4.0 with no `version:` input installs an @@ -371,6 +449,7 @@ jobs: # cargo-llvm-cov and cargo-fuzz; it tracks the latest wasm-pack # release, which has `--features` as a top-level flag (since 0.12). uses: taiki-e/install-action@0fd46367812ee04360509b4169d9f659d6892bb2 # v2.79.15 + timeout-minutes: 10 # fail fast on a stuck download instead of hanging the job with: tool: wasm-pack @@ -402,6 +481,8 @@ jobs: - name: Cache cargo uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 # setup-node downloads Node from nodejs.org and we've seen it fail on # Windows runners with "Attempting to download 18..." followed by a diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 30408d3b..7fcd1460 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,6 +26,8 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable branch, 2026-03-27 - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 # Idempotent publishing: if the version is already on crates.io we # treat that as success so re-runs of the workflow don't fail. @@ -85,6 +87,7 @@ jobs: # re-resolving Cargo.lock. - name: Install cargo-cyclonedx uses: taiki-e/install-action@0fd46367812ee04360509b4169d9f659d6892bb2 # v2.79.15 + timeout-minutes: 10 # fail fast on a stuck download instead of hanging the job with: tool: cargo-cyclonedx @@ -131,7 +134,21 @@ jobs: runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + - name: Set up Python + id: setup_python + continue-on-error: true + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 + with: + python-version: "3.11" + - name: Wait before Python retry + if: steps.setup_python.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-python failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + - name: Set up Python (retry) + if: steps.setup_python.outcome == 'failure' + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: "3.11" - name: Sync root README into bindings/python so it ships with the wheel @@ -206,7 +223,23 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Set up Node + id: setup_node + continue-on-error: true + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "20" + + - name: Wait before Node retry + if: steps.setup_node.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-node failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Node (retry) + if: steps.setup_node.outcome == 'failure' + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: "20" @@ -215,6 +248,8 @@ jobs: targets: ${{ matrix.target }} - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + continue-on-error: true # cache is an optimisation; never block on a stuck/slow restore + timeout-minutes: 6 - name: Install Node deps working-directory: bindings/node @@ -247,7 +282,24 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Set up Node + id: setup_node + continue-on-error: true + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" + + - name: Wait before Node retry + if: steps.setup_node.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-node failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Node (retry) + if: steps.setup_node.outcome == 'failure' + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: "20" registry-url: "https://registry.npmjs.org" @@ -397,7 +449,24 @@ jobs: steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + - name: Set up Node + id: setup_node + continue-on-error: true + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: "20" + registry-url: "https://registry.npmjs.org" + + - name: Wait before Node retry + if: steps.setup_node.outcome == 'failure' + shell: bash + run: | + echo "::warning::setup-node failed (likely CDN flake), waiting 30s before retry..." + sleep 30 + + - name: Set up Node (retry) + if: steps.setup_node.outcome == 'failure' + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: "20" registry-url: "https://registry.npmjs.org" @@ -410,6 +479,7 @@ jobs: # See the matching note in ci.yml: jetli's default installs an old # 0.10.x wasm-pack whose build subcommand rejects --features. uses: taiki-e/install-action@0fd46367812ee04360509b4169d9f659d6892bb2 # v2.79.15 + timeout-minutes: 10 # fail fast on a stuck download instead of hanging the job with: tool: wasm-pack