aboutsummaryrefslogtreecommitdiff
path: root/binary_search_tool/sysroot_wrapper
diff options
context:
space:
mode:
authorCassidy Burden <cburden@google.com>2016-06-29 13:51:20 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-06-30 14:21:46 -0700
commitd5113fb3bb67fc27f6fdc04e757e7a4b65e2a5f4 (patch)
treed962dd23d137d73cfdc189b33fe27eb60cdd5e61 /binary_search_tool/sysroot_wrapper
parentcaf9d96c94a914866c4cb9dfe401dfcee02c6047 (diff)
downloadtoolchain-utils-d5113fb3bb67fc27f6fdc04e757e7a4b65e2a5f4.tar.gz
binary search tool: Add object bisecting to bisect.py
Add object file bisecting to bisect.py. This is the frontend to the sysroot_wrapper bisection scripts. This bisection mode takes the following arguments: board, remote IP, package to bisect, and optionally the directory for the good/bad build trees. Adds default install/test scripts to sysroot_wrapper (similar to default scripts in cros_pkg) to support this bisection mode. TEST=Run unit tests and system test with cryptohome package CQ-DEPEND=CL:*267995 Change-Id: I1e9166b753f78ca7bdcf6ddbd056af62bc03923b Reviewed-on: https://chrome-internal-review.googlesource.com/268035 Commit-Ready: Cassidy Burden <cburden@google.com> Tested-by: Cassidy Burden <cburden@google.com> Reviewed-by: Caroline Tice <cmtice@google.com>
Diffstat (limited to 'binary_search_tool/sysroot_wrapper')
-rwxr-xr-xbinary_search_tool/sysroot_wrapper/boot_test.sh22
-rwxr-xr-xbinary_search_tool/sysroot_wrapper/install.sh160
-rwxr-xr-xbinary_search_tool/sysroot_wrapper/interactive_test.sh37
3 files changed, 219 insertions, 0 deletions
diff --git a/binary_search_tool/sysroot_wrapper/boot_test.sh b/binary_search_tool/sysroot_wrapper/boot_test.sh
new file mode 100755
index 00000000..a3de2dec
--- /dev/null
+++ b/binary_search_tool/sysroot_wrapper/boot_test.sh
@@ -0,0 +1,22 @@
+#!/bin/bash -u
+#
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# This script pings the chromebook to determine if it has successfully booted.
+#
+# This script is intended to be used by binary_search_state.py, as
+# part of the binary search triage on ChromeOS object files. It waits for the
+# install script to build and install the image, then pings the machine.
+# It should return '0' if the test succeeds (the image booted); '1' if the test
+# fails (the image did not boot); and '2' if it could not determine (does not
+# apply in this case).
+#
+
+source sysroot_wrapper/common.sh
+
+# Send 3 pings and wait 3 seconds for any responsed (then timeout).
+ping -c 3 -W 3 ${BISECT_REMOTE}
+retval=$?
+
+
+exit $retval
diff --git a/binary_search_tool/sysroot_wrapper/install.sh b/binary_search_tool/sysroot_wrapper/install.sh
new file mode 100755
index 00000000..7cf62168
--- /dev/null
+++ b/binary_search_tool/sysroot_wrapper/install.sh
@@ -0,0 +1,160 @@
+#!/bin/bash
+#
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# This script calls build_image to generate a new ChromeOS image,
+# using whatever packages are currently in the build tree. If
+# build_images succeeeds, then it pushes the new ChromeOS image onto a
+# chromebook. If pushing the ChromeOS image onto the chromebook fails it
+# will walk the user through troubleshooting the problem.
+#
+# This script is intended to be used by binary_search_state.py, as
+# part of the binary search triage on ChromeOS objects. It should return '0'
+# if the install succeeds; and '1' if the install fails (the image could not
+# build or be flashed).
+#
+# This script requires $BISECT_BOARD, $BISECT_REMOTE, and $BISECT_PACKAGE to be
+# set. If they are not set the script will exit.
+#
+
+export PYTHONUNBUFFERED=1
+
+source sysroot_wrapper/common.sh
+
+usb_flash()
+{
+ echo
+ echo "Insert a usb stick into the current machine"
+ echo "Note: The cros flash will take time and doesn't give much output."
+ echo " Be patient. If your usb access light is flashing it's working."
+ sleep 1
+ read -p "Press enter to continue" notused
+
+ cros flash --board=${BISECT_BOARD} --clobber-stateful usb:// ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin
+
+ echo
+ echo "Flash to usb complete!"
+ echo "Plug the usb into your chromebook and install the image."
+ echo "Refer to the ChromiumOS Developer's Handbook for more details."
+ echo "http://www.chromium.org/chromium-os/developer-guide#TOC-Boot-from-your-USB-disk"
+ while true; do
+ sleep 1
+ read -p "Was the installation of the image successful? " choice
+ case $choice in
+ [Yy]*) return 0;;
+ [Nn]*) return 1;;
+ *) echo "Please answer y or n.";;
+ esac
+ done
+}
+
+ethernet_flash()
+{
+ echo
+ echo "Please ensure your Chromebook is up and running Chrome so"
+ echo "cros flash may run."
+ echo "If your Chromebook has a broken image you can try:"
+ echo "1. Rebooting your Chromebook 6 times to install the last working image"
+ echo "2. Alternatively, running the following command on the Chromebook"
+ echo " will also rollback to the last working image:"
+ echo " 'update_engine_client --rollback --nopowerwash --reboot'"
+ echo "3. Flashing a new image through USB"
+ echo
+ sleep 1
+ read -p $'Press enter to continue and retry the ethernet flash' notused
+ cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin
+}
+
+reboot()
+{
+ ret_val=0
+ pushd ~/trunk/src/scripts > /dev/null
+ set -- --remote=${BISECT_REMOTE}
+ . ./common.sh || ret_val=1
+ . ./remote_access.sh || ret_val=1
+ TMP=$(mktemp -d)
+ FLAGS "$@" || ret_val=1
+ remote_access_init || ret_val=1
+ remote_reboot || ret_val=1
+ popd > /dev/null
+
+ return $ret_val
+}
+
+if [[ -z "${BISECT_BOARD}" || -z "${BISECT_REMOTE}" || -z "${BISECT_PACKAGE}" ]]
+then
+ echo "ERROR: Environment variables not properly setup. Please ensure that "
+ echo "\$BISECT_BOARD, \$BISECT_REMOTE, and \$BISECT_PACKAGE are set"
+ exit 3
+fi
+
+echo
+echo "INSTALLATION BEGIN"
+echo
+echo "EMERGING ${BISECT_PACKAGE}"
+CLEAN_DELAY=0 emerge-${BISECT_BOARD} -C ${BISECT_PACKAGE}
+emerge-${BISECT_BOARD} ${BISECT_PACKAGE}
+emerge_status=$?
+
+if [[ ${emerge_status} -ne 0 ]] ; then
+ echo "emerging ${BISECT_PACKAGE} returned a non-zero status: $emerge_status"
+ exit 1
+fi
+
+echo
+echo "DEPLOYING"
+echo "cros deploy ${BISECT_REMOTE} ${BISECT_PACKAGE}"
+cros deploy ${BISECT_REMOTE} ${BISECT_PACKAGE} --log-level=info
+deploy_status=$?
+
+if [[ ${deploy_status} -eq 0 ]] ; then
+ echo "Deploy successful. Rebooting device..."
+ reboot
+ if [[ $? -ne 0 ]] ; then
+ echo
+ echo "Could not automatically reboot device!"
+ read -p "Please manually reboot device and press enter to continue" notused
+ fi
+ exit 0
+fi
+
+echo "Deploy failed! Trying build_image/cros flash instead..."
+echo
+echo "BUILDING IMAGE"
+pushd ~/trunk/src/scripts
+./build_image test --board=${BISECT_BOARD} --noenable_rootfs_verification
+build_status=$?
+popd
+
+if [[ ${build_status} -eq 0 ]] ; then
+ echo
+ echo "FLASHING"
+ echo "Pushing built image onto device."
+ echo "cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin"
+ cros flash --board=${BISECT_BOARD} --clobber-stateful ${BISECT_REMOTE} ~/trunk/src/build/images/${BISECT_BOARD}/latest/chromiumos_test_image.bin
+ cros_flash_status=$?
+ while [[ ${cros_flash_status} -ne 0 ]] ; do
+ while true; do
+ echo
+ echo "cros flash has failed! From here you can:"
+ echo "1. Flash through USB"
+ echo "2. Retry flashing over ethernet"
+ echo "3. Abort this installation and skip this image"
+ sleep 1
+ read -p "Which method would you like to do? " choice
+ case $choice in
+ 1) usb_flash && break;;
+ 2) ethernet_flash && break;;
+ 3) exit 1;;
+ *) echo "Please answer 1, 2, or 3.";;
+ esac
+ done
+
+ cros_flash_status=$?
+ done
+else
+ echo "build_image returned a non-zero status: ${build_status}"
+ exit 1
+fi
+
+exit 0
diff --git a/binary_search_tool/sysroot_wrapper/interactive_test.sh b/binary_search_tool/sysroot_wrapper/interactive_test.sh
new file mode 100755
index 00000000..1b5b7e19
--- /dev/null
+++ b/binary_search_tool/sysroot_wrapper/interactive_test.sh
@@ -0,0 +1,37 @@
+#!/bin/bash -u
+#
+# Copyright 2016 Google Inc. All Rights Reserved.
+#
+# This script pings the chromebook to determine if it successfully booted.
+# It then asks the user if the image is good or not, allowing the user to
+# conduct whatever tests the user wishes, and waiting for a response.
+#
+# This script is intended to be used by binary_search_state.py, as
+# part of the binary search triage on ChromeOS object files. It waits for the
+# install script to build and install the image, then asks the user if the
+# image is good or not. It should return '0' if the test succeeds (the image
+# is 'good'); '1' if the test fails (the image is 'bad'); and '2' if it could
+# not determine (does not apply in this case).
+#
+
+source cros_pkg/common.sh
+
+ping -c 3 -W 3 ${BISECT_REMOTE}
+retval=$?
+
+if [[ ${retval} -eq 0 ]]; then
+ echo "ChromeOS image has been built and installed on ${BISECT_REMOTE}."
+else
+ exit 1
+fi
+
+while true; do
+ read -p "Is this a good ChromeOS image?" yn
+ case $yn in
+ [Yy]* ) exit 0;;
+ [Nn]* ) exit 1;;
+ * ) echo "Please answer yes or no.";;
+ esac
+done
+
+exit 2