Use cargo-nextest for running tests in CI

The test suite for this repo has quite a lot of tests, and it is
difficult to tell which contribute the most to the long CI runtime.
libtest does have an unstable flag to report test times, but that is
inconvenient to use because it needs to be passed only to libtest
binaries.

Switch to cargo-nextest [1] which provides time reporting and, overall,
a better test UI. It may also improve test runtime, though this seems
unlikely since we have larger test binaries with many small tests
(nextest benefits the most when there are larger binaries that can be
run in parallel).

For anyone running locally without, `run.sh` should still fall back to
`cargo test` if `cargo-nextest` is not available.

This diff includes some cleanup and consistency changes to other
CI-related files.

[1]: https://nexte.st
This commit is contained in:
Trevor Gross 2025-01-13 23:40:42 +00:00 committed by Trevor Gross
parent bfbe919adf
commit 26df5d6689
5 changed files with 47 additions and 23 deletions

View file

@ -6,6 +6,7 @@ on:
pull_request:
env:
CARGO_TERM_COLOR: always
CARGO_TERM_VERBOSE: true
RUSTDOCFLAGS: -Dwarnings
RUSTFLAGS: -Dwarnings
@ -88,6 +89,7 @@ jobs:
rustup default "$channel"
rustup target add "${{ matrix.target }}"
rustup component add clippy llvm-tools-preview
- uses: taiki-e/install-action@nextest
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.target }}

View file

@ -12,7 +12,7 @@ on:
jobs:
release-plz:
name: Release-plz
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- name: Checkout repository
uses: actions/checkout@v4

View file

@ -7,7 +7,7 @@ fname=musl-1.2.5.tar.gz
sha=a9a118bbe84d8764da0ea0d28b3ab3fae8477fc7e4085d90102b8596fc7c75e4
mkdir musl
curl "https://musl.libc.org/releases/$fname" -O
curl -L "https://musl.libc.org/releases/$fname" -O
case "$(uname -s)" in
MINGW*)

View file

