Skip to content

Commit

Permalink
Add initial GitHub Actions support for kyua
Browse files Browse the repository at this point in the history
This proposed GitHub Actions workflow file runs tests on MacOS and
Ubuntu Linux, similar to what is being proposed in
freebsd/atf#93 .

The delta between this change and the one being made in ATF mostly
relates to the additional package dependencies, e.g., with and without
ATF.

Kyua is built from scratch because of issues with dependent packages and
runtime linker collisions on both MacOS and Ubuntu. The binary package
versions are built against a different version of Lutok, ergo they can
have runtime linker collisions.

Signed-off-by: Enji Cooper <[email protected]>
  • Loading branch information
ngie-eign committed Dec 28, 2024
1 parent 60a90bb commit c7413a9
Showing 1 changed file with 211 additions and 0 deletions.
211 changes: 211 additions & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
---
# GitHub action to compile and test kyua on supported platforms.
#
# Steps executed:
# * Handle prerequisites
# * Install binary packages
# * Build packages from source (if needed).
# * Build
# * Install
# * Run tests
#
# On MacOS we build with:
# * latest clang from brew (system provided clang lacks sanitizers).
# * ld from system
#
env:
ATF_REPO: freebsd/atf
ATF_REF: atf-0.22
#LUTOK_REPO: freebsd/lutok
#LUTOK_REF: lutok-0.6
LUTOK_REPO: ngie-eign/lutok
LUTOK_REF: build-cleanup

name: build
on:
pull_request:
branches:
- master
push:
workflow_dispatch:

permissions:
contents: read

