# Log capturing for the Kokoro runtime environment. # # This script should be `source`d from Kokoro build scripts to configure log # capturing when running under Kokoro. # # When not running under Kokoro, no logs will be collected. If you want to run # locally and collect logs anyway, set the KOKORO_ARTIFACTS_DIR environment # variable to a directory where the logs should go. # # The job `.cfg` file needs the following stanzas to declare the captured logs # as outputs (yes, these are globs, not regexes): # # action: { # define_artifacts: { # regex: "**/*sponge_log.log" # regex: "**/*sponge_log.xml" # } # } # # Use the provided functions below as build/test fixtures, e.g.: # # source kokoro/common/capture_logs.sh # caplog build/step1 # caplog tests/step2 # # If log capturing is enabled, this script will set some variables that can be # used if necessary: # # CAPLOG_DIR is used for logs # CAPLOG_CMAKE_ARGS contains extra cmake args to enable test XML output # CAPLOG_CTEST_ARGS contains extra ctest args to capture combined test logs # # For example: # # if [[ -v CAPLOG_DIR_BUILD ]]; then # cp extra_diagnostics.log "${CAPLOG_DIR_BUILD}/diagnostics.log" # fi # # # Use ${...:-} form under `set -u`: # caplog build/01_configure cmake -G Ninja ${CAPLOG_CMAKE_ARGS:-} # caplog build/02_build cmake --build # caplog test/03_test ctest ${CAPLOG_CTEST_ARGS:-} if [[ -z ${KOKORO_ARTIFACTS_DIR:-} ]]; then function caplog() { shift; "$@"; } else CAPLOG_DIR="$(mktemp -d)" CAPLOG_CMAKE_ARGS="-Dprotobuf_TEST_XML_OUTDIR=${CAPLOG_DIR}/tests/" CAPLOG_CTEST_ARGS="--verbose" # Captures the stdout/stderr of a command to a named log file. # Usage: caplog NAME COMMAND [ARGS...] function caplog() { _name="${CAPLOG_DIR}/${1%.log}.log"; shift mkdir -p "${_name%/*}" date time ( "$@" 2>&1 | tee "${_name}" ) if [[ $? != 0 ]] ; then cat "${_name}" return 1 fi } # Trap handler: renames logs on script exit so they will be found by Kokoro. function _caplog_onexit() { _rc=$? set +x echo "Collecting logs [${BASH_SOURCE}]" find "${CAPLOG_DIR}" -type f -name '*.log' \ | while read _textlog; do # Ensure an XML file exists for each .log file. touch ${_textlog%.log}.xml done find "${CAPLOG_DIR}" -type f \( -name '*.xml' -or -name '*.log' \) \ | while read _src; do # Move to artifacts dir, preserving the path relative to CAPLOG_DIR. # The filename changes from foo/bar.log to foo/bar/sponge_log.log. _logfile=${_src/${CAPLOG_DIR}\//} _stem=${KOKORO_ARTIFACTS_DIR}/${_logfile%.*} _ext=${_logfile##*.} mkdir -p ${_stem} mv -v "${_src}" "${_stem}/sponge_log.${_ext}" done rm -rv "${CAPLOG_DIR}" exit ${_rc} } trap _caplog_onexit EXIT fi