Skip to content

Tests

Tests #4848

Workflow file for this run

#
# Copyright 2024 Wolfgang Hoschek AT mac DOT com
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This workflow will run automated unit tests and integration tests on a matrix
# of various old and new versions of ZFS/Python/Linux/FreeBSD/Solaris.
# It will also generate code coverage reports.
name: Tests
on:
push:
branches: [ "main", "branch-1.10.x", "branch-1.9.x", "branch-1.8.x", "branch-1.7.x", "branch-1.6.x" ]
pull_request:
branches: [ "main", "branch-1.10.x", "branch-1.9.x", "branch-1.8.x", "branch-1.7.x", "branch-1.6.x" ]
workflow_dispatch:
inputs:
run_all_jobs:
description: Run all jobs
type: boolean
default: False
job_name:
description: "Name of job to run"
type: choice
options:
- test_ubuntu_24_04_fast
- test_ubuntu_24_04_zfs_latest
- test_ubuntu_24_04_zfs_2_2_latest
- test_ubuntu_24_04
- test_ubuntu_22_04
- test_ubuntu_20_04
- test_freebsd_14_2
- test_freebsd_13_4
- test_solaris_11_4
- none
default: "test_ubuntu_24_04_fast"
job_names:
description: "Names of jobs to run, e.g. 'test_ubuntu_24_04,test_ubuntu_22_04'"
type: string
default: ""
num_runs:
description: "Number of times to run the jobs"
type: string
default: "1"
schedule:
- cron: '5 3 * * *' # Run nightly for main at 3:05am UTC,
# - cron: '0 3 * * *' # Run nightly for branch-1.1.x at 3am UTC
workflow_call: # Enables this workflow to be called by other workflows (incl. the same workflow from another branch)
inputs:
is_external_call:
description: 'true if we are called from another workflow, false otherwise'
type: boolean
required: false
default: true
permissions:
contents: read
env:
NUM_RUNS: ${{ github.event.inputs.num_runs != '' && github.event.inputs.num_runs || '1' }}
jobs:
create_iteration_test_matrix:
runs-on: ubuntu-24.04
outputs:
iteration_test_matrix_output: ${{ steps.set_test_matrix.outputs.iteration_test_matrix_output }}
steps:
- id: set_test_matrix
shell: bash
run: |
echo "iteration_test_matrix_output=[$(seq -s ',' 1 "$NUM_RUNS")]" >> $GITHUB_OUTPUT
test_ubuntu_24_04_fast: # currently uses zfs-2.2.2
needs: create_iteration_test_matrix
if: (!contains(github.event.head_commit.message, 'ci skip') && github.event_name != 'workflow_dispatch' && github.event.schedule != '0 3 * * *') || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_24_04_fast' || contains(github.event.inputs.job_names, 'test_ubuntu_24_04_fast')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.13"]
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
./test.sh
echo "bzfs-testrun-success"
- name: Run mypy static type checker
shell: bash
run: |
pip install --upgrade "mypy==1.*"
mypy --check-untyped-defs bzfs/bzfs.py || true # see https://mypy.readthedocs.io
- name: Lint with flake8
shell: bash
run: |
pip install --upgrade "flake8==7.*"
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide. https://www.flake8rules.com
flake8 . --count --ignore=E203,W503 --exit-zero --max-complexity=10 --max-line-length=127 --statistics
test_ubuntu_24_04_zfs_latest: # currently uses >= zfs-2.3.0
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_24_04_zfs_latest' || contains(github.event.inputs.job_names, 'test_ubuntu_24_04_zfs_latest')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.14-dev", "3.11"]
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Show iteration info ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
run: echo "Now running iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}"
- name: Upgrade zfs kernel + userland to specific upstream zfs version
run: |
# see https://launchpad.net/~satadru-umich/+archive/ubuntu/zfs-experimental/+packages
sudo add-apt-repository ppa:satadru-umich/zfs-experimental; sudo apt update
### sudo apt-get -y install zfs-dkms=2.2.5~rc7-noble1 zfsutils-linux
sudo apt-get -y install zfs-dkms zfsutils-linux
zfs --version
# see https://launchpad.net/~rapier1/+archive/ubuntu/hpnssh and https://www.psc.edu/hpn-ssh-home/hpn-ssh-faq
sudo add-apt-repository ppa:rapier1/hpnssh; sudo apt update
sudo apt-get -y install hpnssh
hpnssh -V
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
if [ "${{ matrix.python-version }}" == "3.11" ]; then export bzfs_test_ssh_program=hpnssh; fi
echo "bzfs_test_ssh_program: $bzfs_test_ssh_program"
./test.sh
- name: Run tests and generate code coverage
run: |
./coverage.sh
echo "bzfs-testrun-success"
- name: Upload code coverage report to workflow run page
if: ${{ matrix.python-version == '3.11' && (github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '') }}
uses: ./.github/workflows/coverage-upload
test_ubuntu_24_04_zfs_2_2_latest: # currently uses zfs-2.2.7
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_24_04_zfs_2_2_latest' || contains(github.event.inputs.job_names, 'test_ubuntu_24_04_zfs_2_2_latest')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.11"]
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Upgrade zfs kernel + userland to specific upstream zfs version
run: |
# see https://launchpad.net/~patrickdk/+archive/ubuntu/zfs/+packages
sudo add-apt-repository ppa:patrickdk/zfs; sudo apt update
### sudo apt-get -y install zfs-dkms=2.2.5~rc7-noble1 zfsutils-linux
sudo apt-get -y install zfs-dkms zfsutils-linux
zfs --version
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
./test.sh
- name: Run tests and generate code coverage
run: |
./coverage.sh
echo "bzfs-testrun-success"
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
test_ubuntu_24_04: # currently uses zfs-2.2.2
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_24_04' || contains(github.event.inputs.job_names, 'test_ubuntu_24_04')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.12"]
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
./test.sh
- name: Run tests and generate code coverage
run: |
./coverage.sh
echo "bzfs-testrun-success"
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
test_ubuntu_22_04: # currently uses zfs-2.1.5
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_22_04' || contains(github.event.inputs.job_names, 'test_ubuntu_22_04')
runs-on: ubuntu-22.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.10"]
fail-fast: false
timeout-minutes: 120
steps:
- uses: actions/checkout@v4
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
./test.sh
echo "Now running tests as root user"
sudo mkdir -p /root/.ssh
sudo cp -a $HOME/.ssh/id_rsa $HOME/.ssh/id_rsa.pub /root/.ssh/
cat $HOME/.ssh/id_rsa.pub | sudo tee -a /root/.ssh/authorized_keys > /dev/null
sudo ./test.sh
- name: Run tests and generate code coverage
run: |
./coverage.sh
echo "bzfs-testrun-success"
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
test_ubuntu_20_04: # currently uses zfs-0.8.3
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_ubuntu_20_04' || contains(github.event.inputs.job_names, 'test_ubuntu_20_04')
runs-on: ubuntu-20.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
python-version: ["3.8", "3.7"]
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Run common preparation steps for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
uses: ./.github/workflows/common
with:
python-version: ${{ matrix.python-version }}
- name: Display ZFS version and Python version
run: |
id -u -n
uname -a
zfs --version
python3 --version
ssh -V
zstd --version
pv --version | head -n 1
mbuffer --version |& head -n 1
command -v sh | xargs ls -l
- name: Test with unittest
run: |
./test.sh
- name: Run tests and generate code coverage
run: |
./coverage.sh
echo "bzfs-testrun-success"
- name: Upload code coverage report to workflow run page
if: ${{ matrix.python-version == '3.8' && (github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '') }}
uses: ./.github/workflows/coverage-upload
test_freebsd_14_2: # currently uses zfs-2.2.6
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_freebsd_14_2' || contains(github.event.inputs.job_names, 'test_freebsd_14_2')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Test with unittest for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
id: test
uses: vmactions/freebsd-vm@v1 # see https://github.com/vmactions/freebsd-vm
with:
release: "14.2"
run: |
./.github-workflow-scripts/test_freebsd_14_1.sh
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
test_freebsd_13_4: # currently uses zfs-2.1.15
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_freebsd_13_4' || contains(github.event.inputs.job_names, 'test_freebsd_13_4')
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
fail-fast: false
timeout-minutes: 100
steps:
- uses: actions/checkout@v4
- name: Test with unittest for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
id: test
uses: vmactions/freebsd-vm@v1 # see https://github.com/vmactions/freebsd-vm
with:
release: "13.4"
run: |
./.github-workflow-scripts/test_freebsd_13_3.sh
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
test_solaris_11_4:
needs: create_iteration_test_matrix
if: github.event_name == 'pull_request' || github.event.schedule == '5 3 * * *' || inputs.is_external_call || github.event.inputs.run_all_jobs == 'true' || github.event.inputs.job_name == 'test_solaris_11_4' || contains(github.event.inputs.job_names, 'test_solaris_11_4')
# if: false # job currently disabled
runs-on: ubuntu-24.04
strategy:
matrix:
iteration: ${{ fromJSON(needs.create_iteration_test_matrix.outputs.iteration_test_matrix_output) }}
fail-fast: false
timeout-minutes: 140
steps:
- uses: actions/checkout@v4
- name: Test with unittest for iteration ${{ matrix.iteration }} of ${{ env.NUM_RUNS }}
id: test
uses: vmactions/solaris-vm@v1 # see https://github.com/vmactions/solaris-vm
with:
release: "11.4"
mem: 8192
cpu: 4
run: |
./.github-workflow-scripts/test_solaris_11_4.sh
- name: Upload code coverage report to workflow run page
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
uses: ./.github/workflows/coverage-upload
combine_coverage_reports:
if: ${{ github.event.inputs.num_runs == '1' || github.event.inputs.num_runs == '' }}
runs-on: ubuntu-24.04
needs:
- test_ubuntu_24_04_zfs_latest
- test_ubuntu_24_04_zfs_2_2_latest
- test_ubuntu_24_04
- test_ubuntu_22_04
- test_ubuntu_20_04
- test_freebsd_14_2
- test_freebsd_13_4
- test_solaris_11_4
steps:
- uses: actions/checkout@v4
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_ubuntu_24_04_zfs_latest
path: coverage-test_ubuntu_24_04_zfs_latest
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_ubuntu_24_04_zfs_2_2_latest
path: coverage-test_ubuntu_24_04_zfs_2_2_latest
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_ubuntu_24_04
path: coverage-test_ubuntu_24_04
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_ubuntu_22_04
path: coverage-test_ubuntu_22_04
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_ubuntu_20_04
path: coverage-test_ubuntu_20_04
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_freebsd_14_2
path: coverage-test_freebsd_14_2
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_freebsd_13_4
path: coverage-test_freebsd_13_4
- name: Download coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-test_solaris_11_4
path: coverage-test_solaris_11_4
- name: Run common preparation steps
uses: ./.github/workflows/common
with:
python-version: "3.12"
- name: Merge coverage reports
run: |
coverage combine $(find . -name '.coverage*')
coverage report | tee coverage_report.txt
coverage html
coverage xml
- name: Generate coverage badge
run: |
pip install --upgrade "genbadge[coverage]==1.1.1" # see https://smarie.github.io/python-genbadge/
mkdir -p badges
genbadge coverage -v -i coverage.xml -o badges/coverage-badge.svg
- name: Merge badges
run: |
cp -r */badges ./
PYTHONPATH=. .github-workflow-scripts/generate_badges.py merge
- name: Upload combined coverage report to workflow run page
uses: ./.github/workflows/coverage-upload
generate_website:
runs-on: ubuntu-24.04
needs:
- combine_coverage_reports
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
steps:
- name: Download combined coverage artifact
uses: actions/download-artifact@v4
with:
name: coverage-combine_coverage_reports
path: site/branch
- name: Prepare
run: |
branchname=$(echo "$BRANCH_NAME" | tr '/' '_')
mv site/branch "site/$branchname"
mv "site/$branchname/htmlcov" "site/$branchname/coverage"
mkdir -p "site/$branchname/docs"
echo "<!DOCTYPE HTML><meta charset='UTF-8'><meta http-equiv='refresh' content='0; url=./coverage/index.html'>" > "site/$branchname/index.html"
echo "<!DOCTYPE HTML><meta charset='UTF-8'><meta http-equiv='refresh' content='0; url=./$BRANCH_NAME/coverage/index.html'>" > site/index.html
if [ "$branchname" != "$BRANCH_NAME" ]; then
mkdir -p "site/$BRANCH_NAME"
mv "site/$branchname"/* "site/$BRANCH_NAME/"
rm -fr "site/$branchname"
fi
- name: Upload site to workflow run page
uses: actions/upload-artifact@v4 # see https://github.com/actions/upload-artifact
with:
name: ${{ github.job }}
include-hidden-files: true
path: |
#site
site/${{ github.head_ref || github.ref_name }}
upload_website_to_github_pages:
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
runs-on: ubuntu-24.04
needs:
- generate_website
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Download website artifact
uses: actions/download-artifact@v4
with:
name: generate_website
path: generate_website
- name: Setup Pages
uses: actions/configure-pages@v5 # https://github.com/actions/configure-pages
- name: Upload website to GitHub Pages
uses: actions/upload-pages-artifact@v3 # see https://github.com/actions/upload-pages-artifact
with:
path: generate_website
- name: Deploy website to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4 # see https://github.com/actions/deploy-pages
- name: "Display URL of GitHub Pages"
run: |
echo "Uploaded website to GitHub Pages at ${{ steps.deployment.outputs.page_url }}"
# # GitHub honours the "on: schedule:" directive only on main branch. Use hack to run nightlies also on other branches:
# test_branch_1_1_x:
# if: github.event.schedule == '0 3 * * *'
# uses: whoschek/bzfs/.github/workflows/[email protected]
# # uses: ./.github/workflows/[email protected] # GitHub does not support this syntax
# # See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_iduses
# # and https://github.com/orgs/community/discussions/16107
# # and https://github.com/orgs/community/discussions/25246
# # and https://github.com/actions/runner/issues/1483
#
# test_branch_1_0_x:
# if: false # job currently disabled
# #if: github.event.schedule == '0 3 * * *'
# uses: whoschek/bzfs/.github/workflows/[email protected]