| #! /bin/bash |
| |
| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| #-------------------------------------------------------------------- |
| |
| # Run from Travis which has no good way to attach logs to a |
| # build. Instead, we check if any IT failed. If so, we append |
| # the last 100 lines of each server log to stdout. We have to |
| # stay wihtin the 4MB limit which Travis applies, so we only |
| # emit logs for the first failure, and only for servers that |
| # don't report normal completion. |
| # |
| # The only good way to check for test failures is to parse |
| # the Failsafe summary for each test located in |
| # <project>/target/failsafe-reports/failsafe-summary.xml |
| # |
| # This directory has many subdirectories, some of which are |
| # tests. We rely on the fact that a test starts with "it-" AND |
| # contains a failsafe report. (Some projects start with "it-" |
| # but are not tests.) |
| |
| # Run in the docker-tests directory |
| cd $(dirname $0) |
| |
| # Scan for candidate projects |
| for PROJECT in it-* |
| do |
| # Check if a failsafe report exists. It will exist if the directory is |
| # a test project and failsafe ran on that directory. |
| REPORTS="$PROJECT/target/failsafe-reports/failsafe-summary.xml" |
| if [ -f "$REPORTS" ] |
| then |
| # OK, so Bash isn't the world's best text processing language... |
| ERRS=1 |
| FAILS=1 |
| while IFS= read -r line |
| do |
| if [ "$line" = " <errors>0</errors>" ] |
| then |
| ERRS=0 |
| fi |
| if [ "$line" = " <failures>0</failures>" ] |
| then |
| FAILS=0 |
| fi |
| done < "$REPORTS" |
| if [ $ERRS -eq 1 -o $FAILS -eq 1 ] |
| then |
| FOUND_LOGS=0 |
| echo "======= $PROJECT Failed ==========" |
| # All logs except zookeeper |
| for log in $(ls $PROJECT/target/shared/logs/[a-y]*.log) |
| do |
| # We assume that a successful exit includes a line with the |
| # following: |
| # Stopping lifecycle [module] stage [INIT] |
| tail -5 "$log" | grep -Fq 'Stopping lifecycle [module] stage [INIT]' |
| if [ $? -ne 0 ] |
| then |
| # Assume failure and report tail |
| echo $(basename $log) "logtail ========================" |
| tail -100 "$log" |
| FOUND_LOGS=1 |
| fi |
| done |
| |
| # Only emit the first failure to avoid output bloat |
| if [ $FOUND_LOGS -eq 1 ] |
| then |
| exit 0 |
| else |
| echo "All Druid services exited normally." |
| fi |
| fi |
| fi |
| done |