#!/bin/bash # # .travis-functions.sh: # - helper functions to be sourced from .travis.yml # - designed to respect travis' environment but testing locally is possible # # Variables: # # TS_OPT__=yes # - forces tests/functions.sh:ts_has_option() to return "yes" for # variable in test # # TESTS_OPTIONS= # TESTS_PARALLEL= # TESTS_COMMAND= # - overwrites default from tests/Makemodule.am # # Do not use TS_* prefix for any travis or build-system stuff. This prefix is # exclusively used by tests/ stuff. # if [ ! -f "configure.ac" ]; then echo ".travis-functions.sh must be sourced from source dir" >&2 return 1 || exit 1 fi ## some config settings # travis docs say we get 1.5 CPUs MAKE="make -j2 V=1" DUMP_CONFIG_LOG="short" # Coverity-related settings COVERITY_SCAN_TOOL_BASE="/tmp/coverity-scan-analysis" COVERITY_SCAN_PROJECT_NAME="karelzak/util-linux" # workaround ugly warning on travis OSX, # see https://github.com/direnv/direnv/issues/210 shell_session_update() { :; } function xconfigure { local gcc_version clang_version cxx which "$CC" "$CC" --version if [[ "$CC" =~ ^clang-([0-9]+)$ ]]; then clang_version=${BASH_REMATCH[1]} cxx=clang++-${clang_version} elif [[ "$CC" =~ ^gcc-([0-9]+)$ ]]; then gcc_version=${BASH_REMATCH[1]} cxx=g++-${gcc_version} elif [[ "$CC" == "clang" ]]; then cxx=clang++ elif [[ "$CC" == "gcc" ]]; then cxx=g++ fi which "$cxx" "$cxx" --version CC=$CC CXX=$cxx ./configure "$@" $OSX_CONFOPTS err=$? if [ "$DUMP_CONFIG_LOG" = "short" ]; then grep -B1 -A10000 "^## Output variables" config.log | grep -v "_FALSE=" elif [ "$DUMP_CONFIG_LOG" = "full" ]; then cat config.log fi return $err } # TODO: integrate checkusage into our regular tests and remove this function function make_checkusage { local tmp # memory leaks are ignored here. See https://github.com/karelzak/util-linux/issues/1077 if ! tmp=$(ASAN_OPTIONS="$ASAN_OPTIONS:detect_leaks=0" $MAKE checkusage 2>&1) || test -n "$tmp"; then echo "$tmp" echo "make checkusage failed" >&2 return 1 fi } function check_nonroot { local make_opts="$MAKE_CHECK_OPTS --show-diff --parsable" local conf_opts="\ --disable-use-tty-group \ --disable-makeinstall-chown \ --enable-all-programs" if [ "$TRAVIS_OS_NAME" != "osx" ]; then conf_opts="$conf_opts --enable-asan --enable-ubsan" make_opts="$make_opts --memcheck-asan --memcheck-ubsan" if [ "$TRAVIS_DIST" != "precise" ]; then conf_opts="$conf_opts --enable-werror" fi if [[ "$CC" =~ "clang" ]]; then conf_opts="$conf_opts --enable-fuzzing-engine" fi fi xconfigure $conf_opts || return $MAKE || return osx_prepare_check # TESTS_* overwrites default from tests/Makemodule.am $MAKE check TESTS_OPTIONS="$make_opts" || return make_checkusage || return $MAKE install DESTDIR=/tmp/dest || return } function check_root { local make_opts="$MAKE_CHECK_OPTS --show-diff" local conf_opts="--enable-all-programs" if [ "$TRAVIS_OS_NAME" != "osx" ]; then conf_opts="$conf_opts --enable-asan --enable-ubsan" make_opts="$make_opts --memcheck-asan --memcheck-ubsan" if [ "$TRAVIS_DIST" != "precise" ]; then conf_opts="$conf_opts --enable-werror" fi if [[ "$CC" =~ "clang" ]]; then conf_opts="$conf_opts --enable-fuzzing-engine" fi fi xconfigure $conf_opts || return $MAKE || return # compile tests only $MAKE check-programs || return # Modify environment for OSX osx_prepare_check # TESTS_* overwrites default from tests/Makemodule.am sudo -E $MAKE check TESTS_PARALLEL="" TESTS_OPTIONS="$make_opts" || return # root on osx has not enough permission for make install ;) [ "$TRAVIS_OS_NAME" = "osx" ] && return # keep PATH to make sure sudo would find $CC sudo env "PATH=$PATH" $MAKE install || return } function run_coverity { local results_dir="cov-int" local tool_dir=$(find $COVERITY_SCAN_TOOL_BASE -type d -name 'cov-analysis*') local results_archive="analysis-results.tgz" local sha=$(git rev-parse --short HEAD) local author_email=$(git log -1 --pretty="%aE") local response status_code xconfigure --enable-all-programs || return echo -e "\033[33;1mRunning Coverity Scan Analysis Tool...\033[0m" COVERITY_UNSUPPORTED=1 $tool_dir/bin/cov-build --dir $results_dir sh -c "$MAKE check-programs all" || return $tool_dir/bin/cov-import-scm --dir $results_dir --scm git --log $results_dir/scm_log.txt || return echo -e "\033[33;1mTarring Coverity Scan Analysis results...\033[0m" tar czf $results_archive $results_dir || return echo -e "\033[33;1mUploading Coverity Scan Analysis results...\033[0m" response=$(curl \ --silent --write-out "\n%{http_code}\n" \ --form project=$COVERITY_SCAN_PROJECT_NAME \ --form token=$COVERITY_SCAN_TOKEN \ --form email=$author_email \ --form file=@$results_archive \ --form version=$sha \ --form description="Travis CI build" \ https://scan.coverity.com/builds) printf "\033[33;1mThe response is\033[0m\n%s\n" "$response" status_code=$(echo "$response" | sed -n '$p') if [ "$status_code" != "200" ]; then echo -e "\033[33;1mCoverity Scan upload failed: $(echo "$response" | sed '$d').\033[0m" return 1 fi echo -e "\n\033[33;1mCoverity Scan Analysis completed successfully.\033[0m" } function check_dist { xconfigure \ || return $MAKE distcheck || return } function travis_install_script { local ubuntu_release local additional_packages=() local clang_version gcc_version if [ "$TRAVIS_OS_NAME" = "osx" ]; then osx_install_script return fi ubuntu_release=$(lsb_release -cs) # install required packages sudo bash -c "echo 'deb-src http://archive.ubuntu.com/ubuntu/ $ubuntu_release main restricted universe multiverse' >>/etc/apt/sources.list" if [[ "$CC" =~ ^clang-([0-9]+)$ ]]; then clang_version=${BASH_REMATCH[1]} # the following snippet was borrowed from https://apt.llvm.org/llvm.sh wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo add-apt-repository -y "deb http://apt.llvm.org/$ubuntu_release/ llvm-toolchain-$ubuntu_release-$clang_version main" additional_packages+=(clang-$clang_version llvm-$clang_version) elif [[ "$CC" =~ ^gcc-([0-9]+)$ ]]; then gcc_version=${BASH_REMATCH[1]} sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test additional_packages+=(gcc-$gcc_version) fi sudo apt-get -qq update --fix-missing sudo apt-get build-dep -y util-linux sudo apt-get install -qq >/dev/null \ bc \ btrfs-tools \ dnsutils \ libcap-ng-dev \ libncursesw5-dev \ libpam-dev \ libudev-dev \ gtk-doc-tools \ mdadm \ ntp \ socat \ "${additional_packages[@]}" \ || return # install only if available (e.g. Ubuntu Trusty) sudo apt-get install -qq >/dev/null \ libsystemd-daemon-dev \ libsystemd-journal-dev \ || true if [ "$TRAVIS_BUILD_STAGE_NAME" = "Coverity" ]; then coverity_install_script return fi } function coverity_install_script { local platform=$(uname) local tool_url="https://scan.coverity.com/download/${platform}" local tool_archive="/tmp/cov-analysis-${platform}.tgz" echo -e "\033[33;1mDownloading Coverity Scan Analysis Tool...\033[0m" wget -nv -O $tool_archive $tool_url --post-data "project=$COVERITY_SCAN_PROJECT_NAME&token=$COVERITY_SCAN_TOKEN" || return echo -e "\033[33;1mExtracting Coverity Scan Analysis Tool...\033[0m" mkdir -p $COVERITY_SCAN_TOOL_BASE pushd $COVERITY_SCAN_TOOL_BASE tar xzf $tool_archive || return popd } function osx_install_script { brew update >/dev/null brew install gettext ncurses socat xz brew link --force gettext brew link --force ncurses OSX_CONFOPTS=" --disable-ipcrm \ --disable-ipcs \ --disable-libmount \ " # workaround: glibtoolize could not find sed export SED="sed" } function osx_prepare_check { [ "$TRAVIS_OS_NAME" = "osx" ] || return 0 # these ones only need to be gnu for our test-suite brew install coreutils findutils gnu-tar gnu-sed # symlink minimally needed gnu commands into PATH mkdir ~/bin for cmd in readlink seq timeout truncate find xargs tar sed; do ln -s /usr/local/bin/g$cmd $HOME/bin/$cmd done hash -r export TS_OPT_col_multibyte_known_fail=yes export TS_OPT_colcrt_regressions_known_fail=yes export TS_OPT_column_invalid_multibyte_known_fail=yes } function travis_before_script { set -o xtrace git clean -xdf ./autogen.sh ret=$? set +o xtrace return $ret } function travis_script { local ret # run_coverity should be run before set -o xtrace so as not to expose COVERITY_SCAN_TOKEN if [ "$TRAVIS_BUILD_STAGE_NAME" = "Coverity" ]; then run_coverity return fi set -o xtrace case "$MAKE_CHECK" in nonroot) check_nonroot ;; root) check_root ;; dist) check_dist ;; *) echo "error, check environment (travis.yml)" >&2 false ;; esac # We exit here with case-switch return value! ret=$? set +o xtrace return $ret } function travis_after_script { local diff_dir local tmp # find diff dir from check as well as from distcheck diff_dir=$(find . -type d -name "diff" | grep "tests/diff" | head -n 1) if [ -d "$diff_dir" ]; then tmp=$(find "$diff_dir" -type f | sort) echo -en "dump test diffs:\n${tmp}\n" echo "$tmp" | xargs cat fi }