git/ci/print-test-failures.sh
Johannes Schindelin f72f328bc5 ci: let GitHub Actions upload failed tests' directories
Arguably, CI builds' most important task is to not only identify
regressions, but to make it as easy as possible to investigate what went
wrong.

In that light, we will want to provide users with a way to inspect the
tests' output as well as the corresponding directories.

This commit adds build steps that are only executed when tests failed,
uploading the relevant information as build artifacts. These artifacts
can then be downloaded by interested parties to diagnose the failures
more efficiently.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-04-10 10:30:40 -07:00

98 lines
2.7 KiB
Bash
Executable file

#!/bin/sh
#
# Print output of failing tests
#
. ${0%/*}/lib.sh
# Tracing executed commands would produce too much noise in the loop below.
set +x
cd t/
if ! ls test-results/*.exit >/dev/null 2>/dev/null
then
echo "Build job failed before the tests could have been run"
exit
fi
case "$jobname" in
osx-clang|osx-gcc)
# base64 in OSX doesn't wrap its output at 76 columns by
# default, but prints a single, very long line.
base64_opts="-b 76"
;;
esac
combined_trash_size=0
for TEST_EXIT in test-results/*.exit
do
if [ "$(cat "$TEST_EXIT")" != "0" ]
then
TEST_OUT="${TEST_EXIT%exit}out"
echo "------------------------------------------------------------------------"
echo "$(tput setaf 1)${TEST_OUT}...$(tput sgr0)"
echo "------------------------------------------------------------------------"
cat "${TEST_OUT}"
test_name="${TEST_EXIT%.exit}"
test_name="${test_name##*/}"
trash_dir="trash directory.$test_name"
case "$CI_TYPE" in
travis)
;;
azure-pipelines)
mkdir -p failed-test-artifacts
mv "$trash_dir" failed-test-artifacts
continue
;;
github-actions)
mkdir -p failed-test-artifacts
echo "::set-env name=FAILED_TEST_ARTIFACTS::t/failed-test-artifacts"
cp "${TEST_EXIT%.exit}.out" failed-test-artifacts/
tar czf failed-test-artifacts/"$test_name".trash.tar.gz "$trash_dir"
continue
;;
*)
echo "Unhandled CI type: $CI_TYPE" >&2
exit 1
;;
esac
trash_tgz_b64="trash.$test_name.base64"
if [ -d "$trash_dir" ]
then
tar czp "$trash_dir" |base64 $base64_opts >"$trash_tgz_b64"
trash_size=$(wc -c <"$trash_tgz_b64")
if [ $trash_size -gt 1048576 ]
then
# larger than 1MB
echo "$(tput setaf 1)Didn't include the trash directory of '$test_name' in the trace log, it's too big$(tput sgr0)"
continue
fi
new_combined_trash_size=$(($combined_trash_size + $trash_size))
if [ $new_combined_trash_size -gt 1048576 ]
then
echo "$(tput setaf 1)Didn't include the trash directory of '$test_name' in the trace log, there is plenty of trash in there already.$(tput sgr0)"
continue
fi
combined_trash_size=$new_combined_trash_size
# DO NOT modify these two 'echo'-ed strings below
# without updating 'ci/util/extract-trash-dirs.sh'
# as well.
echo "$(tput setaf 1)Start of trash directory of '$test_name':$(tput sgr0)"
cat "$trash_tgz_b64"
echo "$(tput setaf 1)End of trash directory of '$test_name'$(tput sgr0)"
fi
fi
done
if [ $combined_trash_size -gt 0 ]
then
echo "------------------------------------------------------------------------"
echo "Trash directories embedded in this log can be extracted by running:"
echo
echo " curl https://api.travis-ci.org/v3/job/$TRAVIS_JOB_ID/log.txt |./ci/util/extract-trash-dirs.sh"
fi