1
0
mirror of https://github.com/containers/youki synced 2024-11-22 17:02:00 +01:00

(feat) add support for musl using cross-rs (#2536)

* add cross configuration for musl

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* use cargo.sh wapper in build.sh

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* make tests build with musl

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* add targets to run musl tests

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* Use cargo.sh wrapper and cross in CI

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* Update scripts/cargo.sh

Co-Authored-By: adrianalin <pop.adrian61@gmail.com>
Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>

* Use glibc as cross default target

---------

Signed-off-by: Jorge Prendes <jorge.prendes@gmail.com>
Co-authored-by: adrianalin <pop.adrian61@gmail.com>
This commit is contained in:
Jorge Prendes 2023-12-21 11:50:03 +00:00 committed by GitHub
parent 72c56f22e3
commit ff79c54968
Signed by: GitHub
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 240 additions and 138 deletions

@ -15,33 +15,38 @@ jobs:
strategy:
matrix:
arch: [ "x86_64", "aarch64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
- name: Setup Rust toolchain and cache
uses: actions-rust-lang/setup-rust-toolchain@v1.3.7
env:
RUST_CACHE_KEY_OS: rust-cache-${{ matrix.arch }}
RUST_CACHE_KEY_OS: rust-cache-${{ matrix.arch }}-${{ matrix.libc }}
- name: Install just
uses: taiki-e/install-action@just
- name: Install requirements
if: ${{ matrix.arch == 'x86_64' }}
run: sudo env PATH=$PATH arch=${{ matrix.arch }} just ci-prepare
- name: Install requirements for aarch64
if: ${{ matrix.arch == 'aarch64' }}
- name: Install cross-rs
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Setup target
run: |
echo "CARGO=cross" >> ${GITHUB_ENV}
echo "TARGET=${{ matrix.arch }}-unknown-linux-${{ matrix.libc }}" >> ${GITHUB_ENV}
- name: Build youki
run: arch=${{ matrix.arch }} just youki-release
run: just youki-release
- name: Upload youki binary
if: ${{ matrix.arch == 'x86_64' }}
uses: actions/upload-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
path: youki
containerd-integration-tests:
runs-on: ubuntu-22.04
needs: [youki-build]
timeout-minutes: 40
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
with:
@ -60,7 +65,7 @@ jobs:
- name: Download youki binary
uses: actions/download-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
- name: Replace runc to youki
run: |
sudo rm -f /usr/bin/runc /usr/local/bin/runc /usr/sbin/runc
@ -74,12 +79,16 @@ jobs:
runs-on: ubuntu-22.04
needs: [youki-build]
timeout-minutes: 40
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
- name: Download youki binary
uses: actions/download-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
- name: Add the permission to run
run: chmod +x ./youki
- name: Install just
@ -91,6 +100,10 @@ jobs:
runs-on: ubuntu-22.04
needs: [youki-build]
timeout-minutes: 15
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
with:
@ -107,7 +120,7 @@ jobs:
- name: Download youki binary
uses: actions/download-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
- name: Add the permission to run
run: chmod +x ./youki
- name: Run integration tests
@ -117,6 +130,10 @@ jobs:
runs-on: ubuntu-22.04
needs: [youki-build]
timeout-minutes: 20
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
with:
@ -130,7 +147,7 @@ jobs:
- name: Download youki binary
uses: actions/download-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
- name: Add the permission to run
run: chmod +x ./youki
- name: Build
@ -142,6 +159,10 @@ jobs:
runs-on: ubuntu-22.04
needs: [youki-build]
timeout-minutes: 20
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
with:
@ -155,7 +176,7 @@ jobs:
- name: Download youki binary
uses: actions/download-artifact@v3
with:
name: youki
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
- name: Add the permission to run
run: chmod +x ./youki
- name: Run tests

@ -35,21 +35,26 @@ jobs:
if: needs.changes.outputs.any_modified == 'true'
runs-on: ubuntu-22.04
timeout-minutes: 15
strategy:
matrix:
arch: [ "x86_64", "aarch64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
- name: Setup Rust toolchain and cache
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: rustfmt, clippy
- name: typos-action
uses: crate-ci/typos@v1.14.12
- uses: taiki-e/install-action@just
- name: Install requirements
run: sudo env PATH=$PATH just ci-prepare
- name: Install just
uses: taiki-e/install-action@just
- name: Install cross-rs
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Setup target
run: |
echo "CARGO=cross" >> ${GITHUB_ENV}
echo "TARGET=${{ matrix.arch }}-unknown-linux-${{ matrix.libc }}" >> ${GITHUB_ENV}
- name: Check formatting and lints
run: just lint
@ -58,46 +63,27 @@ jobs:
if: needs.changes.outputs.any_modified == 'true'
runs-on: ubuntu-22.04
timeout-minutes: 20
strategy:
matrix:
arch: [ "x86_64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
- name: Setup Rust toolchain and cache
uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: taiki-e/install-action@just
- name: Install requirements
run: sudo env PATH=$PATH just ci-prepare
- name: Install just
uses: taiki-e/install-action@just
- name: Install cross-rs
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Setup target
run: |
echo "CARGO=cross" >> ${GITHUB_ENV}
echo "TARGET=${{ matrix.arch }}-unknown-linux-${{ matrix.libc }}" >> ${GITHUB_ENV}
- name: Run tests
run: just test-basic
- name: Run feature tests
run: just test-features
# TODO: musl testing is flaky. Turn it back on when we can resolve it.
# # musl target testing is religated to a separate job because our current build
# # for musl requires nightly. It is difficult to mix stable and nightly
# # toolchains in the same job.
# musl:
# needs: [changes]
# if: needs.changes.outputs.any_modified == 'true'
# runs-on: ubuntu-22.04
# timeout-minutes: 20
# steps:
# - uses: actions/checkout@v3
# # We do not use `actions-rust-lang/setup-rust-toolchain` here because we
# # want to override the default toolchain file to use nightly toolchains.
# # The `setup-rust-toolchain` action will always choose toolchain file with
# # no way to override.
# - name: Setup Rust toolchain and cache
# uses: dtolnay/rust-toolchain@v1
# with:
# toolchain: nightly
# target: x86_64-unknown-linux-musl
# components: rust-src
# - uses: taiki-e/install-action@just
# - name: Install requirements
# run: sudo env PATH=$PATH just ci-musl-prepare
# - name: Run test against musl target
# run: just test-musl
coverage:
needs: [changes]
if: needs.changes.outputs.any_modified == 'true'

@ -24,6 +24,7 @@ jobs:
strategy:
matrix:
arch: [ "x86_64", "aarch64" ]
libc: [ "gnu", "musl" ]
steps:
- uses: actions/checkout@v3
with:
@ -31,18 +32,17 @@ jobs:
- name: Setup Rust toolchain and cache
uses: actions-rust-lang/setup-rust-toolchain@v1.3.7
env:
RUST_CACHE_KEY_OS: rust-cache-${{ matrix.arch }}
RUST_CACHE_KEY_OS: rust-cache-${{ matrix.arch }}-${{ matrix.libc }}
- name: Install just
uses: taiki-e/install-action@just
- name: Install requirements
if: ${{ matrix.arch == 'x86_64' }}
run: |
sudo env PATH=$PATH arch=${{ matrix.arch }} just ci-prepare
- name: Install requirements for aarch64
if: ${{ matrix.arch == 'aarch64' }}
- name: Install cross-rs
run: cargo install cross --git https://github.com/cross-rs/cross
- name: Setup target
run: |
echo "CARGO=cross" >> ${GITHUB_ENV}
echo "TARGET=${{ matrix.arch }}-unknown-linux-${{ matrix.libc }}" >> ${GITHUB_ENV}
- name: Release build
run: arch=${{ matrix.arch }} just youki-release
run: just youki-release
- name: test
# TODO(utam0k): The feature test needs nightly
# run: just test-basic featuretest test-oci
@ -51,12 +51,12 @@ jobs:
- name: Create output directory
run: mkdir output
- name: Create artifact
run: tar -zcvf youki-${{ needs.parse.outputs.version }}-${{ matrix.arch }}.tar.gz youki README.md LICENSE
run: tar -zcvf youki-${{ needs.parse.outputs.version }}-${{ matrix.arch }}-${{ matrix.libc }}.tar.gz youki README.md LICENSE
- name: Upload artifact
uses: actions/upload-artifact@v3
with:
name: youki-${{ matrix.arch }}
path: youki-${{ needs.parse.outputs.version }}-${{ matrix.arch }}.tar.gz
name: youki-${{ matrix.arch }}-${{ matrix.libc }}
path: youki-${{ needs.parse.outputs.version }}-${{ matrix.arch }}-${{ matrix.libc }}.tar.gz
release:
name: Create Draft Release
@ -74,6 +74,8 @@ jobs:
uses: actions/download-artifact@v3
with:
path: artifacts
- name: Show artifacts
run: ls -alhR artifacts
- name: Create release draft
shell: bash
run: |

@ -6,3 +6,9 @@ dockerfile = "cross/Dockerfile.gnu"
[target.x86_64-unknown-linux-gnu]
dockerfile = "cross/Dockerfile.gnu"
[target.aarch64-unknown-linux-musl]
dockerfile = "cross/Dockerfile.musl"
[target.x86_64-unknown-linux-musl]
dockerfile = "cross/Dockerfile.musl"

@ -4,10 +4,15 @@
#[cfg_attr(test, automock())]
pub mod libc {
pub fn setrlimit(
_resource: libc::__rlimit_resource_t,
_rlim: *const libc::rlimit,
) -> libc::c_int {
#[cfg(target_env = "musl")]
#[allow(non_camel_case_types)]
pub type __rlimit_resource_t = libc::c_int;
#[cfg(not(target_env = "musl"))]
#[allow(non_camel_case_types)]
pub type __rlimit_resource_t = libc::__rlimit_resource_t;
pub fn setrlimit(_resource: __rlimit_resource_t, _rlim: *const libc::rlimit) -> libc::c_int {
unimplemented!();
}
}

@ -5,4 +5,11 @@ FROM $CROSS_BASE_IMAGE
ARG CROSS_DEB_ARCH
RUN dpkg --add-architecture ${CROSS_DEB_ARCH} && \
apt-get -y update && \
apt-get install -y pkg-config libseccomp-dev:${CROSS_DEB_ARCH}
apt-get install -y pkg-config \
# dependencies required to build libsecccomp-rs
libseccomp-dev:${CROSS_DEB_ARCH} \
# dependencies required to build libbpf-sys
libelf-dev:${CROSS_DEB_ARCH} \
zlib1g-dev:${CROSS_DEB_ARCH} \
# dependencies to build wasmedge-sys
libzstd-dev:${CROSS_DEB_ARCH}

32
cross/Dockerfile.musl Normal file

@ -0,0 +1,32 @@
ARG CROSS_BASE_IMAGE
FROM $CROSS_BASE_IMAGE
COPY --from=jorgeprendes420/apk-anywhere / /
ENV MARCH=${CROSS_CMAKE_SYSTEM_PROCESSOR}
RUN apk-init ${MARCH} ${CROSS_SYSROOT}
RUN apk-${MARCH} add \
# dependencies required to build libsecccomp-rs
libseccomp-static libseccomp-dev \
# dependencies required to build libbpf-sys
libelf-static elfutils-dev \
zlib-dev zlib-static \
# dependencies to build wasmedge-sys
g++ zstd-static
# configure libsecccomp-rs to use static linking
ENV LIBSECCOMP_LINK_TYPE="static"
ENV LIBSECCOMP_LIB_PATH="${CROSS_SYSROOT}/lib"
# configure wasmedge-sys to link stdc++ statically
ENV WASMEDGE_DEP_STDCXX_LINK_TYPE="static"
ENV WASMEDGE_DEP_STDCXX_LIB_PATH="${CROSS_SYSROOT}/lib"
# wasmedge-sys (through llvm) needs some symbols defined in libgcc
RUN mkdir /.cargo && cat <<'EOF' > /.cargo/config.toml
[target.'cfg(target_env = "musl")']
rustflags = ["-Clink-arg=-lgcc"]
EOF
RUN apt-get -y update && \
apt-get install -y pkg-config

@ -12,19 +12,19 @@ build-all: youki-release rust-oci-tests-bin runtimetest
# build youki in dev mode
youki-dev:
{{ cwd }}/scripts/build.sh -o {{ cwd }} -c youki -a ${arch:-x86_64}
{{ cwd }}/scripts/build.sh -o {{ cwd }} -c youki
# build youki in release mode
youki-release:
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c youki -a ${arch:-x86_64}
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c youki
# build runtimetest binary
runtimetest:
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c runtimetest -a ${arch:-x86_64}
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c runtimetest
# build rust oci tests binary
rust-oci-tests-bin:
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c integration-test -a ${arch:-x86_64}
{{ cwd }}/scripts/build.sh -o {{ cwd }} -r -c integration-test
# Tests
@ -39,20 +39,16 @@ test-basic: test-unit test-doc
# run cargo unit tests
test-unit:
cargo test --lib --bins --all --all-targets --all-features --no-fail-fast
{{ cwd }}/scripts/cargo.sh test --lib --bins --all --all-targets --all-features --no-fail-fast
# run cargo doc tests
test-doc:
cargo test --doc
{{ cwd }}/scripts/cargo.sh test --doc
# run permutated feature compilation tests
test-features:
{{ cwd }}/scripts/features_test.sh
# run test against musl target
test-musl:
{{ cwd }}/scripts/musl_test.sh
# run oci integration tests through runtime-tools
test-oci:
{{ cwd }}/scripts/oci_integration_tests.sh {{ cwd }}
@ -123,8 +119,8 @@ hack-benchmark:
# run linting on project
lint:
cargo fmt --all -- --check
cargo clippy --all --all-targets --all-features -- -D warnings
{{ cwd }}/scripts/cargo.sh fmt --all -- --check
{{ cwd }}/scripts/cargo.sh clippy --all --all-targets --all-features -- -D warnings
# run spellcheck
spellcheck:
@ -132,7 +128,7 @@ spellcheck:
# run format on project
format:
cargo fmt --all
{{ cwd }}/scripts/cargo.sh fmt --all
# cleans up generated artifacts
clean:
@ -140,7 +136,7 @@ clean:
# install tools used in dev
dev-prepare:
cargo install typos-cli
{{ cwd }}/scripts/cargo.sh install typos-cli
# setup dependencies in CI
ci-prepare:

@ -2,18 +2,19 @@
set -euo pipefail
ROOT=$(git rev-parse --show-toplevel)
HOST_TARGET=$(rustc -Vv | grep ^host: | cut -d' ' -f2)
usage_exit() {
echo "Usage: $0 [-r] [-o dir] [-c crate] [-a arch] [-f features]" 1>&2
echo "Usage: $0 [-r] [-o dir] [-c crate] [-f features] [-t target] [-x]" 1>&2
exit 1
}
VERSION=debug
CRATE="youki"
RUNTIMETEST_TARGET="$ROOT/runtimetest-target"
TARGET=${TARGET:-$HOST_TARGET}
CARGO=${CARGO:-}
features=""
ARCH=$(uname -m)
while getopts f:ro:c:ha: OPT; do
while getopts f:ro:c:t:xh OPT; do
case $OPT in
f) features=${OPTARG}
;;
@ -23,8 +24,10 @@ while getopts f:ro:c:ha: OPT; do
;;
c) CRATE=${OPTARG}
;;
a) ARCH=${OPTARG}
;;
t) TARGET=${OPTARG}
;;
x) CARGO=cross
;;
h) usage_exit
;;
\?) usage_exit
@ -35,45 +38,41 @@ done
shift $((OPTIND - 1))
OPTION=""
if [ ${VERSION} = release ]; then
OPTION="--${VERSION}"
if [ "${VERSION}" = release ]; then
OPTION="--release"
fi
TARGET="${ARCH}-unknown-linux-gnu"
CARGO="cargo"
if [ "$ARCH" != "$(uname -m)" ]; then
# shellcheck disable=SC2034
CARGO="cross"
fi
FEATURES=""
FEATURES=()
if [ -n "${features}" ]; then
FEATURES="--features ${features}"
FEATURES=("--features=${features}")
fi
echo "* FEATURES: ${FEATURES}"
echo "* features: ${features}"
echo "* FEATURES: ${features:-<default>}"
echo "* TARGET: ${TARGET}"
OUTPUT=${output:-$ROOT/bin}
[ ! -d $OUTPUT ] && mkdir -p $OUTPUT
mkdir -p "$OUTPUT"
CARGO_SH="$(dirname "$0")/cargo.sh"
export CARGO_BUILD_TARGET="$TARGET"
if [ "$CRATE" == "youki" ]; then
rm -f ${OUTPUT}/youki
$CARGO build --target ${TARGET} ${OPTION} ${FEATURES} --bin youki
mv ${ROOT}/target/${TARGET}/${VERSION}/youki ${OUTPUT}/
rm -f "${OUTPUT}/youki"
"$CARGO_SH" build ${OPTION} "${FEATURES[@]}" --bin youki
mv "$("$CARGO_SH" --print-target-dir)/${TARGET}/${VERSION}/youki" "${OUTPUT}/"
fi
if [ "$CRATE" == "integration-test" ]; then
rm -f ${OUTPUT}/integration_test
cargo build --target ${TARGET} ${OPTION} ${FEATURES} --bin integration_test
mv ${ROOT}/target/${TARGET}/${VERSION}/integration_test ${OUTPUT}/
rm -f "${OUTPUT}/integration_test"
"$CARGO_SH" build ${OPTION} "${FEATURES[@]}" --bin integration_test
mv "$("$CARGO_SH" --print-target-dir)/${TARGET}/${VERSION}/integration_test" "${OUTPUT}/"
fi
if [ "$CRATE" == "runtimetest" ]; then
rm -f ${OUTPUT}/runtimetest
CARGO_TARGET_DIR=${RUNTIMETEST_TARGET} RUSTFLAGS="-Ctarget-feature=+crt-static" cargo build --target ${TARGET} ${OPTION} ${FEATURES} --bin runtimetest
mv ${RUNTIMETEST_TARGET}/${TARGET}/${VERSION}/runtimetest ${OUTPUT}/
rm -f "${OUTPUT}/runtimetest"
export CARGO_TARGET_DIR="$ROOT/runtimetest-target"
export RUSTFLAGS="-Ctarget-feature=+crt-static"
"$CARGO_SH" build ${OPTION} "${FEATURES[@]}" --bin runtimetest
mv "$("$CARGO_SH" --print-target-dir)/${TARGET}/${VERSION}/runtimetest" "${OUTPUT}/"
fi
exit 0

