diff --git a/.github/workflows/scripts/generate-summary.sh b/.github/workflows/scripts/generate-summary.sh
index b5d89208a5d8..8a0df69c8009 100755
--- a/.github/workflows/scripts/generate-summary.sh
+++ b/.github/workflows/scripts/generate-summary.sh
@@ -1,12 +1,5 @@
#!/usr/bin/env bash
-# for runtime reasons we split functional testings into N parts
-# - use a define to check for missing tarfiles
-FUNCTIONAL_PARTS="4"
-
-ZTS_REPORT="tests/test-runner/bin/zts-report.py"
-chmod +x $ZTS_REPORT
-
function output() {
echo -e $* >> Summary.md
}
@@ -16,8 +9,8 @@ function error() {
}
# this function generates the real summary
-# - expects a logfile "log" in current directory
function generate() {
+
# we issued some error already
test ! -s log && return
@@ -31,7 +24,7 @@ function generate() {
# summary of errors
if [ -s err ]; then
output "
"
- $ZTS_REPORT --no-maybes ./list >> Summary.md
+ ./zts-report.py --no-maybes ./list >> Summary.md
output "
"
# generate seperate error logfile
@@ -45,12 +38,30 @@ function generate() {
output "All tests passed :thumbsup:"
fi
+ if [ -s uname.txt ]; then
+ output "Uname -a
"
+ cat uname.txt >> Summary.md
+ output "
"
+ fi
+
+ if [ -s dmesg-prerun.txt ]; then
+ output "Dmesg - prerun
"
+ cat dmesg-prerun.txt >> Summary.md
+ output "
"
+ fi
+
+ if [ -s dmesg-module-load ]; then
+ output "Dmesg - module loading
"
+ cat dmesg-module-load.txt >> Summary.md
+ output "
"
+ fi
+
output "Full Listing
"
cat list >> Summary.md
output "
"
# remove tmp files
- rm -f err list log
+ rm -f err list log *.txt
}
# check tarfiles and untar
@@ -71,29 +82,42 @@ function check_logfile() {
fi
}
-# sanity
-function summarize_s() {
- headline="$1"
+# sanity checks on ubuntu runner
+function summarize_sanity() {
+ headline="Sanity Tests Ubuntu $1"
output "\n## $headline\n"
rm -rf testfiles
- check_tarfile "$2/sanity.tar"
+ check_tarfile "Logs-$1-sanity/sanity.tar"
check_logfile "testfiles/log"
generate
}
-# functional
-function summarize_f() {
- headline="$1"
+# functional on ubuntu runner matrix
+function summarize_functional() {
+ headline="Functional Tests Ubuntu $1"
output "\n## $headline\n"
rm -rf testfiles
- for i in $(seq 1 $FUNCTIONAL_PARTS); do
- tarfile="$2-part$i/part$i.tar"
+ for i in $(seq 1 4); do
+ tarfile="Logs-$1-functional-part$i/part$i.tar"
check_tarfile "$tarfile"
check_logfile "testfiles/log"
done
generate
}
+# functional tests via qemu
+function summarize_qemu() {
+ for tarfile in Logs-functional*/qemu-*.tar; do
+ rm -rf current
+ check_tarfile "$tarfile"
+ osname=`cat osname.txt`
+ headline="Functional Tests: $osname"
+ output "\n## $headline\n"
+ check_logfile "current/log"
+ generate
+ done
+}
+
# https://docs.github.com/en/enterprise-server@3.6/actions/using-workflows/workflow-commands-for-github-actions#step-isolation-and-limits
# Job summaries are isolated between steps and each step is restricted to a maximum size of 1MiB.
# [ ] can not show all error findings here
@@ -102,11 +126,20 @@ function summarize_f() {
ERRLOGS=0
if [ ! -f Summary/Summary.md ]; then
# first call, we do the default summary (~500k)
+
+ # create ./zts-report.py for generate()
+ if [ ! -x ./zts-report.py ]; then
+ TEMPLATE="tests/test-runner/bin/zts-report.py.in"
+ cat $TEMPLATE| sed -e 's|@PYTHON_SHEBANG@|python3|' > ./zts-report.py
+ chmod +x ./zts-report.py
+ fi
+
echo -n > Summary.md
- summarize_s "Sanity Tests Ubuntu 20.04" Logs-20.04-sanity
- summarize_s "Sanity Tests Ubuntu 22.04" Logs-22.04-sanity
- summarize_f "Functional Tests Ubuntu 20.04" Logs-20.04-functional
- summarize_f "Functional Tests Ubuntu 22.04" Logs-22.04-functional
+ summarize_sanity "20.04"
+ summarize_sanity "22.04"
+ summarize_functional "20.04"
+ summarize_functional "22.04"
+ summarize_qemu
cat Summary.md >> $GITHUB_STEP_SUMMARY
mkdir -p Summary
diff --git a/.github/workflows/scripts/qemu-build.sh b/.github/workflows/scripts/qemu-build.sh
new file mode 100755
index 000000000000..e8bd2f08f1b5
--- /dev/null
+++ b/.github/workflows/scripts/qemu-build.sh
@@ -0,0 +1,86 @@
+#!/usr/bin/env bash
+
+#####################################################
+# 4) configure and build openzfs modules #
+#####################################################
+
+set -eu
+
+function freebsd() {
+ echo "##[group]Autogen.sh"
+ MAKE="gmake" ./autogen.sh
+ echo "##[endgroup]"
+
+ echo "##[group]Configure"
+ MAKE="gmake" ./configure \
+ --prefix=/usr/local \
+ --with-libintl-prefix=/usr/local \
+ --enable-debug \
+ --enable-debuginfo
+ echo "##[endgroup]"
+
+ echo "##[group]Build"
+ gmake -j`sysctl -n hw.ncpu`
+ echo "##[endgroup]"
+
+ echo "##[group]Install"
+ sudo gmake install
+ echo "##[endgroup]"
+
+ echo "##[group]Load modules"
+ # when freebsd zfs is loaded, unload it:
+ kldstat -n zfs 2>/dev/null && kldunload zfs
+ sudo dmesg -c > /var/tmp/dmesg-prerun.txt
+ sudo -E ./scripts/zfs.sh
+ sudo dmesg
+ sudo dmesg -c > /var/tmp/dmesg-module-load.txt
+ echo "Loaded module: "
+ kldstat -n openzfs
+ echo "##[endgroup]"
+}
+
+function linux_forceload() {
+ echo "Need to force the module loading!"
+ # -f tells modprobe to ignore wrong version numbers
+ sudo modprobe -v -f spl || echo "!! Loading module spl is failing !!"
+ sudo modprobe -v -f zfs || echo "!! Loading module zfs is failing !!"
+}
+
+function linux() {
+ echo "##[group]Autogen.sh"
+ ./autogen.sh
+ echo "##[endgroup]"
+
+ echo "##[group]Configure"
+ ./configure \
+ --prefix=/usr \
+ --enable-debug \
+ --enable-debuginfo
+ echo "##[endgroup]"
+
+ echo "##[group]Build"
+ make -j$(nproc)
+ echo "##[endgroup]"
+
+ echo "##[group]Install"
+ sudo make install
+ echo "##[endgroup]"
+
+ echo "##[group]Load modules"
+ sudo dmesg -c > /var/tmp/dmesg-prerun.txt
+ sudo -E ./scripts/zfs.sh
+ test -d /proc/spl/kstat/zfs || linux_forceload
+ sudo dmesg
+ sudo dmesg -c > /var/tmp/dmesg-module-load.txt
+ echo "##[endgroup]"
+}
+
+export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin"
+case "$1" in
+ freebsd*)
+ freebsd
+ ;;
+ *)
+ linux
+ ;;
+esac
diff --git a/.github/workflows/scripts/qemu-deps.sh b/.github/workflows/scripts/qemu-deps.sh
new file mode 100755
index 000000000000..9e08f222d75b
--- /dev/null
+++ b/.github/workflows/scripts/qemu-deps.sh
@@ -0,0 +1,121 @@
+#!/usr/bin/env bash
+
+#####################################################
+# 3) install dependencies for compiling and loading #
+#####################################################
+
+set -eu
+
+function archlinux() {
+ echo "##[group]Running pacman -Syu"
+ sudo pacman -Syu --noconfirm
+ echo "##[endgroup]"
+
+ # XXX: image must have these installed: linux linux-headers
+ echo "##[group]Install Development Tools"
+ sudo pacman -Sy --noconfirm base-devel bc cpio dkms fakeroot fio \
+ inetutils lsscsi nfs-utils parted pax perf ksh samba sysstat \
+ rng-tools rsync wget
+ echo "##[endgroup]"
+}
+
+function debian() {
+ export DEBIAN_FRONTEND=noninteractive
+
+ echo "##[group]Running apt-get update+upgrade"
+ sudo apt-get update -y
+ sudo apt-get upgrade -y
+ echo "##[endgroup]"
+
+ echo "##[group]Install Development Tools"
+ yes | sudo apt-get install -y build-essential autoconf libtool \
+ libtool-bin gdb lcov git alien fakeroot wget curl bc fio acl \
+ sysstat lsscsi parted gdebi attr dbench watchdog ksh nfs-kernel-server \
+ samba rng-tools dkms rsync linux-headers-$(uname -r) \
+ zlib1g-dev uuid-dev libblkid-dev libselinux-dev \
+ xfslibs-dev libattr1-dev libacl1-dev libudev-dev libdevmapper-dev \
+ libssl-dev libaio-dev libffi-dev libelf-dev libmount-dev \
+ libpam0g-dev pamtester python3-dev python3-setuptools python3 \
+ python3-dev python3-setuptools python3-cffi libcurl4-openssl-dev \
+ python3-packaging python3-distlib
+ echo "##[endgroup]"
+}
+
+function freebsd() {
+ export ASSUME_ALWAYS_YES="YES"
+
+ echo "##[group]Install Development Tools"
+ yes | sudo pkg install autoconf automake autotools git gmake gsed python \
+ devel/py-sysctl gettext gettext-runtime base64 checkbashisms \
+ lscpu fio ksh93 pamtester devel/py-flake8 pamtester rsync
+ echo "##[endgroup]"
+
+ echo "##[group]Install Kernel Headers"
+ ABI=$(uname -p)
+ VERSION=$(freebsd-version -r)
+ cd /tmp
+ fetch https://download.freebsd.org/ftp/snapshots/${ABI}/${VERSION}/src.txz ||
+ fetch https://download.freebsd.org/ftp/releases/${ABI}/${VERSION}/src.txz
+ sudo tar xpf src.txz -C /
+ rm src.txz
+ echo "##[endgroup]"
+}
+
+function rhel() {
+ echo "##[group]Running dnf update"
+ sudo dnf update -y
+ echo "##[endgroup]"
+
+ echo "##[group]Install Development Tools"
+ sudo dnf group install -y "Development Tools"
+ sudo dnf install -y libtool rpm-build libtirpc-devel libblkid-devel \
+ libuuid-devel libudev-devel openssl-devel zlib-devel libaio-devel \
+ libattr-devel elfutils-libelf-devel python3 python3-devel \
+ python3-setuptools python3-cffi libffi-devel git ncompress \
+ libcurl-devel python3-packaging
+ sudo dnf install -y kernel-devel-$(uname -r)
+ echo "##[endgroup]"
+
+ echo "##[group]Install utilities for ZTS"
+ sudo dnf install -y acl ksh bc bzip2 fio sysstat mdadm lsscsi parted attr \
+ nfs-utils samba rng-tools perf rsync dbench pamtester
+ echo "##[endgroup]"
+}
+
+case "$1" in
+ almalinux8|centos-stream8)
+ echo "##[group]Enable epel and powertools repositories"
+ sudo dnf config-manager -y --set-enabled powertools
+ sudo dnf install -y epel-release
+ echo "##[endgroup]"
+ rhel
+ ;;
+ almalinux9|centos-stream9)
+ echo "##[group]Enable epel and crb repositories"
+ sudo dnf config-manager -y --set-enabled crb
+ sudo dnf install -y epel-release
+ echo "##[endgroup]"
+ rhel
+ ;;
+ archlinux)
+ archlinux
+ ;;
+ debian*)
+ debian
+ echo "##[group]Install linux-perf"
+ sudo apt-get install -yq linux-perf
+ echo "##[endgroup]"
+ ;;
+ fedora*)
+ rhel
+ ;;
+ freebsd*)
+ freebsd
+ ;;
+ ubuntu*)
+ debian
+ echo "##[group]Install linux-tools-common"
+ sudo apt-get install -yq linux-tools-common
+ echo "##[endgroup]"
+ ;;
+esac
diff --git a/.github/workflows/scripts/qemu-setup.sh b/.github/workflows/scripts/qemu-setup.sh
new file mode 100755
index 000000000000..2c3d75e7ff39
--- /dev/null
+++ b/.github/workflows/scripts/qemu-setup.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+##########################################################
+# 1) setup the action runner to start some qemu instance #
+##########################################################
+
+set -eu
+
+# only install qemu, leave the system as it is
+sudo apt-get update
+sudo apt-get install axel cloud-image-utils guestfs-tools virt-manager
+
+# generate ssh keys
+sudo ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -q -N ""
+
+# no swap needed
+sudo swapoff -a
+
+# disk usage afterwards
+sudo df -h /
+sudo df -h /mnt
+sudo fstrim -a
diff --git a/.github/workflows/scripts/qemu-start.sh b/.github/workflows/scripts/qemu-start.sh
new file mode 100755
index 000000000000..76b76c50119d
--- /dev/null
+++ b/.github/workflows/scripts/qemu-start.sh
@@ -0,0 +1,222 @@
+#!/usr/bin/env bash
+
+#################################################################
+# 2) start qemu with some operating system, init via cloud-init #
+#################################################################
+
+OS="$1"
+ID="$2"
+GH="$3"
+REPO="$4"
+
+# valid ostypes: virt-install --os-variant list
+OSv=$OS
+
+case "$OS" in
+ almalinux8)
+ OSNAME="AlmaLinux 8"
+ URL="https://repo.almalinux.org/almalinux/8/cloud/x86_64/images/AlmaLinux-8-GenericCloud-latest.x86_64.qcow2"
+ ;;
+ almalinux9)
+ OSNAME="AlmaLinux 9"
+ URL="https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2"
+ ;;
+ archlinux)
+ OSNAME="Archlinux"
+ URL="https://geo.mirror.pkgbuild.com/images/latest/Arch-Linux-x86_64-cloudimg.qcow2"
+ ;;
+ centos-stream8)
+ OSNAME="CentOS Stream 8"
+ URL="https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-latest.x86_64.qcow2"
+ ;;
+ centos-stream9)
+ OSNAME="CentOS Stream 9"
+ URL="https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2"
+ ;;
+ debian11)
+ OSNAME="Debian 11"
+ URL="https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-generic-amd64.qcow2"
+ ;;
+ debian12)
+ OSNAME="Debian 12"
+ URL="https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2"
+ ;;
+ fedora38)
+ OSNAME="Fedora 38"
+ URL="https://download.fedoraproject.org/pub/fedora/linux/releases/38/Cloud/x86_64/images/Fedora-Cloud-Base-38-1.6.x86_64.qcow2"
+ ;;
+ fedora39)
+ OSNAME="Fedora 39"
+ OSv="fedora38"
+ URL="https://download.fedoraproject.org/pub/fedora/linux/releases/39/Cloud/x86_64/images/Fedora-Cloud-Base-39-1.5.x86_64.qcow2"
+ ;;
+ freebsd13)
+ OSNAME="FreeBSD 13"
+ OSv="freebsd13.0"
+ # freebsd images don't have clout-init within it! :(
+ # -> workaround: provide own images base on this url:
+ URL="https://download.freebsd.org/ftp/snapshots/amd64"
+ URL="https://openzfs.de/freebsd/amd64-freebsd-13.2.qcow2"
+ BASH="/usr/local/bin/bash"
+ ;;
+ freebsd14)
+ OSNAME="FreeBSD 14"
+ OSv="freebsd13.0"
+ URL="https://openzfs.de/freebsd/amd64-freebsd-14.0.qcow2"
+ BASH="/usr/local/bin/bash"
+ ;;
+ freebsd15)
+ OSNAME="FreeBSD 15"
+ OSv="freebsd13.0"
+ URL="https://openzfs.de/freebsd/amd64-freebsd-15.0.qcow2"
+ BASH="/usr/local/bin/bash"
+ ;;
+ ubuntu22)
+ OSNAME="Ubuntu 22.04"
+ OSv="ubuntu22.04"
+ URL="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
+ ;;
+ ubuntu24)
+ OSNAME="Ubuntu 24.04"
+ OSv="ubuntu24.04"
+ URL="https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img"
+ ;;
+ *)
+ echo "Wrong value for variable OS!"
+ exit 111
+ ;;
+esac
+
+IMG="/mnt/original.qcow2"
+DISK="/mnt/openzfs.qcow2"
+
+echo "Loading image $URL ..."
+sudo axel -q "$URL" -o "$IMG" || exit 111
+
+# we use zstd for faster IO on the testing runner
+echo "Converting image ..."
+sudo qemu-img convert -f qcow2 -O qcow2 -c -o compression_type=zstd,preallocation=off $IMG $DISK || exit 111
+sudo rm -f /mnt/original.qcow2 || exit 111
+
+echo "Resizing image to 60GiB ..."
+sudo qemu-img resize $DISK 60G || exit 111
+
+PUBKEY=`sudo cat /root/.ssh/id_ed25519.pub`
+cat < /tmp/user-data
+#cloud-config
+
+fqdn: $OS
+
+users:
+- name: root
+ shell: $BASH
+- name: zfs
+ sudo: ALL=(ALL) NOPASSWD:ALL
+ shell: $BASH
+ ssh_authorized_keys:
+ - $PUBKEY
+
+growpart:
+ mode: auto
+ devices: ['/']
+ ignore_growroot_disabled: false
+
+write_files:
+ - content: |
+ #!/usr/bin/env bash
+
+ cd \$HOME
+ exec 2>stderr-init.log
+ echo "$OSNAME" > /var/tmp/osname.txt
+
+ # download github action runner package
+ function download_action_runner() {
+ REL="2.312.0"
+ URL="https://github.com/actions/runner/releases"
+ while :; do
+ # https://github.com/actions/runner/releases/download/v2.305.0/actions-runner-linux-arm64-2.305.0.tar.gz
+ curl -s -o ghar.tgz -L "\$URL/download/v\$REL/actions-runner-linux-\$1-\$REL.tar.gz"
+ [[ \$? == 0 ]] && break
+ sleep 5
+ done
+ tar xzf ./ghar.tgz
+
+ # in case sth. is missing /TR
+ sudo ./bin/installdependencies.sh
+ }
+
+ # download github-act-runner package
+ function download_act_runner() {
+ REL="v0.6.7"
+ URL="https://github.com/ChristopherHX/github-act-runner/releases"
+ TGZ="download/\$REL/binary-\$1.tar.gz"
+ while :; do
+ curl -s -o gar.tgz -L "\$URL/\$TGZ"
+ [[ \$? == 0 ]] && break
+ sleep 5
+ done
+ tar xzf ./gar.tgz
+ }
+
+ case $OS in
+ debian*|ubuntu*)
+ export DEBIAN_FRONTEND="noninteractive"
+ sudo systemctl stop unattended-upgrades
+ sudo systemctl disable unattended-upgrades
+ download_action_runner "x64"
+ ;;
+ freebsd*)
+ export ASSUME_ALWAYS_YES="YES"
+ yes | sudo pkg update
+ download_act_runner "freebsd-amd64"
+ ;;
+ *)
+ download_action_runner "x64"
+ ;;
+ esac
+
+ # start action runner
+ ./config.sh \
+ --name "$ID" \
+ --labels "$ID" \
+ --replace \
+ --ephemeral \
+ --unattended \
+ --pat "$GH" \
+ --url "$REPO"
+ exec /tmp/runner-start.sh
+ path: /tmp/runner-init.sh
+ permissions: '0755'
+ - content: |
+ #!/usr/bin/env bash
+
+ exec 2>\$HOME/stderr-start.log
+ cd \$HOME
+
+ sudo rm -f /tmp/runner-init.sh
+ sudo rm -rf /var/lib/cloud/instance/*
+ # start tests
+ ./run.sh
+ sudo poweroff
+ path: /tmp/runner-start.sh
+ permissions: '0755'
+
+runcmd:
+ - sudo -u zfs /tmp/runner-init.sh
+EOF
+
+# we could extend this with more virtual disks for example /TR
+echo "Starting machine for runner $ID ..."
+sudo virt-install \
+ --os-variant $OSv \
+ --name "openzfs" \
+ --cpu host-passthrough \
+ --vcpus=4,sockets=1 \
+ --memory 10240 \
+ --graphics none \
+ --network bridge=virbr0,model=virtio \
+ --cloud-init user-data=/tmp/user-data \
+ --disk $DISK,format=qcow2,bus=virtio \
+ --import --noautoconsole
+sudo rm -f /tmp/user-data
+echo "Starting $ID -> result=$?"
diff --git a/.github/workflows/scripts/qemu-tests.sh b/.github/workflows/scripts/qemu-tests.sh
new file mode 100755
index 000000000000..12b0f2e6c814
--- /dev/null
+++ b/.github/workflows/scripts/qemu-tests.sh
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+
+#####################################################
+# 4) configure and build openzfs modules #
+#####################################################
+
+set -eu
+set -o pipefail
+
+#OPTS="-T casenorm"
+OPTS=""
+
+case "$1" in
+ freebsd*)
+ /usr/local/share/zfs/zfs-tests.sh -vKR -s 3G $OPTS \
+ | scripts/zfs-tests-color.sh
+ ;;
+ *)
+ /usr/share/zfs/zfs-tests.sh -vKR -s 3G $OPTS \
+ | scripts/zfs-tests-color.sh
+ ;;
+esac
diff --git a/.github/workflows/scripts/setup-dependencies.sh b/.github/workflows/scripts/setup-dependencies.sh
index b40f9290f914..57e51dcaed70 100755
--- a/.github/workflows/scripts/setup-dependencies.sh
+++ b/.github/workflows/scripts/setup-dependencies.sh
@@ -13,7 +13,7 @@ function prerun() {
sudo apt upgrade
sudo xargs --arg-file=.github/workflows/build-dependencies.txt apt-get install -qq
sudo apt-get clean
- sudo dmesg -c > /var/tmp/dmesg-prerun
+ sudo dmesg -c > /var/tmp/dmesg-prerun.txt
echo "::endgroup::"
}
@@ -47,7 +47,7 @@ function mod_install() {
sudo depmod -a
sudo modprobe zfs
sudo dmesg
- sudo dmesg -c > /var/tmp/dmesg-module-load
+ sudo dmesg -c > /var/tmp/dmesg-module-load.txt
echo "::endgroup::"
echo "::group::Report CPU information"
diff --git a/.github/workflows/zfs-linux.yml b/.github/workflows/zfs-linux.yml
index e6b705c86055..121457453f12 100644
--- a/.github/workflows/zfs-linux.yml
+++ b/.github/workflows/zfs-linux.yml
@@ -27,8 +27,30 @@ jobs:
path: modules-${{ matrix.os }}.tgz
retention-days: 14
- testings:
- name: Testing
+ setup-vm:
+ name: Setup
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [almalinux8, almalinux9, centos-stream8, centos-stream9, fedora38, fedora39, debian11, debian12, freebsd13, freebsd14, freebsd15, ubuntu22, ubuntu24]
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ - name: Setup QEMU
+ run: .github/workflows/scripts/qemu-setup.sh
+ - name: Start runner VM
+ run: .github/workflows/scripts/qemu-start.sh ${{ matrix.os }} ${{ matrix.os }}-${{ github.ref_name }}-${{ github.run_id }} ${{ secrets.GHO }} https://github.com/mcmilk/zfs
+ - name: Wait for runner VM
+ run: |
+ echo Waiting for eol of runner ${{ matrix.os }} ...
+ while pidof /usr/bin/qemu-system-x86_64 >/dev/null; do
+ sleep 5
+ done
+
+ tests:
+ name: Tests
strategy:
fail-fast: false
matrix:
@@ -38,26 +60,115 @@ jobs:
with:
os: ${{ matrix.os }}
+ tests-vm:
+ name: Tests
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [almalinux8, almalinux9, centos-stream8, centos-stream9, fedora38, fedora39, debian11, debian12, freebsd13, freebsd14, freebsd15, ubuntu22, ubuntu24]
+ runs-on: ${{ matrix.os }}-${{ github.ref_name }}-${{ github.run_id }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ - name: System Information
+ run: |
+ echo Running on ${{ matrix.os }}:
+ uname -a
+ echo Disk usage:
+ df -h
+ - name: Install dependencies
+ run: .github/workflows/scripts/qemu-deps.sh ${{ matrix.os }}
+ - name: Build and install modules
+ run: .github/workflows/scripts/qemu-build.sh ${{ matrix.os }}
+ - name: Run tests
+ run: .github/workflows/scripts/qemu-tests.sh ${{ matrix.os }}
+ timeout-minutes: 330
+ - name: Prepare artifacts
+ if: success() || failure()
+ run: |
+ RESPATH="/var/tmp/test_results"
+ uname -a > /var/tmp/uname.txt
+ cp -f /var/tmp/*.txt $RESPATH
+ tar cf qemu-${{ matrix.os }}.tar -C $RESPATH -h current uname.txt \
+ osname.txt dmesg-prerun.txt dmesg-module-load.txt
+ - uses: actions/upload-artifact@v4
+ if: success() || failure()
+ with:
+ name: Logs-functional-${{ matrix.os }}
+ path: qemu-${{ matrix.os }}.tar
+ if-no-files-found: ignore
+
cleanup:
if: always()
name: Cleanup
runs-on: ubuntu-22.04
- needs: testings
+ needs: [tests, tests-vm]
steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
- uses: actions/download-artifact@v4
- name: Generating summary
- run: |
- tar xzf modules-22.04/modules-22.04.tgz .github tests
- .github/workflows/scripts/generate-summary.sh
- # up to 4 steps, each can have 1 MiB output (for debugging log files)
- - name: Summary for errors #1
+ run: .github/workflows/scripts/generate-summary.sh
+ - name: Generating summary...
run: .github/workflows/scripts/generate-summary.sh 1
- - name: Summary for errors #2
+ - name: Generating summary...
run: .github/workflows/scripts/generate-summary.sh 2
- - name: Summary for errors #3
+ - name: Generating summary...
run: .github/workflows/scripts/generate-summary.sh 3
- - name: Summary for errors #4
+ - name: Generating summary...
run: .github/workflows/scripts/generate-summary.sh 4
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 5
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 6
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 7
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 8
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 9
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 10
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 11
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 12
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 13
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 14
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 15
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 16
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 17
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 18
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 19
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 20
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 21
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 22
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 23
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 24
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 25
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 26
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 27
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 28
+ - name: Generating summary...
+ run: .github/workflows/scripts/generate-summary.sh 29
- uses: actions/upload-artifact@v4
with:
name: Summary Files