about summary refs log tree commit diff
path: root/contrib/scripts/nm-ci-run.sh
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/scripts/nm-ci-run.sh')
-rwxr-xr-xcontrib/scripts/nm-ci-run.sh299
1 files changed, 299 insertions, 0 deletions
diff --git a/contrib/scripts/nm-ci-run.sh b/contrib/scripts/nm-ci-run.sh
new file mode 100755
index 00000000..e385ef1e
--- /dev/null
+++ b/contrib/scripts/nm-ci-run.sh
@@ -0,0 +1,299 @@
+#!/bin/bash
+
+# Arguments via environment variables:
+#  - CI
+#  - CC
+#  - BUILD_TYPE
+#  - CFLAGS
+#  - WITH_DOCS
+
+set -ex
+
+die() {
+    printf "%s\n" "$@"
+    exit 1
+}
+
+_is_true() {
+    case "$1" in
+        1|y|yes|YES|Yes|on)
+            return 0
+            ;;
+        0|n|no|NO|No|off)
+            return 1
+            ;;
+        "")
+            if [ "$2" == "" ]; then
+                die "not a boolean argument \"$1\""
+            fi
+            _is_true "$2"
+            return $?
+            ;;
+        *)
+            die "not a boolean argument \"$1\""
+            ;;
+    esac
+}
+
+USE_CCACHE=0
+if command -v ccache &>/dev/null; then
+    USE_CCACHE=1
+    export PATH="/usr/lib64/ccache:/usr/lib/ccache${PATH:+:${PATH}}"
+fi
+
+IS_FEDORA=0
+IS_CENTOS=0
+IS_ALPINE=0
+grep -q '^NAME=.*\(CentOS\)' /etc/os-release && IS_CENTOS=1
+grep -q '^NAME=.*\(Fedora\)' /etc/os-release && IS_FEDORA=1
+grep -q '^NAME=.*\(Alpine\)' /etc/os-release && IS_ALPINE=1
+
+###############################################################################
+
+if [ "$BUILD_TYPE" == meson ]; then
+    _TRUE=true
+    _FALSE=false
+elif [ "$BUILD_TYPE" == autotools ]; then
+    _TRUE=yes
+    _FALSE=no
+else
+    die "invalid \$BUILD_TYPE \"$BUILD_TYPE\""
+fi
+
+_WITH_CRYPTO="gnutls"
+_WITH_WERROR=1
+_WITH_LIBTEAM="$_TRUE"
+_WITH_DOCS="$_TRUE"
+_WITH_SYSTEMD_LOGIND="$_TRUE"
+if [ $IS_ALPINE = 1 ]; then
+    _WITH_SYSTEMD_LOGIND="$_FALSE"
+fi
+
+if [ -z "${NMTST_SEED_RAND+x}" ]; then
+    NMTST_SEED_RAND="$SRANDOM"
+    if [ -z "$NMTST_SEED_RAND" ]; then
+        NMTST_SEED_RAND="$(( ( (RANDOM<<15|RANDOM)<<15|RANDOM ) % 0xfffffffe ))"
+    fi
+fi
+export NMTST_SEED_RAND
+
+case "$CI" in
+    ""|"true"|"default"|"gitlab")
+        CI=default
+        ;;
+    *)
+        die "invalid \$CI \"$CI\""
+        ;;
+esac
+
+if [ "$CC" != gcc ]; then
+    _WITH_CRYPTO=nss
+fi
+
+if [ "$WITH_DOCS" != "" ]; then
+    if _is_true "$WITH_DOCS"; then
+        _WITH_DOCS="$_TRUE"
+    else
+        _WITH_DOCS="$_FALSE"
+    fi
+fi
+
+unset _WITH_VALGRIND_CHECKED
+_with_valgrind() {
+    _is_true "$WITH_VALGRIND" 0 || return 1
+
+    test "$_WITH_VALGRIND_CHECKED" = "1" && return 0
+    _WITH_VALGRIND_CHECKED=1
+
+    if [ "$IS_ALPINE" = 1 ]; then
+        # on Alpine we have no debug symbols and the suppressions
+        # don't work. Skip valgrind tests.
+        WITH_VALGRIND=0
+    fi
+
+    # Certain glib2 versions are known to report *lots* of leaks. Disable
+    # valgrind tests in this case.
+    # https://bugzilla.redhat.com/show_bug.cgi?id=1710417
+    if grep -q '^PRETTY_NAME="Fedora 30 (.*)"$' /etc/os-release ; then
+        if rpm -q glib2 | grep -q glib2-2.60.2-1.fc30 ; then
+            WITH_VALGRIND=0
+        fi
+    elif grep -q '^PRETTY_NAME="Fedora 31 (.*)"$' /etc/os-release; then
+        if rpm -q glib2 | grep -q glib2-2.61.0-2.fc31 ; then
+            WITH_VALGRIND=0
+        fi
+    elif grep -q '^PRETTY_NAME="Debian.*sid"$' /etc/os-release; then
+        if dpkg -s libglib2.0-bin | grep -q '^Version: 2.66.4-2$' ; then
+            WITH_VALGRIND=0
+        fi
+    fi
+    if [ "$WITH_VALGRIND" == 0 ]; then
+        echo "Don't use valgrind due to known issues in other packages."
+        return 1
+    fi
+    return 0
+}
+
+###############################################################################
+
+_print_test_logs() {
+    echo ">>>> PRINT TEST LOGS $1 (start)"
+    if test -f test-suite.log; then
+        cat test-suite.log
+    fi
+    echo ">>>> PRINT TEST LOGS $1 (done)"
+    if _with_valgrind; then
+        echo ">>>> PRINT VALGRIND LOGS $1 (start)"
+        find -name '*.valgrind-log' -print0 | xargs -0 grep -H ^ || true
+        echo ">>>> PRINT VALGRIND LOGS $1 (done)"
+    fi
+}
+
+run_autotools() {
+    NOCONFIGURE=1 ./autogen.sh
+    mkdir ./build
+    if [ "$_WITH_WERROR" == 1 ]; then
+        _WITH_WERROR_VAL="error"
+    else
+        _WITH_WERROR_VAL="yes"
+    fi
+    DISABLE_DEPENDENCY_TRACKING=
+    if [ $IS_ALPINE = 1 ]; then
+        DISABLE_DEPENDENCY_TRACKING='--disable-dependency-tracking'
+    fi
+    pushd ./build
+        ../configure \
+            --prefix="$PWD/INST" \
+            $DISABLE_DEPENDENCY_TRACKING \
+            \
+            --enable-introspection=$_WITH_DOCS \
+            --enable-gtk-doc=$_WITH_DOCS \
+            --with-systemd-logind=$_WITH_SYSTEMD_LOGIND \
+            --enable-more-warnings="$_WITH_WERROR_VAL" \
+            --enable-tests=yes \
+            --with-crypto=$_WITH_CRYPTO \
+            \
+            --with-ebpf=no \
+            \
+            --with-iwd=yes \
+            --with-ofono=yes \
+            --enable-teamdctl=$_WITH_LIBTEAM \
+            \
+            --with-dhcpcanon=yes \
+            --with-dhcpcd=yes \
+            --with-dhclient=yes \
+            \
+            --with-netconfig=/bin/nowhere/netconfig \
+            --with-resolvconf=/bin/nowhere/resolvconf \
+            \
+            --enable-ifcfg-rh=yes \
+            --enable-ifupdown=yes \
+            \
+            #end
+
+        if [ "$CONFIGURE_ONLY" != 1 ]; then
+            make -j 6
+            make install
+
+            export NM_TEST_CLIENT_CHECK_L10N=1
+
+            if ! make check -j 6 -k ; then
+                _print_test_logs "first-test"
+                echo ">>>> RUN SECOND TEST (start)"
+                NMTST_DEBUG="debug,TRACE,no-expect-message" make check -k || :
+                echo ">>>> RUN SECOND TEST (done)"
+                _print_test_logs "second-test"
+                die "autotools test failed"
+            fi
+
+            if _with_valgrind; then
+                if ! NMTST_USE_VALGRIND=1 make check -j 3 -k ; then
+                    _print_test_logs "(valgrind test)"
+                    die "autotools+valgrind test failed"
+                fi
+            fi
+        fi
+    popd
+}
+
+###############################################################################
+
+run_meson() {
+    if [ "$_WITH_WERROR" == 1 ]; then
+        _WITH_WERROR_VAL="--werror"
+    else
+        _WITH_WERROR_VAL=""
+    fi
+    meson setup build \
+        \
+        -Dprefix="$PWD/INST" \
+        \
+        --warnlevel 2 \
+        $_WITH_WERROR_VAL \
+        \
+        -D ld_gc=false \
+        -D session_tracking=no \
+        -D systemdsystemunitdir=no \
+        -D systemd_journal=false \
+        -D selinux=false \
+        -D libaudit=no \
+        -D libpsl=false \
+        -D vapi=false \
+        -D introspection=$_WITH_DOCS \
+        -D qt=false \
+        -D crypto=$_WITH_CRYPTO \
+        -D docs=$_WITH_DOCS \
+        \
+        -D ebpf=false \
+        \
+        -D iwd=true \
+        -D ofono=true \
+        -D teamdctl=$_WITH_LIBTEAM \
+        \
+        -D dhclient=/bin/nowhere/dhclient \
+        -D dhcpcanon=/bin/nowhere/dhcpcanon \
+        -D dhcpcd=/bin/nowhere/dhcpd \
+        \
+        -D netconfig=/bin/nowhere/netconfig \
+        -D resolvconf=/bin/nowhere/resolvconf \
+        \
+        -D ifcfg_rh=false \
+        -D ifupdown=true \
+        \
+        #end
+
+    export NM_TEST_CLIENT_CHECK_L10N=1
+
+    if [ "$CONFIGURE_ONLY" != 1 ]; then
+        ninja -C build -v
+        ninja -C build install
+
+        if ! meson test -C build -v --print-errorlogs ; then
+            echo ">>>> RUN SECOND TEST (start)"
+            NMTST_DEBUG="debug,TRACE,no-expect-message" \
+            meson test -C build -v --print-errorlogs || :
+            echo ">>>> RUN SECOND TEST (done)"
+            die "meson test failed"
+        fi
+
+        if _with_valgrind; then
+            if ! NMTST_USE_VALGRIND=1 meson test -C build -v --print-errorlogs ; then
+                _print_test_logs "(valgrind test)"
+                die "meson+valgrind test failed"
+            fi
+        fi
+    fi
+}
+
+###############################################################################
+
+if [ "$BUILD_TYPE" == autotools ]; then
+    run_autotools
+elif [ "$BUILD_TYPE" == meson ]; then
+    run_meson
+fi
+
+if [ "$USE_CCACHE" = 1 ]; then
+    echo "ccache statistics:"
+    ccache -s
+fi