summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml6
-rw-r--r--.travis/README.md2
-rwxr-xr-x.travis/run-unit-tests.sh85
3 files changed, 90 insertions, 3 deletions
diff --git a/.travis.yml b/.travis.yml
index b5c938bcf6..8ca7169411 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -154,9 +154,11 @@ jobs:
name: Unit Testing
script:
- - fakeroot ./netdata-installer.sh --install $HOME --dont-wait --dont-start-it --enable-plugin-nfacct --enable-plugin-freeipmi --disable-lto
- - $HOME/netdata/usr/sbin/netdata -W unittest
+ - .travis/run-unit-tests.sh
env: CFLAGS='-O1 -DNETDATA_INTERNAL_CHECKS=1 -DNETDATA_VERIFY_LOCKS=1'
+ # We need a full deep clone for the checks done by the unit testing script to work.
+ git:
+ depth: false
after_failure: post_message "TRAVIS_MESSAGE" "Unit testing failed"
- name: Build/Install for ubuntu 18.04 (not containerized)
diff --git a/.travis/README.md b/.travis/README.md
index efa0292f49..0f6c077eff 100644
--- a/.travis/README.md
+++ b/.travis/README.md
@@ -63,7 +63,7 @@ that our product meets certain epxectations. At the current stage, we are focusi
like installing in different distributions, running the full lifecycle of install-run-update-install and so on.
We are still working on enriching this with more and more use cases, to get us closer to achieving full stability of our software.
Briefly we currently evaluate the following activities:
-- Basic software unit testing
+- Basic software unit testing (only run when changes happen that require it)
- Non containerized build and install on ubuntu 14.04
- Non containerized build and install on ubuntu 18.04
- Running the full Netdata lifecycle (install, update, uninstall) on ubuntu 18.04
diff --git a/.travis/run-unit-tests.sh b/.travis/run-unit-tests.sh
new file mode 100755
index 0000000000..f69150cfc7
--- /dev/null
+++ b/.travis/run-unit-tests.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+#
+# Unit-testing script
+#
+# This script does the following:
+# 1. Check whether any files were modified that would necessitate unit testing (using the `TRAVIS_COMMIT_RANGE` environment variable).
+# 2. If there are no changed files that require unit testing, exit successfully.
+# 3. Otherwise, run all the unit tests.
+#
+# We do things this way because our unit testing takes a rather long
+# time (average 18-19 minutes as of the original creation of this script),
+# so skipping it when we don't actually need it can significantly speed
+# up the CI process.
+#
+# Copyright: SPDX-License-Identifier: GPL-3.0-or-later
+#
+# Author: Austin S. Hemmelgarn <austin@netdata.cloud>
+#
+# shellcheck disable=SC2230
+
+install_netdata() {
+ echo "Installing Netdata"
+ fakeroot ./netdata-installer.sh --install $HOME --dont-wait --dont-start-it --enable-plugin-nfacct --enable-plugin-freeipmi --disable-lto
+}
+
+c_unit_tests() {
+ echo "Running C code unit tests"
+ $HOME/netdata/usr/sbin/netdata -W unittest
+}
+
+run_c_unit_tests=
+
+if [ -z ${TRAVIS_COMMIT_RANGE} ] ; then
+ # Travis gave us no commit range, so just run all the unit tests.
+ # Per the docs, this is the case when a new branch is pushed for the first time.
+ echo "No commit range supplied, assuming the worst case and running all unit tests."
+ run_c_unit_tests=1
+else
+ changed_paths=
+
+ if [ "${TRAVIS_PULL_REQUEST}" = "false" ] ; then
+ # This is not a PR build.
+ COMMIT1="$(echo ${TRAVIS_COMMIT_RANGE} | cut -f 1 -d '.')"
+ COMMIT2="$(echo ${TRAVIS_COMMIT_RANGE} | cut -f 4 -d '.')"
+
+ if [ "$(git cat-file -t ${COMMIT1} 2>/dev/null)" = commit -a "$(git cat-file -t ${COMMIT2} 2>/dev/null)" = commit ] ; then
+ # Examine the exact set of commits passed by Travis.
+ echo "Checking commits:"
+ git log --format=oneline --abbrev-commit ${COMMIT1}..${COMMIT2}
+ changed_paths="$(git diff --name-only ${COMMIT1}..${COMMIT2} --)"
+ else
+ # We couldn't find at least one of the changesets, so this build
+ # was probably triggered by a history rewrite. Since we can't
+ # figure out what chnaged, we need to just run all the tests anyway.
+ echo "Cannot determine which commits we are testing, running all unit tests."
+ run_c_unit_tests=1
+ fi
+ else
+ # This is a PR build, look at all commits from the target branch
+ # to HEAD.
+ echo "Checking commits:"
+ git log --format=oneline --abbrev-commit ${TRAVIS_BRANCH}..HEAD
+ changed_paths="$(git diff --name-only ${TRAVIS_BRANCH}..HEAD --)"
+ fi
+
+ if [ -n "${changed_paths}" ] ; then
+ # Check for changes that would require the C code to be re-tested
+ if (echo ${changed_paths} | grep -qE "daemon/unit_test|database") ; then
+ echo "Commits appear to change C code with unit tests, queueing C unit tests."
+ run_c_unit_tests=1
+ fi
+ fi
+fi
+
+if [ -z ${run_c_unit_tests} ] ; then
+ # No tests to run, log this and exit with success
+ echo "Commit range ${TRAVIS_COMMIT_RANGE} appears to make no changes that require unit tests, skipping unit testing."
+ exit 0
+else
+ install_netdata || exit 1
+
+ if [ -n ${run_c_unit_tests} ] ; then
+ c_unit_tests || exit 1
+ fi
+fi