Tests #4650
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# 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: | |
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_14_1 | |
- test_freebsd_13_4 | |
- test_freebsd_13_3 | |
- test_solaris_11_4 | |
default: "test_ubuntu_24_04_fast" | |
run_all_jobs: | |
description: Run all jobs | |
type: boolean | |
default: False | |
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 | |
jobs: | |
test_ubuntu_24_04_fast: # currently uses zfs-2.2.2 | |
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.name == 'test_ubuntu_24_04_fast' | |
runs-on: ubuntu-24.04 | |
strategy: | |
matrix: | |
python-version: ["3.13"] | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Run common preparation steps | |
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.0rc4 | |
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.name == 'test_ubuntu_24_04_zfs_latest' | |
runs-on: ubuntu-24.04 | |
strategy: | |
matrix: | |
python-version: ["3.14-dev", "3.11"] | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- 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 | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_ubuntu_24_04_zfs_2_2_latest: # currently uses zfs-2.2.7 | |
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.name == 'test_ubuntu_24_04_zfs_2_2_latest' | |
runs-on: ubuntu-24.04 | |
strategy: | |
matrix: | |
python-version: ["3.11"] | |
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 | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_ubuntu_24_04: # currently uses zfs-2.2.2 | |
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.name == 'test_ubuntu_24_04' | |
runs-on: ubuntu-24.04 | |
strategy: | |
matrix: | |
python-version: ["3.12"] | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Run common preparation steps | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_ubuntu_22_04: # currently uses zfs-2.1.5 | |
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.name == 'test_ubuntu_22_04' | |
runs-on: ubuntu-22.04 | |
strategy: | |
matrix: | |
python-version: ["3.10"] | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Run common preparation steps | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_ubuntu_20_04: # currently uses zfs-0.8.3 | |
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.name == 'test_ubuntu_20_04' | |
runs-on: ubuntu-20.04 | |
strategy: | |
matrix: | |
python-version: ["3.8", "3.7"] | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Run common preparation steps | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_freebsd_14_2: # currently uses zfs-2.2.6 | |
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.name == 'test_freebsd_14_2' | |
runs-on: ubuntu-24.04 | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test with unittest | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_freebsd_14_1: # currently uses zfs-2.2.4 | |
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.name == 'test_freebsd_14_1' | |
runs-on: ubuntu-24.04 | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test with unittest | |
id: test | |
uses: vmactions/freebsd-vm@v1 # see https://github.com/vmactions/freebsd-vm | |
with: | |
release: "14.1" | |
run: | | |
./.github-workflow-scripts/test_freebsd_14_1.sh | |
- name: Upload code coverage report to workflow run page | |
uses: ./.github/workflows/coverage-upload | |
test_freebsd_13_4: # currently uses zfs-2.1.15 | |
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.name == 'test_freebsd_13_4' | |
runs-on: ubuntu-24.04 | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test with unittest | |
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 | |
uses: ./.github/workflows/coverage-upload | |
test_freebsd_13_3: # currently uses zfs-2.1.14 | |
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.name == 'test_freebsd_13_3' | |
runs-on: ubuntu-24.04 | |
timeout-minutes: 100 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test with unittest | |
id: test | |
uses: vmactions/freebsd-vm@v1 # see https://github.com/vmactions/freebsd-vm | |
with: | |
release: "13.3" | |
run: | | |
./.github-workflow-scripts/test_freebsd_13_3.sh | |
- name: Upload code coverage report to workflow run page | |
uses: ./.github/workflows/coverage-upload | |
test_solaris_11_4: | |
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.name == 'test_solaris_11_4' | |
# if: false # job currently disabled | |
runs-on: ubuntu-24.04 | |
timeout-minutes: 140 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Test with unittest | |
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 | |
uses: ./.github/workflows/coverage-upload | |
combine_coverage_reports: | |
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_14_1 | |
- test_freebsd_13_4 | |
- test_freebsd_13_3 | |
- 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_14_1 | |
path: coverage-test_freebsd_14_1 | |
- 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_freebsd_13_3 | |
path: coverage-test_freebsd_13_3 | |
- 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] |