@ -24,12 +24,14 @@ run() {
# will be owned by root
mkdir -p target
docker build -t "$target" "ci/docker/$target"
set_env="HOME=/tmp PATH=\$PATH:/rust/bin:/cargo/bin"
docker build -t "libm-$target" "ci/docker/$target"
docker run \
--rm \
--user "$(id -u):$(id -g)" \
-e CI \
-e RUSTFLAGS \
-e CARGO_TERM_COLOR \
-e CARGO_HOME=/cargo \
-e CARGO_TARGET_DIR=/target \
-e "EMULATED=$emulated" \
@ -39,8 +41,8 @@ run() {
-v "$(rustc --print sysroot):/rust:ro" \
--init \
-w /checkout \
"$target" \
sh -c "HOME=/tmp PATH=\$PATH:/rust/bin exec ci/run.sh $target"
"libm-$target" \
sh -c "$set_env exec ci/run.sh $target"
}
if [ -z "$1" ]; then

View file

@ -3,8 +3,10 @@
set -eux
export RUST_BACKTRACE="${RUST_BACKTRACE:-full}"
export NEXTEST_STATUS_LEVEL=all
target="${1:-}"
flags=""
if [ -z "$target" ]; then
host_target=$(rustc -vV | awk '/^host/ { print $2 }')
@ -13,22 +15,22 @@ if [ -z "$target" ]; then
fi
# We enumerate features manually.
extra_flags="--no-default-features"
flags="$flags --no-default-features"
# Enable arch-specific routines when available.
extra_flags="$extra_flags --features arch"
flags="$flags --features arch"
# Always enable `unstable-float` since it expands available API but does not
# change any implementations.
extra_flags="$extra_flags --features unstable-float"
flags="$flags --features unstable-float"
# We need to specifically skip tests for musl-math-sys on systems that can't
# build musl since otherwise `--all` will activate it.
case "$target" in
# Can't build at all on MSVC, WASM, or thumb
*windows-msvc*) extra_flags="$extra_flags --exclude musl-math-sys" ;;
*wasm*) extra_flags="$extra_flags --exclude musl-math-sys" ;;
*thumb*) extra_flags="$extra_flags --exclude musl-math-sys" ;;
*windows-msvc*) flags="$flags --exclude musl-math-sys" ;;
*wasm*) flags="$flags --exclude musl-math-sys" ;;
*thumb*) flags="$flags --exclude musl-math-sys" ;;
# We can build musl on MinGW but running tests gets a stack overflow
*windows-gnu*) ;;
@ -38,7 +40,7 @@ case "$target" in
*powerpc64le*) ;;
# Everything else gets musl enabled
*) extra_flags="$extra_flags --features libm-test/build-musl" ;;
*) flags="$flags --features libm-test/build-musl" ;;
esac
# Configure which targets test against MPFR
@ -50,17 +52,17 @@ case "$target" in
# Targets that aren't cross compiled work fine
# FIXME(ci): we should be able to enable aarch64 Linux here once GHA
# support rolls out.
x86_64*) extra_flags="$extra_flags --features libm-test/build-mpfr" ;;
i686*) extra_flags="$extra_flags --features libm-test/build-mpfr" ;;
i586*) extra_flags="$extra_flags --features libm-test/build-mpfr --features gmp-mpfr-sys/force-cross" ;;
x86_64*) flags="$flags --features libm-test/build-mpfr" ;;
i686*) flags="$flags --features libm-test/build-mpfr" ;;
i586*) flags="$flags --features libm-test/build-mpfr --features gmp-mpfr-sys/force-cross" ;;
# Apple aarch64 is native
aarch64*apple*) extra_flags="$extra_flags --features libm-test/build-mpfr" ;;
aarch64*apple*) flags="$flags --features libm-test/build-mpfr" ;;
esac
# FIXME: `STATUS_DLL_NOT_FOUND` testing macros on CI.
# <https://github.com/rust-lang/rust/issues/128944>
case "$target" in
*windows-gnu) extra_flags="$extra_flags --exclude libm-macros" ;;
*windows-gnu) flags="$flags --exclude libm-macros" ;;
esac
# Make sure we can build with overriding features.
@ -76,13 +78,31 @@ if [ "${BUILD_ONLY:-}" = "1" ]; then
exit
fi
# Otherwise, run the test suite.
flags="$flags --all --target $target"
cmd="cargo test $flags"
profile="--profile"
cmd="cargo test --all --target $target $extra_flags"
# If nextest is available, use that
command -v cargo-nextest && nextest=1 || nextest=0
if [ "$nextest" = "1" ]; then
# Workaround for https://github.com/nextest-rs/nextest/issues/2066
if [ -f /.dockerenv ]; then
cfg_file="/tmp/nextest-config.toml"
echo "[store]" >> "$cfg_file"
echo "dir = \"$CARGO_TARGET_DIR/nextest\"" >> "$cfg_file"
cfg_flag="--config-file $cfg_file"
fi
cmd="cargo nextest run ${cfg_flag:-} $flags"
profile="--cargo-profile"
fi
# Test once without intrinsics
$cmd
# Run doctests if they were excluded by nextest
[ "$nextest" = "1" ] && cargo test --doc $flags
# Exclude the macros and utile crates from the rest of the tests to save CI
# runtime, they shouldn't have anything feature- or opt-level-dependent.
cmd="$cmd --exclude util --exclude libm-macros"
@ -93,10 +113,10 @@ $cmd --features unstable-intrinsics --benches
# Test the same in release mode, which also increases coverage. Also ensure
# the soft float routines are checked.
$cmd --profile release-checked
$cmd --profile release-checked --features force-soft-floats
$cmd --profile release-checked --features unstable-intrinsics
$cmd --profile release-checked --features unstable-intrinsics --benches
$cmd "$profile" release-checked
$cmd "$profile" release-checked --features force-soft-floats
$cmd "$profile" release-checked --features unstable-intrinsics
$cmd "$profile" release-checked --features unstable-intrinsics --benches
# Ensure that the routines do not panic.
ENSURE_NO_PANIC=1 cargo build -p libm --target "$target" --no-default-features --release