2021-12-12 22:27:04 +03:00
#!/usr/bin/env bash
2021-10-01 13:10:22 +03:00
# SPDX-License-Identifier: LGPL-2.1-or-later
2021-01-05 13:52:46 +03:00
2021-09-29 20:55:24 +03:00
# shellcheck disable=SC2206
2021-01-05 13:52:46 +03:00
PHASES = ( ${ @ :- SETUP RUN RUN_ASAN_UBSAN CLEANUP } )
ADDITIONAL_DEPS = (
clang
expect
fdisk
2021-05-19 16:45:47 +03:00
jekyll
2022-01-16 11:32:17 +03:00
libbpf-dev
2021-01-05 13:52:46 +03:00
libfdisk-dev
libfido2-dev
libp11-kit-dev
libpwquality-dev
libqrencode-dev
libssl-dev
libtss2-dev
2022-01-16 18:30:22 +03:00
libxkbcommon-dev
2021-01-05 13:52:46 +03:00
libzstd-dev
python3-libevdev
2022-11-25 21:14:42 +03:00
python3-pefile
2023-03-02 17:41:17 +03:00
python3-pyelftools
2021-01-05 13:52:46 +03:00
python3-pyparsing
2024-01-16 23:36:05 +03:00
python3-pytest
2022-03-03 22:30:43 +03:00
rpm
2021-01-05 13:52:46 +03:00
zstd
)
function info( ) {
echo -e " \033[33;1m $1 \033[0m "
}
2022-01-13 10:01:17 +03:00
function run_meson( ) {
if ! meson " $@ " ; then
find . -type f -name meson-log.txt -exec cat '{}' +
return 1
fi
}
2021-01-05 13:52:46 +03:00
set -ex
2021-12-01 14:50:01 +03:00
MESON_ARGS = ( -Dcryptolib= ${ CRYPTOLIB :- auto } )
2024-03-06 17:21:10 +03:00
# (Re)set the current oom-{score-}adj. For some reason root on GH actions is able to _decrease_
# its oom-score even after dropping all capabilities (including CAP_SYS_RESOURCE), until the
# score is explicitly changed after sudo. No idea what's going on, but it breaks
# exec-oomscoreadjust-negative.service from test-execute when running unprivileged.
choom -p $$ -n 0
2021-01-05 13:52:46 +03:00
for phase in " ${ PHASES [@] } " ; do
case $phase in
SETUP)
info "Setup phase"
2024-04-24 17:33:31 +03:00
# This is added by default, and it is often broken, but we don't need anything from it
2024-06-07 11:55:53 +03:00
rm -f /etc/apt/sources.list.d/microsoft-prod.{ list,sources}
# add-apt-repository --enable-source does not work on deb822 style sources.
for f in /etc/apt/sources.list.d/*.sources; do
sed -i "s/Types: deb/Types: deb deb-src/g" " $f "
done
2021-01-05 13:52:46 +03:00
apt-get -y update
apt-get -y build-dep systemd
apt-get -y install " ${ ADDITIONAL_DEPS [@] } "
2024-06-07 11:55:53 +03:00
pip3 install -r .github/workflows/requirements.txt --require-hashes --break-system-packages
2024-03-06 17:04:22 +03:00
# Make sure the build dir is accessible even when drop privileges, otherwise the unprivileged
# part of test-execute gets skipped, since it can't run systemd-executor
chmod o+x /home/runner
capsh --drop= all -- -c " stat $PWD /meson.build "
2021-01-05 13:52:46 +03:00
; ;
2022-06-03 21:16:57 +03:00
RUN| RUN_GCC| RUN_CLANG| RUN_CLANG_RELEASE)
if [ [ " $phase " = ~ ^RUN_CLANG ] ] ; then
2021-01-05 13:52:46 +03:00
export CC = clang
export CXX = clang++
2024-06-07 11:55:53 +03:00
export CFLAGS = "-fno-sanitize=function"
export CXXFLAGS = "-fno-sanitize=function"
2022-06-03 21:16:57 +03:00
if [ [ " $phase " = = RUN_CLANG ] ] ; then
# The docs build is slow and is not affected by compiler/flags, so do it just once
2023-08-10 17:00:55 +03:00
MESON_ARGS += ( -Dman= enabled)
2022-06-03 21:16:57 +03:00
else
MESON_ARGS += ( -Dmode= release --optimization= 2)
fi
2022-10-25 03:17:09 +03:00
# Some variation: remove machine-id, like on Debian builders to ensure unit tests still work.
if [ -w /etc/machine-id ] ; then
mv /etc/machine-id /etc/machine-id.bak
fi
2021-01-05 13:52:46 +03:00
fi
2022-04-28 04:26:04 +03:00
MESON_ARGS += ( --fatal-meson-warnings)
2022-04-27 12:54:14 +03:00
run_meson -Dnobody-group= nogroup --werror -Dtests= unsafe -Dslow-tests= true -Dfuzz-tests= true " ${ MESON_ARGS [@] } " build
2021-01-05 13:52:46 +03:00
ninja -C build -v
2024-01-26 03:25:04 +03:00
# Ensure setting a timezone (like the reproducible build tests do) does not break time/date unit tests
TZ = GMT+12 meson test -C build --print-errorlogs
2021-01-05 13:52:46 +03:00
; ;
2022-02-22 14:02:44 +03:00
RUN_ASAN_UBSAN| RUN_GCC_ASAN_UBSAN| RUN_CLANG_ASAN_UBSAN| RUN_CLANG_ASAN_UBSAN_NO_DEPS)
2021-01-13 23:48:36 +03:00
MESON_ARGS = ( --optimization= 1)
2022-02-22 14:02:44 +03:00
if [ [ " $phase " = ~ ^RUN_CLANG_ASAN_UBSAN ] ] ; then
2021-01-05 13:52:46 +03:00
export CC = clang
export CXX = clang++
2024-06-07 11:55:53 +03:00
export CFLAGS = "-fno-sanitize=function"
export CXXFLAGS = "-fno-sanitize=function"
2021-01-05 13:52:46 +03:00
# Build fuzzer regression tests only with clang (for now),
# see: https://github.com/systemd/systemd/pull/15886#issuecomment-632689604
# -Db_lundef=false: See https://github.com/mesonbuild/meson/issues/764
2021-01-13 23:48:36 +03:00
MESON_ARGS += ( -Db_lundef= false -Dfuzz-tests= true )
2022-02-22 14:02:44 +03:00
if [ [ " $phase " = = "RUN_CLANG_ASAN_UBSAN_NO_DEPS" ] ] ; then
2023-08-10 19:11:25 +03:00
MESON_ARGS += ( --auto-features= disabled)
2022-02-22 14:02:44 +03:00
fi
2021-01-05 13:52:46 +03:00
fi
2022-04-28 04:26:04 +03:00
MESON_ARGS += ( --fatal-meson-warnings)
2022-04-27 12:54:14 +03:00
run_meson -Dnobody-group= nogroup --werror -Dtests= unsafe -Db_sanitize= address,undefined " ${ MESON_ARGS [@] } " build
2021-01-05 13:52:46 +03:00
ninja -C build -v
export ASAN_OPTIONS = strict_string_checks = 1:detect_stack_use_after_return= 1:check_initialization_order= 1:strict_init_order= 1
# Never remove halt_on_error from UBSAN_OPTIONS. See https://github.com/systemd/systemd/commit/2614d83aa06592aedb.
export UBSAN_OPTIONS = print_stacktrace = 1:print_summary= 1:halt_on_error= 1
2021-01-13 23:42:13 +03:00
# FIXME
# For some strange reason the GH Actions VM stops responding after
# executing first ~150 tests, _unless_ there's something producing
# output (either running `meson test` in verbose mode, or something
# else in background). Despite my efforts so far I haven't been able
# to identify the culprit (since the issue is not reproducible
# during debugging, wonderful), so let's at least keep a workaround
# here to make the builds stable for the time being.
( set +x; while :; do echo -ne " \n[WATCHDOG] $( date) \n " ; sleep 30; done ) &
2021-09-29 11:37:21 +03:00
meson test --timeout-multiplier= 3 -C build --print-errorlogs
2021-01-05 13:52:46 +03:00
; ;
CLEANUP)
info "Cleanup phase"
2022-10-25 03:17:09 +03:00
if [ ! -f /etc/machine-id ] && [ -w /etc/machine-id.bak ] ; then
mv /etc/machine-id.bak /etc/machine-id
fi
2021-01-05 13:52:46 +03:00
; ;
*)
echo >& 2 " Unknown phase ' $phase ' "
exit 1
esac
done