Skip to content

Build and test

Build and test #75

Workflow file for this run

# Copyright (c) 2023 Sebastian Pipping <sebastian@pipping.org>
# Licensed under GPL v2 or later
name: Build and test
on:
pull_request:
push:
schedule:
- cron: '0 3 * * 5' # Every Friday at 3am
workflow_dispatch:
# Minimum permissions for security
permissions:
contents: read
jobs:
linux:
name: Build (${{ matrix.cc }} and ${{ matrix.fuse_package }} on ${{ matrix.runs-on }})
runs-on: ${{ matrix.runs-on }}
strategy:
fail-fast: false
matrix:
include:
# FUSE 2
- cc: gcc
cxx: g++
clang_major_version: null
clang_repo_suffix: null
runs-on: ubuntu-22.04
fuse_package: libfuse-dev
# FUSE 3
- cc: gcc
cxx: g++
clang_major_version: null
clang_repo_suffix: null
runs-on: ubuntu-22.04
fuse_package: libfuse3-dev
- cc: clang-17
cxx: clang++-17
clang_major_version: 17
clang_repo_suffix: -17
runs-on: ubuntu-22.04
fuse_package: libfuse3-dev
- cc: clang-18
cxx: clang++-18
clang_major_version: 18
clang_repo_suffix: -18
runs-on: ubuntu-22.04
fuse_package: libfuse3-dev
# fuse-t
- cc: gcc-13
cxx: g++-13
clang_major_version: null
clang_repo_suffix: null
runs-on: macos-13
fuse_package: fuse-t
# macFUSE
- cc: clang-15
cxx: clang++-15
clang_major_version: 15
clang_repo_suffix: null
runs-on: macos-13
fuse_package: macfuse
steps:
- name: Add Clang/LLVM repositories
if: "${{ runner.os == 'Linux' && contains(matrix.cxx, 'clang') }}"
run: |-
set -x
source /etc/os-release
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo add-apt-repository "deb http://apt.llvm.org/${UBUNTU_CODENAME}/ llvm-toolchain-${UBUNTU_CODENAME}${{ matrix.clang_repo_suffix }} main"
- name: Install build dependencies
if: "${{ runner.os == 'Linux' }}"
run: |-
sudo apt-get update
sudo apt-get install --yes --no-install-recommends \
autoconf \
automake \
${{ matrix.fuse_package }} \
libtool \
pkg-config \
valgrind
- name: Install build dependencies
if: "${{ runner.os == 'macOS' }}"
run: |-
set -x
if [[ ${{ matrix.fuse_package }} = macfuse ]]; then
brew install --cask macfuse
elif [[ ${{ matrix.fuse_package }} = fuse-t ]]; then
brew tap macos-fuse-t/homebrew-cask
brew install fuse-t
else
false # should never get here
fi
brew install \
autoconf \
automake \
libtool \
pkg-config
- name: Install build dependency Clang ${{ matrix.clang_major_version }}
if: "${{ runner.os == 'Linux' && contains(matrix.cxx, 'clang') }}"
run: |-
sudo apt-get install --yes --no-install-recommends -V \
clang-${{ matrix.clang_major_version }}
- name: Add versioned aliases for Clang ${{ matrix.clang_major_version }}
if: "${{ runner.os == 'macOS' && contains(matrix.cxx, 'clang') }}"
run: |-
set -x
sudo ln -s "$(brew --prefix llvm@${{ matrix.clang_major_version }})"/bin/clang /usr/local/bin/clang-${{ matrix.clang_major_version }}
sudo ln -s "$(brew --prefix llvm@${{ matrix.clang_major_version }})"/bin/clang++ /usr/local/bin/clang++-${{ matrix.clang_major_version }}
- name: Checkout Git branch
uses: actions/checkout@v4
- name: 'Bootstrap with ./autogen.sh'
run: |-
./autogen.sh
- name: 'Configure'
env:
CC: ${{ matrix.cc }}
CXX: ${{ matrix.cxx }}
CFLAGS: -Werror
run: |-
set -x
./configure
- name: 'Build'
run: |-
set -x
make -j$(nproc || sysctl -n hw.logicalcpu) VERBOSE=1
- name: 'Test as non-root'
run: |-
if [[ ${{ runner.os }} = macOS ]]; then
ignore_errors=true # while unfixed
else
ignore_errors=false
fi
set -x
whoami
make check || ${ignore_errors}
- name: 'Test as root'
run: |-
if [[ ${{ runner.os }} = macOS ]]; then
ignore_errors=true # while unfixed
else
ignore_errors=false
fi
set -x
sudo make check || ${ignore_errors}
- name: 'Install'
run: |-
set -x -o pipefail
make install DESTDIR="${PWD}"/ROOT/
find ROOT/ | sort | xargs ls -ld
vagrant:
name: Run Vagrant tests
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
# TODO: automatically check that this list is up-to-date
box:
- centos8
- debian10
- debian11
- freebsd14
- ubuntu1804
- ubuntu2004
- ubuntu2204
steps:
- name: Install dependencies
run: |-
set -x
for FILE in /etc/apt/sources.list /etc/apt/sources.list.d/*; do
if [[ -e "${FILE}" ]]; then
sudo sed -i 's/# deb-src /deb-src /' "${FILE}"
fi
done
# The following is based on these instructions:
# https://developer.hashicorp.com/vagrant/install?product_intent=vagrant
# https://vagrant-libvirt.github.io/vagrant-libvirt/installation.html
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update
sudo apt-get build-dep vagrant ruby-libvirt
sudo apt-get install -y vagrant \
qemu-system-x86 \
autoconf automake libtool pkg-config \
qemu libvirt-daemon-system ebtables libguestfs-tools \
libxslt-dev libxml2-dev zlib1g-dev ruby-dev
vagrant plugin install vagrant-libvirt
sudo adduser "${USER}" libvirt
- name: Checkout Git branch
uses: actions/checkout@v4
- name: 'Generate build files with ./autogen.sh'
run: |-
./autogen.sh
- name: Check for KVM
run: |-
# This check is probably obsolete now: https://github.com/actions/runner-images/discussions/7191
if [[ -e /dev/kvm ]]; then
echo "This GitHub Action runner has KVM. This run will be fast."
else
echo "This GitHub Action runner does NOT have KVM. This run will be slow."
fi
- name: Test with Vagrant box ${{ matrix.box }}
env:
VAGRANT_DEFAULT_PROVIDER: libvirt
run: |-
# sudo needed because the current shell is not yet in group "libvirt"
# https://github.com/actions/runner-images/discussions/5981
sudo -E -s -u "${USER}" vagrant/test.rb --print-logs ${{ matrix.box }}