diff --git a/.murdock b/.murdock index 462077ac93..77d881c5ae 100755 --- a/.murdock +++ b/.murdock @@ -7,11 +7,12 @@ export RIOT_CI_BUILD=1 export STATIC_TESTS=${STATIC_TESTS:-1} export CFLAGS_DBG="" export DLCACHE_DIR=${DLCACHE_DIR:-~/.dlcache} +export ENABLE_TEST_CACHE=${ENABLE_TEST_CACHE:-1} NIGHTLY=${NIGHTLY:-0} RUN_TESTS=${RUN_TESTS:-${NIGHTLY}} -DWQ_ENV="-E BOARDS -E APPS -E NIGHTLY -E RUN_TESTS" +DWQ_ENV="-E BOARDS -E APPS -E NIGHTLY -E RUN_TESTS -E ENABLE_TEST_CACHE -E TEST_HASH" check_label() { local label="${1}" @@ -24,6 +25,10 @@ check_label() { check_label "CI: run tests" && RUN_TESTS=1 } +[ "$ENABLE_TEST_CACHE" = "1" ] && { + check_label "CI: disable test cache" && export ENABLE_TEST_CACHE=0 +} + error() { echo "$@" exit 1 @@ -138,6 +143,30 @@ print_worker() { echo "-- running on worker ${DWQ_WORKER} thread ${DWQ_WORKER_THREAD}, build number $DWQ_WORKER_BUILDNUM." } +test_hash_calc() { + local bindir=$1 + + # Why two times cut? + # "test-input-hash.sha1" contains a list of lines containing + # " " on each line. + # We need to filter out the filename, as it contains the full path name, + # which differs depending on the build machine. + # + # After piping through sha1sum, we get " -". " -" has to go so we save the + # hassle of escaping the resulting hash. + + cat ${bindir}/test-input-hash.sha1 | cut -f1 -d' ' | sha1sum | cut -f1 -d' ' +} + +test_cache_get() { + test "${ENABLE_TEST_CACHE}" = "1" || return 1 + test -n "$(redis-cli get $1)" > /dev/null +} + +test_cache_put() { + redis-cli set "$1" ok +} + # compile one app for one board with one toolchain. delete intermediates. compile() { local appdir=$1 @@ -167,7 +196,7 @@ compile() { # compile CCACHE_BASEDIR="$(pwd)" BOARD=$board TOOLCHAIN=$toolchain RIOT_CI_BUILD=1 \ - make -C${appdir} clean all -j${JOBS:-4} + make -C${appdir} clean all test-input-hash -j${JOBS:-4} RES=$? # run tests @@ -178,8 +207,15 @@ compile() { BOARD=$board make -C${appdir} test RES=$? elif is_in_list "$board" "$TEST_BOARDS_AVAILABLE"; then - BOARD=$board TOOLCHAIN=$toolchain make -C${appdir} test-murdock - RES=$? + test_hash=$(test_hash_calc "$BINDIR") + echo "-- test_hash=$test_hash" + if test_cache_get $test_hash; then + echo "-- skipping test due to positive cache hit" + else + BOARD=$board TOOLCHAIN=$toolchain TEST_HASH=$test_hash \ + make -C${appdir} test-murdock + RES=$? + fi fi fi fi @@ -224,6 +260,14 @@ run_test() { echo "-- executing tests for $appdir on $board (compiled with $toolchain toolchain):" hook run_test_pre BOARD=$board TOOLCHAIN=${toolchain} make -C$appdir flash-only test + RES=$? + + if [ $RES -eq 0 -a -n "$TEST_HASH" ]; then + echo -n "-- saving test result to cache: " + test_cache_put $TEST_HASH + fi + + return $RES } # execute static tests