Josh Haberman | 57be1d7 | 2016-02-18 14:55:00 -0800 | [diff] [blame] | 1 | #!/bin/bash |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 2 | # |
| 3 | # This is the script that runs inside Docker, once the image has been built, |
| 4 | # to execute all tests for the "pull request" project. |
Josh Haberman | 57be1d7 | 2016-02-18 14:55:00 -0800 | [diff] [blame] | 5 | |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 6 | WORKSPACE_BASE=`pwd` |
Josh Haberman | 57be1d7 | 2016-02-18 14:55:00 -0800 | [diff] [blame] | 7 | MY_DIR="$(dirname "$0")" |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 8 | TEST_SCRIPT=$MY_DIR/../tests.sh |
Josh Haberman | 57be1d7 | 2016-02-18 14:55:00 -0800 | [diff] [blame] | 9 | BUILD_DIR=/tmp/protobuf |
| 10 | |
Josh Haberman | 0b931bc | 2016-02-19 12:33:17 -0800 | [diff] [blame] | 11 | set -e # exit immediately on error |
Josh Haberman | 738393b | 2016-02-18 20:10:23 -0800 | [diff] [blame] | 12 | set -x # display all commands |
| 13 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 14 | # The protobuf repository is mounted into our Docker image, but read-only. |
| 15 | # We clone into a directory inside Docker (this is faster than cp). |
Josh Haberman | 57be1d7 | 2016-02-18 14:55:00 -0800 | [diff] [blame] | 16 | rm -rf $BUILD_DIR |
| 17 | mkdir -p $BUILD_DIR |
| 18 | cd $BUILD_DIR |
| 19 | git clone /var/local/jenkins/protobuf |
| 20 | cd protobuf |
Josh Haberman | d33e93b | 2016-02-18 19:13:07 -0800 | [diff] [blame] | 21 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 22 | # Set up the directory where our test output is going to go. |
Josh Haberman | 0b931bc | 2016-02-19 12:33:17 -0800 | [diff] [blame] | 23 | OUTPUT_DIR=`mktemp -d` |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 24 | LOG_OUTPUT_DIR=$OUTPUT_DIR/logs |
| 25 | mkdir -p $LOG_OUTPUT_DIR/1/cpp |
Josh Haberman | 738393b | 2016-02-18 20:10:23 -0800 | [diff] [blame] | 26 | |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 27 | ################################################################################ |
Josh Haberman | 0b931bc | 2016-02-19 12:33:17 -0800 | [diff] [blame] | 28 | # cpp build needs to run first, non-parallelized, so that protoc is available |
| 29 | # for other builds. |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 30 | |
| 31 | # Output filenames to follow the overall scheme used by parallel, ie: |
| 32 | # $DIR/logs/1/cpp/stdout |
| 33 | # $DIR/logs/1/cpp/stderr |
| 34 | # $DIR/logs/1/csharp/stdout |
| 35 | # $DIR/logs/1/csharp/stderr |
| 36 | # $DIR/logs/1/java_jdk7/stdout |
| 37 | # $DIR/logs/1/java_jdk7/stderr |
| 38 | CPP_STDOUT=$LOG_OUTPUT_DIR/1/cpp/stdout |
| 39 | CPP_STDERR=$LOG_OUTPUT_DIR/1/cpp/stderr |
Josh Haberman | 2bda98f | 2016-03-03 17:04:36 -0800 | [diff] [blame] | 40 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 41 | # Time the C++ build, so we can put this info in the test output. |
Josh Haberman | 2bda98f | 2016-03-03 17:04:36 -0800 | [diff] [blame] | 42 | # It's important that we get /usr/bin/time (which supports -f and -o) and not |
| 43 | # the bash builtin "time" which doesn't. |
| 44 | TIME_CMD="/usr/bin/time -f %e -o $LOG_OUTPUT_DIR/1/cpp/build_time" |
| 45 | |
| 46 | $TIME_CMD $TEST_SCRIPT cpp > >(tee $CPP_STDOUT) 2> >(tee $CPP_STDERR >&2) |
Josh Haberman | 0b931bc | 2016-02-19 12:33:17 -0800 | [diff] [blame] | 47 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 48 | # Other tests are run in parallel. |
Josh Haberman | 0b931bc | 2016-02-19 12:33:17 -0800 | [diff] [blame] | 49 | |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 50 | parallel --results $LOG_OUTPUT_DIR --joblog $OUTPUT_DIR/joblog $TEST_SCRIPT ::: \ |
Josh Haberman | ffc8118 | 2016-02-22 15:39:29 -0800 | [diff] [blame] | 51 | csharp \ |
Josh Haberman | 483533d | 2016-02-19 12:48:33 -0800 | [diff] [blame] | 52 | java_jdk7 \ |
| 53 | javanano_jdk7 \ |
Josh Haberman | ffc8118 | 2016-02-22 15:39:29 -0800 | [diff] [blame] | 54 | java_oracle7 \ |
| 55 | javanano_oracle7 \ |
Josh Haberman | 483533d | 2016-02-19 12:48:33 -0800 | [diff] [blame] | 56 | python \ |
Josh Haberman | ffc8118 | 2016-02-22 15:39:29 -0800 | [diff] [blame] | 57 | python_cpp \ |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 58 | ruby21 \ |
| 59 | || true # Process test results even if tests fail. |
Josh Haberman | 483533d | 2016-02-19 12:48:33 -0800 | [diff] [blame] | 60 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 61 | cat $OUTPUT_DIR/joblog |
| 62 | |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 63 | # The directory that is copied from Docker back into the Jenkins workspace. |
| 64 | COPY_FROM_DOCKER=/var/local/git/protobuf/testoutput |
| 65 | mkdir -p $COPY_FROM_DOCKER |
| 66 | TESTOUTPUT_XML_FILE=$COPY_FROM_DOCKER/testresults.xml |
| 67 | |
Josh Haberman | 67c727c | 2016-03-04 14:21:18 -0800 | [diff] [blame] | 68 | # Process all the output files from "parallel" and package them into a single |
| 69 | # .xml file with detailed, broken-down test output. |
| 70 | python $MY_DIR/make_test_output.py $OUTPUT_DIR > $TESTOUTPUT_XML_FILE |
Josh Haberman | 38bc155 | 2016-02-23 14:28:02 -0800 | [diff] [blame] | 71 | |
| 72 | ls -l $TESTOUTPUT_XML_FILE |