2021-12-12 20:27:04 +01:00
#!/usr/bin/env bash
2021-10-01 12:10:22 +02:00
# SPDX-License-Identifier: LGPL-2.1-or-later
2021-01-05 11:52:46 +01:00
2021-09-29 19:55:24 +02:00
# shellcheck disable=SC2206
2021-01-05 11:52:46 +01:00
PHASES = ( ${ @ :- SETUP RUN RUN_ASAN_UBSAN CLEANUP } )
RELEASE = " $( lsb_release -cs) "
ADDITIONAL_DEPS = (
clang
expect
fdisk
2021-05-19 14:45:47 +01:00
jekyll
2022-01-16 08:32:17 +00:00
libbpf-dev
2021-01-05 11:52:46 +01:00
libfdisk-dev
libfido2-dev
libp11-kit-dev
libpwquality-dev
libqrencode-dev
libssl-dev
libtss2-dev
2022-01-16 15:30:22 +00:00
libxkbcommon-dev
2021-01-05 11:52:46 +01:00
libzstd-dev
perl
python3-libevdev
python3-pyparsing
2022-03-03 20:30:43 +01:00
rpm
2021-01-05 11:52:46 +01:00
zstd
)
function info( ) {
echo -e " \033[33;1m $1 \033[0m "
}
2022-01-13 07:01:17 +00:00
function run_meson( ) {
if ! meson " $@ " ; then
find . -type f -name meson-log.txt -exec cat '{}' +
return 1
fi
}
2021-01-05 11:52:46 +01:00
set -ex
2021-12-01 12:50:01 +01:00
MESON_ARGS = ( -Dcryptolib= ${ CRYPTOLIB :- auto } )
2021-01-05 11:52:46 +01:00
for phase in " ${ PHASES [@] } " ; do
case $phase in
SETUP)
info "Setup phase"
bash -c " echo 'deb-src http://archive.ubuntu.com/ubuntu/ $RELEASE main restricted universe multiverse' >>/etc/apt/sources.list "
# PPA with some newer build dependencies
add-apt-repository -y ppa:upstream-systemd-ci/systemd-ci
apt-get -y update
apt-get -y build-dep systemd
apt-get -y install " ${ ADDITIONAL_DEPS [@] } "
2022-01-13 17:36:56 +00:00
pip3 install -r .github/workflows/requirements.txt --require-hashes
2021-01-05 11:52:46 +01:00
; ;
2022-06-03 18:16:57 +00:00
RUN| RUN_GCC| RUN_CLANG| RUN_CLANG_RELEASE)
if [ [ " $phase " = ~ ^RUN_CLANG ] ] ; then
2021-01-05 11:52:46 +01:00
export CC = clang
export CXX = clang++
2022-06-03 18:16:57 +00:00
if [ [ " $phase " = = RUN_CLANG ] ] ; then
# The docs build is slow and is not affected by compiler/flags, so do it just once
MESON_ARGS += ( -Dman= true )
else
MESON_ARGS += ( -Dmode= release --optimization= 2)
fi
2022-10-25 01:17:09 +01: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 11:52:46 +01:00
fi
2022-04-28 01:26:04 +00:00
# The install_tag feature introduced in 0.60 causes meson to fail with fatal-meson-warnings
# "Project targeting '>= 0.53.2' but tried to use feature introduced in '0.60.0': install_tag arg in custom_target"
# It can be safely removed from the CI since it isn't actually used anywhere to test anything.
find . -type f -name meson.build -exec sed -i '/install_tag/d' '{}' '+'
MESON_ARGS += ( --fatal-meson-warnings)
2022-04-27 10:54:14 +01:00
run_meson -Dnobody-group= nogroup --werror -Dtests= unsafe -Dslow-tests= true -Dfuzz-tests= true " ${ MESON_ARGS [@] } " build
2021-01-05 11:52:46 +01:00
ninja -C build -v
2021-09-29 17:37:21 +09:00
meson test -C build --print-errorlogs
2021-01-05 11:52:46 +01:00
; ;
2022-02-22 11:02:44 +00:00
RUN_ASAN_UBSAN| RUN_GCC_ASAN_UBSAN| RUN_CLANG_ASAN_UBSAN| RUN_CLANG_ASAN_UBSAN_NO_DEPS)
2021-01-13 21:48:36 +01:00
MESON_ARGS = ( --optimization= 1)
2022-02-22 11:02:44 +00:00
if [ [ " $phase " = ~ ^RUN_CLANG_ASAN_UBSAN ] ] ; then
2021-01-05 11:52:46 +01:00
export CC = clang
export CXX = clang++
# 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 21:48:36 +01:00
MESON_ARGS += ( -Db_lundef= false -Dfuzz-tests= true )
2022-02-22 11:02:44 +00:00
if [ [ " $phase " = = "RUN_CLANG_ASAN_UBSAN_NO_DEPS" ] ] ; then
MESON_ARGS += ( -Dskip-deps= true )
fi
2021-01-05 11:52:46 +01:00
fi
2022-04-28 01:26:04 +00:00
# The install_tag feature introduced in 0.60 causes meson to fail with fatal-meson-warnings
# "Project targeting '>= 0.53.2' but tried to use feature introduced in '0.60.0': install_tag arg in custom_target"
# It can be safely removed from the CI since it isn't actually used anywhere to test anything.
find . -type f -name meson.build -exec sed -i '/install_tag/d' '{}' '+'
MESON_ARGS += ( --fatal-meson-warnings)
2022-04-27 10:54:14 +01:00
run_meson -Dnobody-group= nogroup --werror -Dtests= unsafe -Db_sanitize= address,undefined " ${ MESON_ARGS [@] } " build
2021-01-05 11:52:46 +01: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 21:42:13 +01: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 17:37:21 +09:00
meson test --timeout-multiplier= 3 -C build --print-errorlogs
2021-01-05 11:52:46 +01:00
; ;
CLEANUP)
info "Cleanup phase"
2022-10-25 01:17:09 +01:00
if [ ! -f /etc/machine-id ] && [ -w /etc/machine-id.bak ] ; then
mv /etc/machine-id.bak /etc/machine-id
fi
2021-01-05 11:52:46 +01:00
; ;
*)
echo >& 2 " Unknown phase ' $phase ' "
exit 1
esac
done