summaryrefslogtreecommitdiffstats
path: root/.travis
diff options
context:
space:
mode:
authorAustin S. Hemmelgarn <austin@netdata.cloud>2019-12-19 08:41:42 -0500
committerGitHub <noreply@github.com>2019-12-19 08:41:42 -0500
commit23973d7f2abb0649109a0099d322592167ece06d (patch)
tree9f863002646e1e89aaa6f28a29ec0606d168eddf /.travis
parentce9f70d7b3696a54f099628f3337f5c4d5bd1407 (diff)
Skip unit testing during CI when it's not needed. (#7559)
* Skip unit testing during CI when it's not needed. Our current unit testing takes almost 20 minutes on average during the CI process, which is almost twice as long as any other step, and it's only going to get longer as we get better test coverage. This commit slightly alters how we handle unit testing during CI so that only those unit tests which are actually needed get run. This is achieved by using the `$TRAVIS_COMMIT_RANGE` environment variable provided by Travis to determine which commits we're actually testing, and then using that information to query Git for what files actually changed. As of right now, the only unit testing we're doing is in the dbengine code, so we check to see if any of those files or the C unit testing files are modified by the PR and only runs the unit tests for those if they were modified. The checks are a bit more wide-ranging than they probably need to be so that we make sure to avoid any false negatives. This should speed up CI checks for PR's (as well as not monopolizing the master branch after every PR that gets merged). * Restructure to better handle PR's. The previous code did not work correctly with PR's because it ignored the fact that Travis does not appear to report the full list of commits for a PR in `TRAVIS_COMMIT_RANGE`, instead only reporting the most recent set of commits that were pushed. * Add listing of commits being checked. This will allow for verification of what is being tested, making it easier to spot issues with the detection logic. * Don't assume PR's are targeting the master branch.
Diffstat (limited to '.travis')
-rw-r--r--.travis/README.md2
-rwxr-xr-x.travis/run-unit-tests.sh85
2 files changed, 86 insertions, 1 deletions
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