From 5412d2a05194b60f947d1113a7a5db2848f87117 Mon Sep 17 00:00:00 2001 From: e7d Date: Fri, 27 Feb 2026 15:41:50 +0100 Subject: [PATCH] feat(): add platform compatibility tests --- .github/workflows/tests.yml | 96 +++++++++++++++++++++++++++++++++++++ Dockerfile | 2 +- 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4aab329..97cca95 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -19,6 +19,102 @@ env: jobs: + # ============================================ + # PLATFORM COMPATIBILITY + # ============================================ + + platform-compatibility: + name: "Compatibility: ${{ matrix.distro }}" + runs-on: ubuntu-latest + needs: validation-env + strategy: + fail-fast: false + matrix: + include: + - distro: debian + image: debian:bookworm-slim + - distro: ubuntu + image: ubuntu:24.04 + - distro: fedora + image: fedora:41 + - distro: alpine + image: alpine:latest + - distro: archlinux + image: archlinux:latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup test helpers + run: | + cat > /tmp/test_helpers.sh << 'HELPERS' + GREEN='\033[32m' + RED='\033[31m' + RESET='\033[0m' + STEP_FAILED=0 + + run_valid() { + local name="$1" + shift + if output=$("$@" 2>&1); then + echo -e "${GREEN}✓ Passed${RESET}: $name" + echo "pass:$name" >> "$RESULTS_FILE" + else + echo -e "${RED}✗ Failed${RESET}: $name" + echo "$output" | head -5 + echo "fail:$name" >> "$RESULTS_FILE" + STEP_FAILED=1 + fi + } + + check_step_result() { + exit $STEP_FAILED + } + HELPERS + touch "$RESULTS_FILE" + + - name: Build test image + run: docker build -t diskmark:test . + + - name: "Test: Run on ${{ matrix.distro }}" + run: | + source /tmp/test_helpers.sh + + CONTAINER_ID=$(docker create \ + --privileged \ + -v /var/run/docker.sock:/var/run/docker.sock \ + ${{ matrix.image }} \ + sleep infinity) + docker start "$CONTAINER_ID" + + case "${{ matrix.distro }}" in + debian|ubuntu) + docker exec "$CONTAINER_ID" sh -c "apt-get update -qq && apt-get install -y -qq docker.io > /dev/null 2>&1" + ;; + fedora) + docker exec "$CONTAINER_ID" sh -c "dnf install -y -q docker > /dev/null 2>&1" + ;; + alpine) + docker exec "$CONTAINER_ID" sh -c "apk add --no-cache docker-cli > /dev/null 2>&1" + ;; + archlinux) + docker exec "$CONTAINER_ID" sh -c "pacman -Sy --noconfirm docker > /dev/null 2>&1" + ;; + esac + + run_valid "DRY_RUN on ${{ matrix.distro }}" \ + docker exec "$CONTAINER_ID" docker run --rm -e DRY_RUN=1 diskmark:test + + run_valid "No 'command not found' errors on ${{ matrix.distro }}" \ + docker exec "$CONTAINER_ID" sh -c "! docker run --rm -e DRY_RUN=1 diskmark:test 2>&1 | grep -i 'command not found'" + + run_valid "No 'not found' errors on ${{ matrix.distro }}" \ + docker exec "$CONTAINER_ID" sh -c "! docker run --rm -e DRY_RUN=1 diskmark:test 2>&1 | grep -i 'not found'" + + docker stop "$CONTAINER_ID" > /dev/null + docker rm "$CONTAINER_ID" > /dev/null + check_step_result + # ============================================ # INPUT VALIDATION - ENV VARIABLES (dry-run) # ============================================ diff --git a/Dockerfile b/Dockerfile index cb39f31..439127c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:latest AS builder RUN apk add --no-cache bash coreutils fio findmnt grep ncurses ncurses-terminfo-base perl procps sed util-linux RUN mkdir -p /diskmark/usr/bin /diskmark/lib /diskmark/usr/lib /diskmark/etc /diskmark/disk && \ - for bin in bash cat cut dd df grep ls mkdir rm sed awk basename dirname env expr fio findmnt free head lsblk numfmt perl printf rev ssl_client tail tput tr wc wget; do cp $(which $bin) /diskmark/usr/bin/; done && \ + for bin in bash cat cut dd df grep ls mkdir rm sed awk basename dirname env expr fio findmnt free head lsblk numfmt perl printf ssl_client tail tput tr wc wget; do cp $(which $bin) /diskmark/usr/bin/; done && \ cp /lib/ld-musl-*.so.1 /diskmark/lib/ && cp -a /lib/*.so* /diskmark/usr/lib/ 2>/dev/null || true && \ cp -a /usr/lib/*.so* /diskmark/usr/lib/ 2>/dev/null || true && \ cp /usr/lib/perl5/core_perl/CORE/libperl.so /diskmark/usr/lib/ && \