67
scripts/cargo.sh Executable file

@ -0,0 +1,67 @@
#!/usr/bin/env bash
set -euo pipefail
# Usage:
# CARGO_BUILD_TARGET=<target> cargo.sh <args>...
#
# This script wraps `cargo` invocations, and calls either `cargo`
# or `cross`, as appropriate. It checks the value of the
# `CARGO_BUILD_TARGET` environment variable, and calls `cargo` if
# the target matches the host target, and `cross` otherwise.
#
# Use of `cargo`/`cross` can be forced by setting the `CARGO`
# environment variable to `cargo`/`cross`. This is useful for
# instance to force the use of `cross` in CI even for the host
# target.
#
# When cross is used, the target directory will be appended
# `cross-<target>` to avoid libc conflicts in host binaries (e.g.,
# build scripts, proc macros). The computed value of the target
# directory can be obtained with `cargo.sh --print-target-dir`.
#
# Lastly, when using `cross` this scrips sets some configuration
# to allow running `youki` tests inside the `cross`` container.
# Please check the comments in this scrips to learm more about that.
#
# Limitations:
# * You **must** use the `CARGO_BUILD_TARGET` environment variable
# to specify the build target instead of using the `--target` CLI
# argument, or a configuration file like `.cargo/config.toml`.
# * If **must** use the `CARGO_TARGET_DIR` environment variable to
# specify the target directory instead of using the `--target-dir`
# CLI argument, or a configuration file like `.cargo/config.toml`.
#
ROOT=$(git rev-parse --show-toplevel)
HOST_TARGET=$(rustc -Vv | grep ^host: | cut -d' ' -f2)
export CARGO_BUILD_TARGET="${CARGO_BUILD_TARGET:-$HOST_TARGET}"
export CARGO_TARGET_DIR="${CARGO_TARGET_DIR:-$ROOT/target}"
if [ "$CARGO_BUILD_TARGET" == "$HOST_TARGET" ]; then
CARGO="${CARGO:-cargo}"
else
CARGO="${CARGO:-cross}"
fi
if [ "$1" == "fmt" ]; then
# running cargo fmt fails when run through cross
# also cargo fmt is platform independent
CARGO="cargo"
fi
if [ "$CARGO" == "cross" ]; then
export CROSS_BUILD_OPTS="--quiet"
export CARGO_TARGET_DIR="$CARGO_TARGET_DIR/cross-$CARGO_BUILD_TARGET"
# mount run to have access to dbus socket.
# mount /tmp so as shared for test_make_parent_mount_private
export CROSS_CONTAINER_OPTS="--privileged -v/run:/run --mount=type=bind,source=/tmp,destination=/tmp,bind-propagation=shared"
fi
if [ "$1" == "--print-target-dir" ]; then
echo "$CARGO_TARGET_DIR"
exit 0
fi
"$CARGO" "$@"

