]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ci: move Travis CI unit test jobs to GH Actions
authorFrantisek Sumsal <frantisek@sumsal.cz>
Tue, 5 Jan 2021 10:52:46 +0000 (11:52 +0100)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Fri, 8 Jan 2021 10:36:59 +0000 (11:36 +0100)
.github/workflows/ubuntu-unit-tests.sh [new file with mode: 0755]
.github/workflows/unit_tests.yml [new file with mode: 0644]
.travis.yml

diff --git a/.github/workflows/ubuntu-unit-tests.sh b/.github/workflows/ubuntu-unit-tests.sh
new file mode 100755 (executable)
index 0000000..831eab9
--- /dev/null
@@ -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 (file)
index 0000000..f63037f
--- /dev/null
@@ -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 }}
index 50f8e6a230b5104870da0f098f31c4dbd2d086d3..5f99e8df6a0c6d506adb72f8bade8693bf1113a2 100644 (file)
@@ -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