From d618ddff73955815f5afd83b88a261e79ccff267 Mon Sep 17 00:00:00 2001 From: Enji Cooper Date: Thu, 26 Dec 2024 16:42:21 -0800 Subject: [PATCH] Add initial GitHub Actions support for lutok This proposed GitHub Actions workflow file runs tests on MacOS and Ubuntu Linux, similar to what is being proposed in https://github.com/freebsd/atf/pull/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 --- .github/workflows/build.yaml | 200 +++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 .github/workflows/build.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..ae47551 --- /dev/null +++ b/.github/workflows/build.yaml @@ -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 }} ${{ matrix.lua }} + 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