diff options
-rwxr-xr-x | .github/workflows/ubuntu-unit-tests.sh | 79 | ||||
-rw-r--r-- | .github/workflows/unit_tests.yml | 24 | ||||
-rw-r--r-- | .travis.yml | 22 |
3 files changed, 103 insertions, 22 deletions
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 |