Skip to content

Commit

Permalink
Use cargo-nextest for running tests in CI
Browse files Browse the repository at this point in the history
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).

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

[1]: https://nexte.st
  • Loading branch information
tgross35 committed Jan 14, 2025
1 parent ebbd4c1 commit f6f059c
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 24 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:
pull_request:

env:
CARGO_TERM_COLOR: always
CARGO_TERM_VERBOSE: true
RUSTDOCFLAGS: -Dwarnings
RUSTFLAGS: -Dwarnings
Expand Down Expand Up @@ -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 }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion ci/download-musl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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*)
Expand Down
8 changes: 5 additions & 3 deletions ci/run-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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" \
Expand All @@ -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
Expand Down
58 changes: 39 additions & 19 deletions ci/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 }')
Expand All @@ -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*) ;;
Expand All @@ -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
Expand All @@ -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.
Expand All @@ -76,13 +78,31 @@ if [ "${BUILD_ONLY:-}" = "1" ]; then
exit
fi

# Otherwise, run the test suite.

cmd="cargo test --all --target $target $extra_flags"
flags="$flags --all --target $target"
cmd="cargo test $flags"
profile="--profile"

# 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"
Expand All @@ -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

0 comments on commit f6f059c

Please sign in to comment.