mirror of
https://github.com/eclipse-threadx/threadx.git
synced 2026-10-06 06:59:08 +08:00
install.sh grew a retry loop, per-command timeouts and a deliberately non-gating apt-get update after this runner pool cost several whole runs: a mirror going silent for two hours, and a Hash Sum mismatch from a third-party repository the project does not even use turning builds red. Those lessons were local to that one file. install_riscv.sh had none of them, and #717 puts it on every pull request's critical path. Under set -e its bare apt-get update was a single point of failure for the whole suite -- the precise case install.sh downgrades to a warning on purpose -- and its two wget calls, each fetching about 500 MB, had no retry and no timeout. Rather than copy the helpers and let them drift again, they move to tx_ci_common.sh and both scripts source it, following the arrangement scripts/tx_windows_common.ps1 already uses on the Windows side. install.sh keeps its behaviour exactly: same APT_OPTIONS, same 120-second TIMEOUT, same three-attempt retry, and the comments explaining each of them travel with the code they explain. Two things are new: - TIMEOUT_LONG, 180 seconds, for a single large download. Sized against the 39 seconds each tarball took on 10 Sep 2026 and deliberately not larger: the install step is capped at ten minutes, and a per-attempt timeout able to swallow that cap would leave the retry loop no turn to take, which is the failure mode the apt comment already records. - fetch(), which verifies a SHA-256 before anything is unpacked. Both digests were taken from the releases API and then checked against the bytes the CDN actually serves. This is not an independent trust root -- expected value and file come from the same host -- but it pins the bytes, so a deleted and re-pushed tag or a replaced asset stops the build instead of being picked up silently. Also verifies qemu-system-riscv32 alongside riscv64. run.sh selects one per architecture, so both are worth failing on here rather than at the first test. Verified locally: retry returns 0 on success and 1 after three attempts; fetch accepts a correct digest and, on a wrong one, fails and removes the partial file; the source line resolves from the repository root, from an absolute path and through a symlink; and both recorded digests match the bytes served for the pinned tag. Assisted-by: Claude Code (Opus 5) <noreply@anthropic.com>
79 lines
3.5 KiB
Bash
Executable File
79 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
##############################################################################
|
|
# Copyright (c) 2024 Microsoft Corporation
|
|
# Copyright (c) 2026 Eclipse ThreadX contributors
|
|
#
|
|
# This program and the accompanying materials are made available under the
|
|
# terms of the MIT License which is available at
|
|
# https://opensource.org/licenses/MIT.
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
##############################################################################
|
|
|
|
# Install RISC-V bare-metal cross-compiler toolchain and QEMU for CI.
|
|
set -e
|
|
|
|
# retry, TIMEOUT, TIMEOUT_LONG, APT_OPTIONS and fetch. Shared with install.sh,
|
|
# which is where they were written and where the reasons for their shape are
|
|
# recorded.
|
|
. "$(dirname "$(realpath "$0")")/tx_ci_common.sh"
|
|
|
|
# The release tag is pinned so that what CI compiles with is answerable from the
|
|
# repository, and the digests pin the bytes behind the tag. A tag can be deleted
|
|
# and re-pushed and a release asset can be replaced; either would be picked up
|
|
# silently without these. Both digests were taken from the releases API and then
|
|
# checked against the bytes the CDN actually serves, 10 Sep 2026. Moving the tag
|
|
# means refreshing all three lines together.
|
|
RELEASE_TAG="2026.04.26"
|
|
BASE_URL="https://github.com/riscv-collab/riscv-gnu-toolchain/releases/download/${RELEASE_TAG}"
|
|
# Use ubuntu-24.04 binaries to match ubuntu-latest runners.
|
|
RV32_TARBALL="riscv32-elf-ubuntu-24.04-gcc.tar.xz"
|
|
RV32_SHA256="73c9a5adbb38b779312e5b3fc10d624484364ef1f870314571ae92c486ba9917"
|
|
RV64_TARBALL="riscv64-elf-ubuntu-24.04-gcc.tar.xz"
|
|
RV64_SHA256="4a66a329653c9cfb869b826cae6d70c603bedcc1e13d419d3e3e92b99e0816b1"
|
|
|
|
echo "=== Installing QEMU and build tools ==="
|
|
|
|
# The update warns rather than gates, for the reason install.sh sets out at
|
|
# length: apt-get update fails if ANY configured repository serves a bad index,
|
|
# including the third-party ones the runner image carries and this project does
|
|
# not use. The install below is the gate, and it still fails hard on a package
|
|
# it cannot get. Under set -e a bare update would have ended the job -- and with
|
|
# the RISC-V suite running on every pull request, ended it for everybody.
|
|
if ! retry sudo "${TIMEOUT[@]}" apt-get "${APT_OPTIONS[@]}" update; then
|
|
echo ""
|
|
echo "install_riscv.sh: apt-get update did not fully succeed."
|
|
echo "install_riscv.sh: continuing, because a repository this project does"
|
|
echo "install_riscv.sh: not use can fail an update. The install below is"
|
|
echo "install_riscv.sh: the real gate."
|
|
echo ""
|
|
fi
|
|
retry sudo "${TIMEOUT[@]}" apt-get "${APT_OPTIONS[@]}" install -y \
|
|
qemu-system-misc \
|
|
ninja-build \
|
|
cmake || exit 1
|
|
|
|
echo "=== Downloading RISC-V GCC toolchain (${RELEASE_TAG}) ==="
|
|
|
|
# Both tarballs extract into riscv/ with non-overlapping prefixes
|
|
# (riscv32-unknown-elf-* and riscv64-unknown-elf-*).
|
|
for spec in "${RV32_TARBALL}:${RV32_SHA256}" "${RV64_TARBALL}:${RV64_SHA256}"; do
|
|
tarball="${spec%%:*}"
|
|
sha256="${spec##*:}"
|
|
echo "Downloading ${tarball} ..."
|
|
fetch "${BASE_URL}/${tarball}" "/tmp/${tarball}" "${sha256}" || exit 1
|
|
sudo tar xJf "/tmp/${tarball}" -C /opt
|
|
rm "/tmp/${tarball}"
|
|
done
|
|
|
|
TOOLCHAIN_BIN=/opt/riscv/bin
|
|
echo "$TOOLCHAIN_BIN" >> "$GITHUB_PATH"
|
|
|
|
echo "=== Verifying installation ==="
|
|
"$TOOLCHAIN_BIN/riscv32-unknown-elf-gcc" --version | head -1
|
|
"$TOOLCHAIN_BIN/riscv64-unknown-elf-gcc" --version | head -1
|
|
# Both QEMU system emulators are used -- run.sh selects one per architecture --
|
|
# so both are worth failing on here rather than at the first test.
|
|
qemu-system-riscv32 --version | head -1
|
|
qemu-system-riscv64 --version | head -1
|