diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a434fdae0e0..0b8128feb2f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -648,20 +648,51 @@ jobs: matrix: ${{ fromJson(needs.preflight.outputs.checks_node_core_test_matrix) }} steps: - name: Checkout - id: checkout - uses: actions/checkout@v6 - timeout-minutes: 2 - continue-on-error: true - with: - persist-credentials: false - submodules: false + shell: bash + env: + CHECKOUT_REPO: ${{ github.repository }} + CHECKOUT_SHA: ${{ github.sha }} + CHECKOUT_TOKEN: ${{ github.token }} + run: | + set -euo pipefail - - name: Checkout (retry) - if: steps.checkout.outcome == 'failure' - uses: actions/checkout@v6 - with: - persist-credentials: false - submodules: false + workdir="$GITHUB_WORKSPACE" + auth_header="$(printf 'x-access-token:%s' "$CHECKOUT_TOKEN" | base64 | tr -d '\n')" + + reset_checkout_dir() { + mkdir -p "$workdir" + find "$workdir" -mindepth 1 -maxdepth 1 -exec rm -rf {} + + } + + checkout_attempt() { + local attempt="$1" + + reset_checkout_dir + git init "$workdir" >/dev/null + git config --global --add safe.directory "$workdir" + git -C "$workdir" remote add origin "https://github.com/${CHECKOUT_REPO}" + git -C "$workdir" config gc.auto 0 + + timeout --signal=TERM 30s git -C "$workdir" \ + -c protocol.version=2 \ + -c "http.https://github.com/.extraheader=AUTHORIZATION: basic ${auth_header}" \ + fetch --no-tags --prune --no-recurse-submodules --depth=1 origin \ + "+${CHECKOUT_SHA}:refs/remotes/origin/ci-target" + + git -C "$workdir" checkout --force --detach "$CHECKOUT_SHA" + echo "checkout attempt ${attempt}/2 succeeded" + } + + for attempt in 1 2; do + if checkout_attempt "$attempt"; then + exit 0 + fi + echo "checkout attempt ${attempt}/2 failed" + sleep $((attempt * 5)) + done + + echo "checkout failed after 2 attempts" >&2 + exit 1 - name: Setup Node environment uses: ./.github/actions/setup-node-env