@ -1,14 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT=$(git rev-parse --show-toplevel)
for bin in youki integration_test runtimetest test.log; do
if [ -f $bin ]; then
rm -f ${1}/$bin
fi
done
rm -rf runtimetest-target
cargo clean
rm -rf $ROOT/target $ROOT/runtimetest-target
exit 0 # unconditionally return zero

@ -1,9 +1,11 @@
#!/usr/bin/env bash
set -euo pipefail
CARGO_SH="$(dirname "$0")/cargo.sh"
test_package_features() {
echo "[feature test] testing $1 with features $2"
cargo build --no-default-features --package "$1" --features "$2"
echo "[feature test] building $1 with features $2"
"$CARGO_SH" build --no-default-features --package "$1" --features "$2"
}
test_package_features "libcontainer" "v1"
@ -20,8 +22,8 @@ test_package_features "libcgroups" "systemd cgroupsv2_devices"
test_features() {
echo "[feature test] testing features $1"
cargo build --no-default-features --features "$1"
cargo test run --no-default-features --features "$1"
"$CARGO_SH" build --no-default-features --features "$1"
"$CARGO_SH" test run --no-default-features --features "$1"
}
test_features "v1"

@ -1,21 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
test_musl() {
echo "[musl test] testing $1 with features $2"
cargo +nightly build \
-Zbuild-std \
--target $(uname -m)-unknown-linux-musl \
--package "$1" \
--no-default-features -F "$2"
cargo +nightly test \
-Zbuild-std \
--target $(uname -m)-unknown-linux-musl \
--package "$1" \
--no-default-features -F "$2"
}
test_musl "libcontainer" "v1"
test_musl "libcontainer" "v2"
test_musl "libcontainer" "v1 v2"