diff --git a/.github/workflows/ubuntu-unit-tests.sh b/.github/workflows/ubuntu-unit-tests.sh new file mode 100755 index 0000000000..831eab97f8 --- /dev/null +++ b/.github/workflows/ubuntu-unit-tests.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +PHASES=(${@:-SETUP RUN RUN_ASAN_UBSAN CLEANUP}) +RELEASE="$(lsb_release -cs)" +ADDITIONAL_DEPS=( + clang + expect + fdisk + libfdisk-dev + libfido2-dev + libp11-kit-dev + libpwquality-dev + libqrencode-dev + libssl-dev + libtss2-dev + libzstd-dev + perl + python3-libevdev + python3-pyparsing + zstd +) + +function info() { + echo -e "\033[33;1m$1\033[0m" +} + +set -ex + +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[@]}" + ;; + RUN|RUN_GCC|RUN_CLANG) + if [[ "$phase" = "RUN_CLANG" ]]; then + export CC=clang + export CXX=clang++ + MESON_ARGS=(--optimization=1) + fi + meson --werror -Dtests=unsafe -Dslow-tests=true -Dfuzz-tests=true -Dman=true "${MESON_ARGS[@]}" build + ninja -C build -v + meson test -C build --print-errorlogs + ;; + RUN_ASAN_UBSAN|RUN_GCC_ASAN_UBSAN|RUN_CLANG_ASAN_UBSAN) + if [[ "$phase" = "RUN_CLANG_ASAN_UBSAN" ]]; then + 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 + MESON_ARGS=(-Db_lundef=false -Dfuzz-tests=true --optimization=1) + fi + meson --werror -Dtests=unsafe -Db_sanitize=address,undefined "${MESON_ARGS[@]}" build + 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 + # There's some weird stuff going on in GH Actions, where the following + # `meson test` command hangs after test #252 unless it's executed under + # unbuffer or there's something else producing output. So far it happens + # _only_ with ASAn (not with UBSan), both with gcc and clang. I'll + # need to take a closer look later... + unbuffer meson test --timeout-multiplier=3 -C build --print-errorlogs + ;; + CLEANUP) + info "Cleanup phase" + ;; + *) + echo >&2 "Unknown phase '$phase'" + exit 1 + esac +done diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 0000000000..f63037fdb0 --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,24 @@ + +--- +# vi: ts=2 sw=2 et: +# +name: Unit tests +on: + pull_request: + branches: + - master + +jobs: + build: + runs-on: ubuntu-20.04 + strategy: + fail-fast: false + matrix: + run_phase: [GCC, GCC_ASAN_UBSAN, CLANG, CLANG_ASAN_UBSAN] + steps: + - name: Repository checkout + uses: actions/checkout@v1 + - name: Install build dependencies + run: sudo -E .github/workflows/ubuntu-unit-tests.sh SETUP + - name: Build & test (${{ matrix.run_phase }}) + run: sudo -E .github/workflows/ubuntu-unit-tests.sh RUN_${{ matrix.run_phase }} diff --git a/.travis.yml b/.travis.yml index 50f8e6a230..5f99e8df6a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,34 +12,12 @@ env: - CI_MANAGERS="$TRAVIS_BUILD_DIR/travis-ci/managers" - CI_TOOLS="$TRAVIS_BUILD_DIR/travis-ci/tools" - REPO_ROOT="$TRAVIS_BUILD_DIR" - jobs: - - DEBIAN_RELEASE=testing PHASE="RUN_GCC" - - DEBIAN_RELEASE=testing PHASE="RUN_GCC_ASAN_UBSAN" - - DEBIAN_RELEASE=testing PHASE="RUN_CLANG" - - DEBIAN_RELEASE=testing PHASE="RUN_CLANG_ASAN_UBSAN" stages: - # 'Test' is the default stage (for matrix jobs) - - name: Test - if: type != cron - # Run Coverity periodically instead of for each commit/PR - name: Coverity if: type = cron -# Matrix job definition - this is run for each combination of env variables -# from the env.jobs array above -before_install: - - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce - - docker --version -install: - - $CI_MANAGERS/debian.sh SETUP -script: - - $CI_MANAGERS/debian.sh $PHASE || travis_terminate 1 -after_script: - - $CI_MANAGERS/debian.sh CLEANUP - -# Inject another (single) job into the matrix for Coverity jobs: include: - stage: Coverity diff --git a/src/test/test-bpf-firewall.c b/src/test/test-bpf-firewall.c index cb7d8398a8..d129bb3629 100644 --- a/src/test/test-bpf-firewall.c +++ b/src/test/test-bpf-firewall.c @@ -37,6 +37,16 @@ int main(int argc, char *argv[]) { if (detect_container() > 0) return log_tests_skipped("test-bpf-firewall fails inside LXC and Docker containers: https://github.com/systemd/systemd/issues/9666"); +#ifdef __clang__ + /* FIXME: This test is for (currently unknown) reasons failing in both + * sanitized and unsanitized clang runs. Until the issue is resolved, + * let's skip the test when running on GH Actions and compiled with + * clang. + */ + if (strstr_ptr(ci_environment(), "github-actions")) + return log_tests_skipped("Skipping test on GH Actions"); +#endif + assert_se(getrlimit(RLIMIT_MEMLOCK, &rl) >= 0); rl.rlim_cur = rl.rlim_max = MAX(rl.rlim_max, CAN_MEMLOCK_SIZE); (void) setrlimit(RLIMIT_MEMLOCK, &rl); diff --git a/src/test/test-execute.c b/src/test/test-execute.c index 3b6a4be260..1890cc4f75 100644 --- a/src/test/test-execute.c +++ b/src/test/test-execute.c @@ -574,6 +574,11 @@ static void test_exec_dynamicuser(Manager *m) { return; } + if (strstr_ptr(ci_environment(), "github-actions")) { + log_notice("%s: skipping test on GH Actions because of systemd/systemd#10337", __func__); + return; + } + test(m, "exec-dynamicuser-fixeduser.service", can_unshare ? 0 : EXIT_NAMESPACE, CLD_EXITED); if (check_user_has_group_with_same_name("adm")) test(m, "exec-dynamicuser-fixeduser-adm.service", can_unshare ? 0 : EXIT_NAMESPACE, CLD_EXITED); diff --git a/src/test/test-loop-block.c b/src/test/test-loop-block.c index 298ded94df..93f2da70e7 100644 --- a/src/test/test-loop-block.c +++ b/src/test/test-loop-block.c @@ -132,9 +132,9 @@ int main(int argc, char *argv[]) { return EXIT_TEST_SKIP; } - if (strstr_ptr(ci_environment(), "autopkgtest")) { + if (strstr_ptr(ci_environment(), "autopkgtest") || strstr_ptr(ci_environment(), "github-actions")) { // FIXME: we should reenable this one day - log_tests_skipped("Skipping test on Ubuntu autopkgtest CI, test too slow and installed udev too flakey."); + log_tests_skipped("Skipping test on Ubuntu autopkgtest CI/GH Actions, test too slow and installed udev too flakey."); return EXIT_TEST_SKIP; }