From f2b53c319f9db7f06469b761220859a11fffd083 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 . Signed-off-by: Enji Cooper --- .github/workflows/build.yaml | 173 +++++++++++++++++++++++++++++++++++ 1 file changed, 173 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..715e99e --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,173 @@ +--- +# 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 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 unfortunately picks +# up the binary package). +# - I'm not sure why Ubuntu doesn't distribute the liblua5.3-dev package on +# 24.04. +env: + KYUA_REPO: freebsd/kyua + KYUA_REF: 0.13 + +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 + - atf + - autoconf + - automake + - libtool + - pkgconf + - lua@5.4 + llvm-bindir: /opt/homebrew/opt/llvm/bin + - build-os: ubuntu-24.04 + compiler: clang-18 + pkgs: + - clang-18 + - atf-sh + - libatf-c++-2 + - libatf-c-1 + - libatf-dev + - autoconf + - automake + - libtool + - pkgconf + - liblua5.4-dev + - lua5.4 + llvm-bindir: /usr/lib/llvm-18/bin + steps: + - name: Install packages (macOS) + if: runner.os == 'macOS' + run: | + brew update --quiet || true + brew install ${{ join(matrix.pkgs, ' ') }} + - name: Install packages (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt update --quiet + sudo apt --quiet -y --no-install-suggests \ + --no-install-recommends install \ + ${{ join(matrix.pkgs, ' ') }} + - name: Checking out source + uses: actions/checkout@v4 + with: + path: 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}" >> "${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 + # 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}" + 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}" + "${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_OBJDIR}" + 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 "${LUTOK_PREFIX}/tests/lutok" + 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