1*1b3f573fSAndroid Build Coastguard Worker# Log capturing for the Kokoro runtime environment. 2*1b3f573fSAndroid Build Coastguard Worker# 3*1b3f573fSAndroid Build Coastguard Worker# This script should be `source`d from Kokoro build scripts to configure log 4*1b3f573fSAndroid Build Coastguard Worker# capturing when running under Kokoro. 5*1b3f573fSAndroid Build Coastguard Worker# 6*1b3f573fSAndroid Build Coastguard Worker# When not running under Kokoro, no logs will be collected. If you want to run 7*1b3f573fSAndroid Build Coastguard Worker# locally and collect logs anyway, set the KOKORO_ARTIFACTS_DIR environment 8*1b3f573fSAndroid Build Coastguard Worker# variable to a directory where the logs should go. 9*1b3f573fSAndroid Build Coastguard Worker# 10*1b3f573fSAndroid Build Coastguard Worker# The job `.cfg` file needs the following stanzas to declare the captured logs 11*1b3f573fSAndroid Build Coastguard Worker# as outputs (yes, these are globs, not regexes): 12*1b3f573fSAndroid Build Coastguard Worker# 13*1b3f573fSAndroid Build Coastguard Worker# action: { 14*1b3f573fSAndroid Build Coastguard Worker# define_artifacts: { 15*1b3f573fSAndroid Build Coastguard Worker# regex: "**/*sponge_log.log" 16*1b3f573fSAndroid Build Coastguard Worker# regex: "**/*sponge_log.xml" 17*1b3f573fSAndroid Build Coastguard Worker# } 18*1b3f573fSAndroid Build Coastguard Worker# } 19*1b3f573fSAndroid Build Coastguard Worker# 20*1b3f573fSAndroid Build Coastguard Worker# Use the provided functions below as build/test fixtures, e.g.: 21*1b3f573fSAndroid Build Coastguard Worker# 22*1b3f573fSAndroid Build Coastguard Worker# source kokoro/capture_logs.sh 23*1b3f573fSAndroid Build Coastguard Worker# caplog build/step1 <build command> 24*1b3f573fSAndroid Build Coastguard Worker# caplog tests/step2 <test command> 25*1b3f573fSAndroid Build Coastguard Worker# 26*1b3f573fSAndroid Build Coastguard Worker# If log capturing is enabled, this script will set some variables that can be 27*1b3f573fSAndroid Build Coastguard Worker# used if necessary: 28*1b3f573fSAndroid Build Coastguard Worker# 29*1b3f573fSAndroid Build Coastguard Worker# CAPLOG_DIR is used for logs 30*1b3f573fSAndroid Build Coastguard Worker# CAPLOG_CMAKE_ARGS contains extra cmake args to enable test XML output 31*1b3f573fSAndroid Build Coastguard Worker# CAPLOG_CTEST_ARGS contains extra ctest args to capture combined test logs 32*1b3f573fSAndroid Build Coastguard Worker# 33*1b3f573fSAndroid Build Coastguard Worker# For example: 34*1b3f573fSAndroid Build Coastguard Worker# 35*1b3f573fSAndroid Build Coastguard Worker# if [[ -v CAPLOG_DIR_BUILD ]]; then 36*1b3f573fSAndroid Build Coastguard Worker# cp extra_diagnostics.log "${CAPLOG_DIR_BUILD}/diagnostics.log" 37*1b3f573fSAndroid Build Coastguard Worker# fi 38*1b3f573fSAndroid Build Coastguard Worker# 39*1b3f573fSAndroid Build Coastguard Worker# # Use ${...:-} form under `set -u`: 40*1b3f573fSAndroid Build Coastguard Worker# caplog build/01_configure cmake -G Ninja ${CAPLOG_CMAKE_ARGS:-} 41*1b3f573fSAndroid Build Coastguard Worker# caplog build/02_build cmake --build 42*1b3f573fSAndroid Build Coastguard Worker# caplog test/03_test ctest ${CAPLOG_CTEST_ARGS:-} 43*1b3f573fSAndroid Build Coastguard Worker 44*1b3f573fSAndroid Build Coastguard Workerif [[ -z ${KOKORO_ARTIFACTS_DIR:-} ]]; then 45*1b3f573fSAndroid Build Coastguard Worker function caplog() { shift; "$@"; } 46*1b3f573fSAndroid Build Coastguard Workerelse 47*1b3f573fSAndroid Build Coastguard Worker 48*1b3f573fSAndroid Build Coastguard Worker CAPLOG_DIR="$(mktemp -d)" 49*1b3f573fSAndroid Build Coastguard Worker CAPLOG_CMAKE_ARGS="-Dprotobuf_TEST_XML_OUTDIR=${CAPLOG_DIR}/tests/" 50*1b3f573fSAndroid Build Coastguard Worker CAPLOG_CTEST_ARGS="--verbose" 51*1b3f573fSAndroid Build Coastguard Worker 52*1b3f573fSAndroid Build Coastguard Worker # Captures the stdout/stderr of a command to a named log file. 53*1b3f573fSAndroid Build Coastguard Worker # Usage: caplog NAME COMMAND [ARGS...] 54*1b3f573fSAndroid Build Coastguard Worker function caplog() { 55*1b3f573fSAndroid Build Coastguard Worker _name="${CAPLOG_DIR}/${1%.log}.log"; shift 56*1b3f573fSAndroid Build Coastguard Worker mkdir -p "${_name%/*}" 57*1b3f573fSAndroid Build Coastguard Worker date 58*1b3f573fSAndroid Build Coastguard Worker time ( "$@" 2>&1 | tee "${_name}" ) 59*1b3f573fSAndroid Build Coastguard Worker if [[ $? != 0 ]] ; then 60*1b3f573fSAndroid Build Coastguard Worker cat "${_name}" 61*1b3f573fSAndroid Build Coastguard Worker return 1 62*1b3f573fSAndroid Build Coastguard Worker fi 63*1b3f573fSAndroid Build Coastguard Worker } 64*1b3f573fSAndroid Build Coastguard Worker 65*1b3f573fSAndroid Build Coastguard Worker # Trap handler: renames logs on script exit so they will be found by Kokoro. 66*1b3f573fSAndroid Build Coastguard Worker function _caplog_onexit() { 67*1b3f573fSAndroid Build Coastguard Worker _rc=$? 68*1b3f573fSAndroid Build Coastguard Worker set +x 69*1b3f573fSAndroid Build Coastguard Worker echo "Collecting logs [${BASH_SOURCE}]" 70*1b3f573fSAndroid Build Coastguard Worker 71*1b3f573fSAndroid Build Coastguard Worker find "${CAPLOG_DIR}" -type f -name '*.log' \ 72*1b3f573fSAndroid Build Coastguard Worker | while read _textlog; do 73*1b3f573fSAndroid Build Coastguard Worker # Ensure an XML file exists for each .log file. 74*1b3f573fSAndroid Build Coastguard Worker touch ${_textlog%.log}.xml 75*1b3f573fSAndroid Build Coastguard Worker done 76*1b3f573fSAndroid Build Coastguard Worker 77*1b3f573fSAndroid Build Coastguard Worker find "${CAPLOG_DIR}" -type f \( -name '*.xml' -or -name '*.log' \) \ 78*1b3f573fSAndroid Build Coastguard Worker | while read _src; do 79*1b3f573fSAndroid Build Coastguard Worker # Move to artifacts dir, preserving the path relative to CAPLOG_DIR. 80*1b3f573fSAndroid Build Coastguard Worker # The filename changes from foo/bar.log to foo/bar/sponge_log.log. 81*1b3f573fSAndroid Build Coastguard Worker _logfile=${_src/${CAPLOG_DIR}\//} 82*1b3f573fSAndroid Build Coastguard Worker _stem=${KOKORO_ARTIFACTS_DIR}/${_logfile%.*} 83*1b3f573fSAndroid Build Coastguard Worker _ext=${_logfile##*.} 84*1b3f573fSAndroid Build Coastguard Worker mkdir -p ${_stem} 85*1b3f573fSAndroid Build Coastguard Worker mv -v "${_src}" "${_stem}/sponge_log.${_ext}" 86*1b3f573fSAndroid Build Coastguard Worker done 87*1b3f573fSAndroid Build Coastguard Worker rm -rv "${CAPLOG_DIR}" 88*1b3f573fSAndroid Build Coastguard Worker exit ${_rc} 89*1b3f573fSAndroid Build Coastguard Worker } 90*1b3f573fSAndroid Build Coastguard Worker trap _caplog_onexit EXIT 91*1b3f573fSAndroid Build Coastguard Worker 92*1b3f573fSAndroid Build Coastguard Workerfi 93