xref: /aosp_15_r20/external/protobuf/kokoro/caplog.sh (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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