| #!/bin/bash |
| # |
| # Runs the specified chromium patch on the GCE slaves. |
| # |
| # Copyright 2013 Google Inc. All Rights Reserved. |
| # Author: rmistry@google.com (Ravi Mistry) |
| |
| |
| function usage() { |
| cat << EOF |
| |
| usage: $0 options |
| |
| This script runs the specified chromium patch on the GCE slaves. |
| |
| OPTIONS: |
| -h Show this message |
| -p The location of the Chromium patch |
| -t The location of the Blink patch |
| -s The location of the Skia patch |
| -r The unique runid (typically requester + timestamp) |
| -v The variance threshold for comparing the resultant CSV files |
| -o The percentage of outliers to discard when comparing the result CSV files |
| -b The telemetry benchmark to run on this slave |
| -a The extra arguments that the telemetry benchmark needs |
| -e The email address of the requester |
| -i The key of the appengine telemetry task |
| -l The location of the log file |
| -y The pageset type to run against (Eg: 10k/IndexSample10k) |
| -n Number of times to run each pageset |
| -m The target platform to run the telemetry benchmarks on (Android / Linux) |
| -x Browser arguments to specify when running telemetry nopatch run |
| -z Browser arguments to specify when running telemetry withpatch run |
| EOF |
| } |
| |
| while getopts "hp:t:s:r:v:o:b:a:e:i:l:y:n:m:x:z:" OPTION |
| do |
| case $OPTION in |
| h) |
| usage |
| exit 1 |
| ;; |
| p) |
| CHROMIUM_PATCH_LOCATION=$OPTARG |
| ;; |
| t) |
| BLINK_PATCH_LOCATION=$OPTARG |
| ;; |
| s) |
| SKIA_PATCH_LOCATION=$OPTARG |
| ;; |
| r) |
| RUN_ID=$OPTARG |
| ;; |
| v) |
| VARIANCE_THRESHOLD=$OPTARG |
| ;; |
| o) |
| DISCARD_OUTLIERS=$OPTARG |
| ;; |
| b) |
| TELEMETRY_BENCHMARK=$OPTARG |
| ;; |
| a) |
| EXTRA_ARGS=$OPTARG |
| ;; |
| e) |
| REQUESTER_EMAIL=$OPTARG |
| ;; |
| i) |
| APPENGINE_KEY=$OPTARG |
| ;; |
| l) |
| LOG_FILE_LOCATION=$OPTARG |
| ;; |
| y) |
| PAGESET_TYPE=$OPTARG |
| ;; |
| n) |
| REPEAT_TELEMETRY_RUNS=$OPTARG |
| ;; |
| m) |
| TARGET_PLATFORM=$OPTARG |
| ;; |
| x) |
| EXTRA_BROWSER_ARGS_1=$OPTARG |
| ;; |
| z) |
| EXTRA_BROWSER_ARGS_2=$OPTARG |
| ;; |
| ?) |
| usage |
| exit |
| ;; |
| esac |
| done |
| |
| if [[ -z $CHROMIUM_PATCH_LOCATION ]] || [[ -z $BLINK_PATCH_LOCATION ]] || \ |
| [[ -z $VARIANCE_THRESHOLD ]] || [[ -z $DISCARD_OUTLIERS ]] || \ |
| [[ -z $TELEMETRY_BENCHMARK ]] || [[ -z $EXTRA_ARGS ]] || \ |
| [[ -z $REQUESTER_EMAIL ]] || [[ -z $APPENGINE_KEY ]] || \ |
| [[ -z $LOG_FILE_LOCATION ]] || [[ -z $SKIA_PATCH_LOCATION ]] || \ |
| [[ -z $PAGESET_TYPE ]] || [[ -z $TARGET_PLATFORM ]] |
| then |
| usage |
| exit 1 |
| fi |
| |
| source ../config.sh |
| |
| # Update buildbot. |
| for i in {1..3}; do gclient sync && break || sleep 2; done |
| |
| # Copy the patch to Google Storage. |
| PATCHES_GS_LOCATION=gs://chromium-skia-gm/telemetry/tryserver-patches |
| CHROMIUM_PATCH_GS_LOCATION=$PATCHES_GS_LOCATION/$RUN_ID.chromium.patch |
| BLINK_PATCH_GS_LOCATION=$PATCHES_GS_LOCATION/$RUN_ID.blink.patch |
| SKIA_PATCH_GS_LOCATION=$PATCHES_GS_LOCATION/$RUN_ID.skia.patch |
| gsutil cp -a public-read $CHROMIUM_PATCH_LOCATION $CHROMIUM_PATCH_GS_LOCATION |
| gsutil cp -a public-read $BLINK_PATCH_LOCATION $BLINK_PATCH_GS_LOCATION |
| gsutil cp -a public-read $SKIA_PATCH_LOCATION $SKIA_PATCH_GS_LOCATION |
| |
| # If it is a rasterize_and_record_micro benchmark request then use some extra |
| # repeat arguments. |
| if [ "$TELEMETRY_BENCHMARK" == "rasterize_and_record_micro" ]; then |
| EXTRA_ARGS="--rasterize-repeat=200 --record-repeat=200 $EXTRA_ARGS" |
| fi |
| |
| USE_AURA=0 |
| |
| # Create the two required chromium builds (with patch and without the patch). |
| TIMER="$(date +%s)" |
| CHROMIUM_BUILD_LOG_FILE=/tmp/try-chromium-build-$RUN_ID |
| |
| bash vm_build_chromium_with_patches.sh $CHROMIUM_PATCH_LOCATION \ |
| $BLINK_PATCH_LOCATION $SKIA_PATCH_LOCATION $RUN_ID \ |
| $CHROMIUM_BUILD_LOG_FILE $USE_AURA $TARGET_PLATFORM &> $CHROMIUM_BUILD_LOG_FILE |
| ret_value=$? |
| CHROMIUM_BUILDS_TIME="$(($(date +%s)-TIMER))" |
| |
| PATCHES_LINK=https://storage.cloud.google.com/chromium-skia-gm/telemetry/tryserver-patches |
| CHROMIUM_PATCH_LINK=$PATCHES_LINK/$RUN_ID.chromium.patch |
| BLINK_PATCH_LINK=$PATCHES_LINK/$RUN_ID.blink.patch |
| SKIA_PATCH_LINK=$PATCHES_LINK/$RUN_ID.skia.patch |
| TELEMETRY_OUTPUT_1=https://storage.cloud.google.com/chromium-skia-gm/telemetry/benchmarks/$TELEMETRY_BENCHMARK/consolidated-outputs/$RUN_ID-nopatch.output.txt |
| TELEMETRY_OUTPUT_2=https://storage.cloud.google.com/chromium-skia-gm/telemetry/benchmarks/$TELEMETRY_BENCHMARK/consolidated-outputs/$RUN_ID-withpatch.output.txt |
| |
| # Run telemetry benchmarks only if the chromium build succeeded. |
| if [ $ret_value -eq 0 ]; then |
| # Find the chromium build directory using the RUN_ID. |
| GS_BUILD_PATH=`gsutil ls gs://chromium-skia-gm/telemetry/chromium-builds/try*-$RUN_ID\/* | grep $RUN_ID -m 1` |
| CHROMIUM_BUILD_DIR=${GS_BUILD_PATH#*/chromium-builds/} |
| # Strip out the filename at the end. |
| CHROMIUM_BUILD_DIR=${CHROMIUM_BUILD_DIR%/*} |
| if [ "$TARGET_PLATFORM" == "Android" ]; then |
| # Strip out one more layer for Android builds (they have only one apks dir). |
| CHROMIUM_BUILD_DIR=${CHROMIUM_BUILD_DIR%/*} |
| fi |
| |
| # Below may no longer be needed after the move to bare-metal machines. |
| # Reboot all slaves so that they start from a clean slate. |
| bash vm_run_command_on_slaves.sh "sudo reboot" |
| # Sleep for 4 mins for all slaves to come back up. |
| sleep 240 |
| |
| # Run telemetry on the slaves using the specified benchmark. |
| TELEMETRY_BUILD_LOG=/tmp/try-telemetry-nopatch-$RUN_ID |
| TELEMETRY_NOPATCH_ID=$RUN_ID-nopatch |
| TIMER="$(date +%s)" |
| TARGET_PLATFORM=$TARGET_PLATFORM TRYSERVER=true bash vm_run_telemetry_on_slaves.sh $TELEMETRY_BENCHMARK \ |
| "$EXTRA_ARGS" $PAGESET_TYPE $REPEAT_TELEMETRY_RUNS $CHROMIUM_BUILD_DIR $TELEMETRY_NOPATCH_ID \ |
| "$EXTRA_BROWSER_ARGS_1" $REQUESTER_EMAIL $APPENGINE_KEY $TELEMETRY_BUILD_LOG &> $TELEMETRY_BUILD_LOG |
| TELEMETRY_WITHOUT_PATCH_TIME="$(($(date +%s)-TIMER))" |
| |
| # Below may no longer be needed after the move to bare-metal machines. |
| # Reboot all slaves so that they start from a clean slate. |
| bash vm_run_command_on_slaves.sh "sudo reboot" |
| # Sleep for 4 mins for all slaves to come back up. |
| sleep 240 |
| |
| # Run telemetry using the patch build. |
| TELEMETRY_BUILD_LOG=/tmp/try-telemetry-withpatch-$RUN_ID |
| TELEMETRY_WITHPATCH_ID=$RUN_ID-withpatch |
| TIMER="$(date +%s)" |
| TARGET_PLATFORM=$TARGET_PLATFORM TRYSERVER=true bash vm_run_telemetry_on_slaves.sh $TELEMETRY_BENCHMARK \ |
| "$EXTRA_ARGS" $PAGESET_TYPE $REPEAT_TELEMETRY_RUNS $CHROMIUM_BUILD_DIR-withpatch $TELEMETRY_WITHPATCH_ID \ |
| "$EXTRA_BROWSER_ARGS_2" $REQUESTER_EMAIL $APPENGINE_KEY $TELEMETRY_BUILD_LOG &> $TELEMETRY_BUILD_LOG |
| TELEMETRY_WITH_PATCH_TIME="$(($(date +%s)-TIMER))" |
| |
| # Delete the try chromium builds from the slaves so that they do not take up unneeded disk space. |
| bash vm_run_command_on_slaves.sh "rm -rf /b/storage/chromium-builds/try-*" |
| # Make sure there are no left over processes on the slaves. |
| bash vm_run_command_on_slaves.sh "sudo pkill -9 -f chromium-builds" |
| |
| for SLAVE_NUM in $(seq 1 $NUM_SLAVES); do |
| ssh -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o CheckHostIP=no \ |
| -o StrictHostKeyChecking=no \ |
| -A -q -p 22 build${SLAVE_NUM}-m5 -- "uptime" &> /dev/null |
| if [ $? -ne 0 ] |
| then |
| echo "build$SLAVE_NUM-m5 is not responding!" |
| CRASHED_INSTANCES="$CRASHED_INSTANCES build$SLAVE_NUM-m5" |
| fi |
| done |
| if [[ $CRASHED_INSTANCES ]]; then |
| CRASHED_INSTANCES_HTML="<b>Note:</b> The following slaves are down and their results are missing from the report: <b>$CRASHED_INSTANCES</b><br/><br/>" |
| fi |
| |
| if [ "$TARGET_PLATFORM" == "Android" ]; then |
| for SLAVE_NUM in $(seq 1 $NUM_SLAVES); do |
| OFFLINE_DEVICES=`ssh -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o CheckHostIP=no \ |
| -o StrictHostKeyChecking=no \ |
| -A -q -p 22 build${SLAVE_NUM}-m5 -- "adb devices | grep offline"` |
| DISCONNECTED_DEVICES=`ssh -o ConnectTimeout=5 -o UserKnownHostsFile=/dev/null -o CheckHostIP=no \ |
| -o StrictHostKeyChecking=no \ |
| -A -q -p 22 build${SLAVE_NUM}-m5 -- "adb devices | grep device | grep -v devices"` |
| if [ "$OFFLINE_DEVICES" != "" ]; then |
| echo "build$SLAVE_NUM-m5 device is offline!" |
| MISSING_DEVICES="$MISSING_DEVICES build$SLAVE_NUM-m5" |
| elif [ "$DISCONNECTED_DEVICES" == "" ]; then |
| echo "build$SLAVE_NUM-m5 device is missing!" |
| MISSING_DEVICES="$MISSING_DEVICES build$SLAVE_NUM-m5" |
| fi |
| done |
| if [[ $MISSING_DEVICES ]]; then |
| MISSING_DEVICES_HTML="<b>Note:</b> The following slaves are missing android devices and their results are missing from the report: <b>$MISSING_DEVICES</b><br/><br/>" |
| fi |
| fi |
| |
| # Compare the resultant CSV files. |
| NOPATCH_CSV="/b/storage/telemetry_outputs/${TELEMETRY_NOPATCH_ID}/${TELEMETRY_NOPATCH_ID}.$TELEMETRY_BENCHMARK.output" |
| WITHPATCH_CSV="/b/storage/telemetry_outputs/${TELEMETRY_WITHPATCH_ID}/${TELEMETRY_WITHPATCH_ID}.$TELEMETRY_BENCHMARK.output" |
| HTML_OUTPUT_DIR="/tmp/html-$RUN_ID" |
| HTML_OUTPUT_LINK_BASE=https://storage.cloud.google.com/chromium-skia-gm/telemetry/tryserver-outputs/html-outputs/$RUN_ID/ |
| mkdir -p $HTML_OUTPUT_DIR |
| cd .. |
| python csv_comparer.py --csv_file1=$NOPATCH_CSV --csv_file2=$WITHPATCH_CSV --output_html=$HTML_OUTPUT_DIR --variance_threshold=$VARIANCE_THRESHOLD --discard_outliers=$DISCARD_OUTLIERS --absolute_url=$HTML_OUTPUT_LINK_BASE --requester_email=$REQUESTER_EMAIL --chromium_patch_link=$CHROMIUM_PATCH_LINK --blink_patch_link=$BLINK_PATCH_LINK --skia_patch_link=$SKIA_PATCH_LINK --raw_csv_nopatch=$TELEMETRY_OUTPUT_1 --raw_csv_withpatch=$TELEMETRY_OUTPUT_2 --num_repeated=$REPEAT_TELEMETRY_RUNS --target_platform=$TARGET_PLATFORM --crashed_instances="$CRASHED_INSTANCES" --missing_devices="$MISSING_DEVICES" --browser_args_nopatch="$EXTRA_BROWSER_ARGS_1" --browser_args_withpatch="$EXTRA_BROWSER_ARGS_2" --pageset_type=$PAGESET_TYPE |
| |
| # Copy the HTML files to Google Storage. |
| gsutil -m cp -a public-read $HTML_OUTPUT_DIR/*.html gs://chromium-skia-gm/telemetry/tryserver-outputs/html-outputs/$RUN_ID/ |
| else |
| TELEMETRY_WITHOUT_PATCH_TIME=0 |
| TELEMETRY_WITH_PATCH_TIME=0 |
| # Create a dummy link when there are failures. |
| HTML_OUTPUT_LINK_BASE='http://google.com/' |
| fi |
| |
| # Email the requester. |
| HTML_OUTPUT_LINK=${HTML_OUTPUT_LINK_BASE}index.html |
| CHROMIUM_BUILD_LOG_LINK=https://storage.cloud.google.com/chromium-skia-gm/telemetry/tryserver-outputs/build-logs/$RUN_ID-chromium.txt |
| SLAVE_1_LOG_LINK=https://storage.cloud.google.com/chromium-skia-gm/telemetry/benchmarks/$TELEMETRY_BENCHMARK/slave1/logs/$RUN_ID-withpatch.log |
| |
| BOUNDARY=`date +%s|md5sum` |
| BOUNDARY=${BOUNDARY:0:32} |
| sendmail $REQUESTER_EMAIL,$ADMIN_EMAIL <<EOF |
| subject:Your Cluster Telemetry trybot run has completed! ($RUN_ID) |
| to:$REQUESTER_EMAIL,$ADMIN_EMAIL |
| Content-Type: multipart/mixed; boundary=\"$BOUNDARY\"; |
| |
| This is a MIME-encapsulated message |
| |
| --$BOUNDARY |
| Content-Type: text/html |
| |
| <html> |
| <head/> |
| <body> |
| |
| The HTML output with differences between the base run and the patch run is <a href='$HTML_OUTPUT_LINK'>here</a>.<br/> |
| The patch(es) you specified are here: |
| <a href='$CHROMIUM_PATCH_LINK'>chromium</a>/<a href='$BLINK_PATCH_LINK'>blink</a>/<a href='$SKIA_PATCH_LINK'>skia</a> |
| <br/><br/> |
| |
| <table border="1" cellpadding="5"> |
| <tr> |
| <th>Task</th> |
| <th>Time Taken</th> |
| <th>Log</th> |
| </tr> |
| <tr> |
| <td>Chromium Builds (with and without patch)</td> |
| <td>$CHROMIUM_BUILDS_TIME secs</td> |
| <td><a href='$CHROMIUM_BUILD_LOG_LINK'>log</a></td> |
| </tr> |
| <tr> |
| <td>Telemetry run without patch</td> |
| <td>$TELEMETRY_WITHOUT_PATCH_TIME secs</td> |
| <td><a href='$TELEMETRY_OUTPUT_1'>log</a></td> |
| </tr> |
| <tr> |
| <td>Telemetry run with patch</td> |
| <td>$TELEMETRY_WITH_PATCH_TIME secs</td> |
| <td><a href='$TELEMETRY_OUTPUT_2'>log</a></td> |
| </tr> |
| </table><br/><br/> |
| |
| $CRASHED_INSTANCES_HTML |
| $MISSING_DEVICES_HTML |
| The log file of the first slave is <a href='$SLAVE_1_LOG_LINK'>here</a>.<br/> |
| You can schedule more runs <a href='https://skia-tree-status.appspot.com/skia-telemetry/chromium_try'>here</a>.<br/><br/> |
| Thanks! |
| </body> |
| </html> |
| |
| --$BOUNDARY-- |
| |
| EOF |
| |
| # Mark this task as completed on AppEngine. |
| PASSWORD=`cat /b/skia-repo/buildbot/cluster_telemetry/telemetry_master_scripts/appengine_password.txt` |
| for i in {1..10}; do wget --post-data "key=$APPENGINE_KEY&chromium_patch_link=$CHROMIUM_PATCH_LINK&blink_patch_link=$BLINK_PATCH_LINK&skia_patch_link=$SKIA_PATCH_LINK&build_log_link=$CHROMIUM_BUILD_LOG_LINK&telemetry_nopatch_log_link=$TELEMETRY_OUTPUT_1&telemetry_withpatch_log_link=$TELEMETRY_OUTPUT_2&html_output_link=$HTML_OUTPUT_LINK&password=$PASSWORD" "https://skia-tree-status.appspot.com/skia-telemetry/update_chromium_try_tasks" -O /dev/null && break || sleep 2; done |
| |
| # Copy log file to Google Storage. |
| gsutil cp -a public-read $LOG_FILE_LOCATION gs://chromium-skia-gm/telemetry/tryserver-logs/ |
| |
| # Delete all tmp files. |
| rm -rf /tmp/*${RUN_ID}* |
| rm -rf /b/storage/telemetry_outputs/${RUN_ID}* |
| |