Skip to content

Commit

Permalink
Add initial GitHub Actions support for lutok
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., Lua, and
build permutations, 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 <ngie@FreeBSD.org>
  • Loading branch information
ngie-eign committed Dec 27, 2024
1 parent 2de2e52 commit e037e60
Showing 1 changed file with 200 additions and 0 deletions.
200 changes: 200 additions & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
---
# GitHub action to compile and test lutok 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
#
# Notes re: building with Lua 5.3...
# * In order to build/test with 5.3 on MacOS, we would need to build lutok
# and kyua from scratch. Installing via the formula picks up the binary
# package, which is built against the default version of Lua (5.4).
# * I'm not sure why Ubuntu doesn't distribute the liblua5.3-dev package on
# 24.04.
env:
KYUA_REPO: freebsd/kyua
# XXX: kyua-0.13 doesn't build because of std::auto_array no longer being a thing..
# KYUA_REF: kyua-0.13
KYUA_REF: master

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]
include:
- build-os: macos-latest
compiler: clang-19
pkgs:
- llvm@19
- autoconf
- automake
- libtool
- pkgconf
- lua@5.4
enable-atf-dep-pkgs:
- atf
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
enable-atf-dep-pkgs:
- atf-sh
- libatf-c++-2
- libatf-c-1
- libatf-dev
kyua-dep-pkgs:
- libsqlite3-dev
llvm-bindir: /usr/lib/llvm-18/bin
steps:
- name: Install Lutok base dependencies (macOS)
if: runner.os == 'macOS'
run: |
brew update --quiet || true
brew install ${{ join(matrix.pkgs, ' ') }}
- name: Install Lutok base dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt -Uqy --no-install-suggests \
--no-install-recommends install \
${{ join(matrix.pkgs, ' ') }}
- name: Install ATF/Kyua dependencies (MacOS)
if: runner.os == 'macOS' && matrix.enable-atf == '--enable-atf'
run: |
brew install \
${{ join(matrix.enable-atf-dep-pkgs, ' ') }} \
${{ join(matrix.kyua-dep-pkgs, ' ') }}
- name: Install ATF/Kyua dependencies (Ubuntu)
if: runner.os == 'Linux' && matrix.enable-atf == '--enable-atf'
run: |
sudo apt -Uqy --no-install-suggests \
--no-install-recommends install \
${{ join(matrix.enable-atf-dep-pkgs, ' ') }} \
${{ join(matrix.kyua-dep-pkgs, ' ') }}
- name: Checking out source
uses: actions/checkout@v4
with:
# Same as `LUTOK_SRCDIR`.
path: ${{ github.workspace }}/lutok-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 "KYUA_SRCDIR=${GITHUB_WORKSPACE}/kyua-src" >> "${GITHUB_ENV}"
echo "KYUA_OBJDIR=${GITHUB_WORKSPACE}/kyua-obj" >> "${GITHUB_ENV}"
echo "LUTOK_SRCDIR=${GITHUB_WORKSPACE}/lutok-src" >> "${GITHUB_ENV}"
echo "LUTOK_OBJDIR=${GITHUB_WORKSPACE}/lutok-obj" >> "${GITHUB_ENV}"
echo "LUTOK_PREFIX=/usr/local" >> "${GITHUB_ENV}"
echo "NPROC=`getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1`" >> "${GITHUB_ENV}"
- name: Build Lutok
run: |
CFG_OPTS="--disable-dependency-tracking ${{ matrix.enable-atf }}"
CFG_OPTS="${CFG_OPTS} --prefix=${LUTOK_PREFIX}"
echo "Building lutok with ${CFG_OPTS}..."
echo "uname -a: $(uname -a)"
echo "uname -m: $(uname -m)"
echo "uname -p: $(uname -p)"
echo "Build environment:"
cat "${GITHUB_ENV}"
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: Regenerate linker config (Ubuntu)
if: runner.os == 'Linux' && matrix.enable-atf == '--enable-atf'
run: |
sudo ldconfig
# Everything from here on out is --enable-atf related.
- name: Clone Kyua source
if: matrix.enable-atf == '--enable-atf'
uses: actions/checkout@v4
with:
repository: "${{ env.KYUA_REPO }}"
ref: "${{ env.KYUA_REF }}"
# Same as `KYUA_SRCDIR`.
path: "${{ github.workspace }}/kyua-src"
- name: Build and Install Kyua
if: matrix.enable-atf == '--enable-atf'
run: |
CFG_OPTS="--disable-dependency-tracking"
CFG_OPTS="${CFG_OPTS} --prefix=${LUTOK_PREFIX}"
CXXFLAGS="$(pkgconf --cflags atf-c++ lutok)"
LDFLAGS="$(pkgconf --libs-only-L atf-c++ lutok)"
echo "Building lutok with ${CFG_OPTS}..."
echo "uname -a: $(uname -a)"
echo "uname -m: $(uname -m)"
echo "uname -p: $(uname -p)"
cd "${KYUA_SRCDIR}"
autoreconf -isv -I/usr/local/share/aclocal
mkdir -p "${KYUA_OBJDIR}"
cd "${KYUA_OBJDIR}"
set -x
env CXXFLAGS="${CXXFLAGS}" \
LDFLAGS="${LDFLAGS}" \
"${KYUA_SRCDIR}/configure" ${CFG_OPTS}
make -j${NPROC} all | tee kyua-make-all.log
sudo make install
- name: Test Lutok
if: matrix.enable-atf == '--enable-atf'
run: |
cd "${LUTOK_PREFIX}/tests/lutok"
kyua test
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
kyua report-html --output ${LUTOK_OBJDIR}/html # produces html subdirectory
# Include the plaintext and JUnit reports.
kyua report --verbose --results-filter=xfail,broken,failed > ${LUTOK_OBJDIR}/html/test-reportfailed.txt
kyua report-junit --output ${LUTOK_OBJDIR}/html/test-reportfailed.xml
# Include the kyua log.
cp -a ~/.kyua/logs ${LUTOK_OBJDIR}/html/
exit $check_exit

0 comments on commit e037e60

Please sign in to comment.