blob: 3c716675cf35df816e6c7bc10da6f4fce2a5bef6 [file] [log] [blame]
#!/bin/bash
# Run the checkin tests for mod_pagespeed. These help ensure the build won't
# break.
#
# Extra parmeters are passed to make. For example, pass V=1 to get verbose
# gyp builds.
#
# We don't clean by default in checkin tests. That makes checkin tests take way
# too long, especially when re-running after a failure. This adds risk because
# someone might break the build by checking in a dependence on a file that
# cannot be regenerated, but that risk seems low compared with the cost of total
# rebuilds.
echo Starting tests at time `date`
# Don't leave processes hanging around on exit. "jobs -p" gives all background
# processes.
trap 'kill $(jobs -p)' SIGINT SIGTERM EXIT
APACHE_DEBUG_ROOT="$HOME/apache2"
FAIL=
if [ ! -d "$APACHE_DEBUG_ROOT" ]; then
echo "You must install a local Apache before running checkin tests, e.g."
echo " install/build_development_apache.sh 2.2 prefork"
FAIL=true
fi
required_binaries="autoconf g++ gperf libtool valgrind memcached redis-server"
missing=""
for bin in $required_binaries; do
which $bin >/dev/null || missing="$missing $bin"
done
if [ "$missing" != "" ]; then
echo You are missing required packages $missing. Type:
echo sudo apt-get install $missing
FAIL=true
fi
if ! locale -a | grep -q tr_TR.utf8; then
echo "You are missing language-pack-tr-base. Type:"
echo "sudo apt-get install language-pack-tr-base"
FAIL=true
fi
if [ ! -f /usr/bin/php5-cgi ]; then
echo "You are missing php5. Type:"
echo "sudo apt-get install php5-cgi"
FAIL=true
fi
if [ ! -f $APACHE_DEBUG_ROOT/modules/mod_fcgid-src_build.so ]; then
echo "You are missing source build of fcgid. Please re-run "
echo "build_development_apache.sh"
FAIL=true
fi
this_dir=$(dirname "${BASH_SOURCE[0]}")
cd "$this_dir"
tests_missing=$(./check_tests_are_run.sh)
if [ ! -z "$tests_missing" ]; then
echo "$tests_missing"
FAIL=true
fi
if [ -n "$FAIL" ]; then
echo "***" Please correct above errors and try again.
exit 1
fi
export OBJDIR=/tmp/instaweb.$$
make_log=/tmp/checkin.make.$$
blaze_log=/tmp/checkin.blaze.$$
function kill_subprocesses() {
echo "^C caught by $0, killing jobs..."
kill -INT $(jobs -p)
# Make is resilient to kills, partially due to our recursive make calls.
# Also we need to be wary of other 'make' processes on the system for
# different clients, but we always use OBJDIR=$OBJDIR on the command-line for
# our recursive makes. So keep finding them and killing them until they are
# all dead dead dead.
continue=1
while [ $continue -eq 1 ];
do
# TODO(jmarantz): jmaessen suggests: How about
# processes=$(ps auxw | awk "/[m]ake OBJDIR=$OBJDIR/{ print \$2 }")
# This would be more silent. But I'm inclined to leave it noisy for
# now until we are confident it's working well.
ps auxw | grep "make OBJDIR=$OBJDIR" | grep -v grep
if [ $? -eq 0 ]; then
processes=$(ps auxw|grep "make OBJDIR=$OBJDIR"|awk '{ print $2 }')
kill -TERM $processes
sleep 5
else
# All done. Let the 'checkin' script itself exit.
continue=0
fi
done
}
trap '{ kill_subprocesses; exit 1; }' INT
echo "$this_dir/checkin.make $* &> $make_log &"
rm -f "$make_log"
touch "$make_log"
echo $PWD
# TODO(jefftk): combine checkin and checkin.make
./checkin.make "$@" &> "$make_log" &
make_pid=$!
# Show make's output as it runs...
tail -f $make_log &
exit_status=0
# Wait for make to finish.
wait $make_pid
MAKE_STATUS="$?"
if [ "$MAKE_STATUS" = "0" ]; then
echo checkin.make Passed.
rm "$make_log"
else
echo "*** checkin.make failed: check $make_log for details. Last 4 lines:"
tail -n 4 "$make_log"
exit_status=1
fi
echo Exiting checkin at "$(date)" with status "$exit_status"
exit $exit_status