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