jobs:
build:
name: Build ${{ matrix.build-os }} ${{ matrix.compiler }} ${{ matrix.enable-atf }}
runs-on: "${{ matrix.build-os }}"
strategy:
fail-fast: false
matrix:
build-os:
- ubuntu-24.04
- macos-latest
#enable-atf: [--disable-atf, --enable-atf]
enable-atf: [--enable-atf]
include:
- build-os: macos-latest
compiler: clang-19
pkgs:
- llvm@19
- autoconf
- automake
- libtool
- pkgconf
- [email protected]
- sqlite
enable-atf-pkgs:
# gdb is not built for ARM64 yet :(.
# - gdb
llvm-bindir: /opt/homebrew/opt/llvm/bin
- build-os: ubuntu-24.04
compiler: clang-18
pkgs:
- clang-18
- autoconf
- automake
- libtool
- pkgconf
- liblua5.4-dev
- lua5.4
- libsqlite3-dev
enable-atf-pkgs:
- gdb
llvm-bindir: /usr/lib/llvm-18/bin
steps:
- name: Install base dependencies (macOS)
if: runner.os == 'macOS'
run: |
brew update -q || true
brew install -q \
${{ join(matrix.pkgs, ' ') }} \
${{ join(matrix.enable-atf-pkgs, ' ') }}
- name: Install base dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt -Uqy --no-install-suggests \
--no-install-recommends install \
${{ join(matrix.pkgs, ' ') }}
- name: Checking out source (ATF)
uses: actions/checkout@v4
with:
repository: "${{ env.ATF_REPO }}"
ref: "${{ env.ATF_REF }}"
# Same as `ATF_SRCDIR`.
path: "${{ github.workspace }}/atf-src"
- name: Checking out source (Lutok)
uses: actions/checkout@v4
with:
repository: "${{ env.LUTOK_REPO }}"
ref: "${{ env.LUTOK_REF }}"
# Same as `LUTOK_SRCDIR`.
path: "${{ github.workspace }}/lutok-src"
- name: Clone Kyua source
if: matrix.enable-atf == '--enable-atf'
uses: actions/checkout@v4
with:
# Same as `KYUA_SRCDIR`.
path: "${{ github.workspace }}/kyua-src"
- name: Setup Environment
run: |
echo "AR=${{ matrix.llvm-bindir }}/llvm-ar" >> "${GITHUB_ENV}"
echo "CC=${{ matrix.llvm-bindir }}/clang" >> "${GITHUB_ENV}"
echo "CPP=${{ matrix.llvm-bindir }}/clang-cpp" >> "${GITHUB_ENV}"
echo "CXX=${{ matrix.llvm-bindir }}/clang++" >> "${GITHUB_ENV}"
echo "NM=${{ matrix.llvm-bindir }}/llvm-nm" >> "${GITHUB_ENV}"
echo "PKG_CONFIG_PATH='$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig'" >> "${GITHUB_ENV}"
echo "RANLIB=${{ matrix.llvm-bindir }}/llvm-ranlib" >> "${GITHUB_ENV}"
echo "OBJDUMP=${{ matrix.llvm-bindir }}/llvm-objdump" >> "${GITHUB_ENV}"
echo "STRIP=${{ matrix.llvm-bindir }}/llvm-strip" >> "${GITHUB_ENV}"
echo "ATF_SRCDIR=${GITHUB_WORKSPACE}/atf-src" >> "${GITHUB_ENV}"
echo "ATF_OBJDIR=${GITHUB_WORKSPACE}/atf-obj" >> "${GITHUB_ENV}"
echo "KYUA_SRCDIR=${GITHUB_WORKSPACE}/kyua-src" >> "${GITHUB_ENV}"
echo "KYUA_OBJDIR=${GITHUB_WORKSPACE}/kyua-obj" >> "${GITHUB_ENV}"
echo "KYUA_PREFIX=/usr/local" >> "${GITHUB_ENV}"
echo "LUTOK_SRCDIR=${GITHUB_WORKSPACE}/lutok-src" >> "${GITHUB_ENV}"
echo "LUTOK_OBJDIR=${GITHUB_WORKSPACE}/lutok-obj" >> "${GITHUB_ENV}"
echo "NPROC=`getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1`" >> "${GITHUB_ENV}"
- name: Build Environment Dump
run: |
echo "ATF flag: ${{ matrix.enable-atf }}"
echo "uname -a: $(uname -a)"
echo "uname -m: $(uname -m)"
echo "uname -p: $(uname -p)"
echo "Build environment:"
cat "${GITHUB_ENV}"
- name: Build and install ATF
if: matrix.enable-atf == '--enable-atf'
run: |
CFG_OPTS="--disable-dependency-tracking"
CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}"
echo "Building lutok with ${CFG_OPTS}..."
cd "${ATF_SRCDIR}"
autoreconf -isv
mkdir -p "${ATF_OBJDIR}"
cd "${ATF_OBJDIR}"
"${ATF_SRCDIR}/configure" ${CFG_OPTS}
make -j${NPROC} all | tee atf-make-all.log
sudo make install
- name: Build Lutok
run: |
CFG_OPTS="--disable-dependency-tracking"
CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}"
echo "Building lutok with ${CFG_OPTS}..."
cd "${LUTOK_SRCDIR}"
autoreconf -isv -I/usr/local/share/aclocal
mkdir -p "${LUTOK_OBJDIR}"
cd "${LUTOK_OBJDIR}"
"${LUTOK_SRCDIR}/configure" ${CFG_OPTS}
make -j${NPROC} all | tee lutok-make-all.log
- name: Install Lutok
run: |
cd "${LUTOK_OBJDIR}"
sudo make install
- name: Build and Install Kyua
run: |
CFG_OPTS="--disable-dependency-tracking ${{ matrix.enable-atf }}"
CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}"
if [ "x${{ matrix.enable-atf }}" = "x--enable-atf" ]; then
CXXFLAGS="$CXXFLAGS $(pkgconf --cflags atf-c++)"
LDFLAGS="$LDFLAGS $(pkgconf --libs-only-L atf-c++)"
fi
CXXFLAGS="$CXXFLAGS $(pkgconf --cflags lutok)";
LDFLAGS="$LDFLAGS $(pkgconf --libs-only-L lutok)";
cd "${KYUA_SRCDIR}"
autoreconf -isv -I/usr/local/share/aclocal
mkdir -p "${KYUA_OBJDIR}"
echo "syntax(2)" > "${KYUA_OBJDIR}/kyua.conf"
echo "unprivileged_user = 'nobody'" >> "${KYUA_OBJDIR}/kyua.conf"
cd "${KYUA_OBJDIR}"
env CXXFLAGS="${CXXFLAGS}" \
KYUA_CONFIG_FILE_FOR_CHECK="${KYUA_OBJDIR}/kyua.conf" \
LDFLAGS="${LDFLAGS}" \
"${KYUA_SRCDIR}/configure" ${CFG_OPTS}
make -j${NPROC} all | tee kyua-make-all.log
sudo make install
- name: Test Kyua Setup (Ubuntu)
if: runner.os == 'Linux' && matrix.enable-atf == '--enable-atf'
run: |
sudo sysctl kernel.core_pattern="/cores/core.%p.%e"
sudo ldconfig
- name: Test Kyua
if: matrix.enable-atf == '--enable-atf'
run: |
cd "${KYUA_OBJDIR}"
sudo sh -c 'ulimit -c unlimited; make installcheck'
check_exit=$?
if [ $check_exit -eq 0 ]; then
echo "# ✅ All mandatory checks passed" >> $GITHUB_STEP_SUMMARY
else
echo "# ❌ Some checks failed" >> $GITHUB_STEP_SUMMARY
echo "::error file=.github/workflows/build.yaml,line=173,endLine=173,title=Checks failed!::checks failed"
fi
cd "${KYUA_PREFIX}/tests/kyua"
sudo kyua report-html --output ${LUTOK_OBJDIR}/html # produces html subdirectory
# Include the plaintext and JUnit reports.
sudo kyua report --verbose --results-filter=xfail,broken,failed > ${LUTOK_OBJDIR}/html/test-reportfailed.txt
sudo kyua report-junit --output ${LUTOK_OBJDIR}/html/test-reportfailed.xml
# Include the kyua log.
sudo cp -a ~/.kyua/logs ${LUTOK_OBJDIR}/html/
exit $check_exit

0 comments on commit c7413a9

Please sign in to comment.