223 lines
7.2 KiB
Bash
Executable File
223 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Copyright 2021 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
#
|
|
# This is a generic ChromeOS package/image test setup script. It is meant to
|
|
# be used for either the object file or package bisection tools. This script
|
|
# does one of the following depending on what ${BISECT_MODE} is set to:
|
|
#
|
|
# 1) ${BISECT_MODE} is PACKAGE_MODE:
|
|
# build_image is called and generates a new ChromeOS image using whatever
|
|
# packages are currently in the build tree. This image is then pushed to the
|
|
# remote machine using flash over ethernet (or usb flash if ethernet flash
|
|
# fails).
|
|
#
|
|
# 2) ${BISECT_MODE} is OBJECT_MODE:
|
|
# emerge is called for ${BISECT_PACKAGE} and generates a build for said
|
|
# package. This package is then deployed to the remote machine and the machine
|
|
# is rebooted. If deploying fails then a new ChromeOS image is built from
|
|
# scratch and pushed to the machine like in PACKAGE_MODE.
|
|
#
|
|
# This script is intended to be used by binary_search_state.py, as
|
|
# part of the binary search triage on ChromeOS objects and packages. It should
|
|
# return '0' if the setup succeeds; and '1' if the setup fails (the image
|
|
# could not build or be flashed).
|
|
#
|
|
|
|
export PYTHONUNBUFFERED=1
|
|
|
|
source common/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
|
|
}
|
|
|
|
echo
|
|
echo "INSTALLATION BEGIN"
|
|
echo
|
|
|
|
if [[ "${BISECT_MODE}" == "OBJECT_MODE" ]]; then
|
|
echo "EMERGING ${BISECT_PACKAGE}"
|
|
set -x
|
|
sudo rm -rf /build/${BISECT_BOARD}/var/cache/portage/*
|
|
sudo rm -rf /build/${BISECT_BOARD}/tmp/portage/${BISECT_PACKAGE}*
|
|
set +x
|
|
if [[ ${BISECT_PACKAGE} == *chromeos-chrome ]]; then
|
|
if [[ ${BISECT_USE_FLAGS} == *chrome_internal* && \
|
|
${BISECT_USE_FLAGS} != *-chrome_internal* ]]; then
|
|
# for the pre-upload check of the length of lines
|
|
chrome_build_dir="/var/cache/chromeos-chrome/chrome-src-internal/src/"
|
|
chrome_build_dir+="out_${BISECT_BOARD}"
|
|
else
|
|
# for the pre-upload check of the length of lines
|
|
chrome_build_dir="/var/cache/chromeos-chrome/chrome-src/src/"
|
|
chrome_build_dir+="out_${BISECT_BOARD}"
|
|
fi
|
|
set -x
|
|
sudo rm -rf ${chrome_build_dir}
|
|
set +x
|
|
fi
|
|
set -x
|
|
CLEAN_DELAY=0 emerge-${BISECT_BOARD} -C ${BISECT_PACKAGE}
|
|
USE="${BISECT_USE_FLAGS}" emerge-${BISECT_BOARD} ${BISECT_PACKAGE}
|
|
set +x
|
|
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 TO ${BISECT_REMOTE}"
|
|
|
|
if [[ ${BISECT_PACKAGE} == *chromeos-kernel-* ]]; then
|
|
cmd="/mnt/host/source/src/scripts/update_kernel.sh --board=${BISECT_BOARD} --remote=${BISECT_REMOTE}"
|
|
if [[ ${BISECT_REMOTE} == *:* ]]; then
|
|
IP=$(echo $1 | cut -d ":" -f1)
|
|
PORT=$(echo $1 | cut -d ":" -f2)
|
|
cmd="/mnt/host/source/src/scripts/update_kernel.sh --board=${BISECT_BOARD} --remote=${IP} --ssh_port=${PORT}"
|
|
fi
|
|
if [[ ${BISECT_REBOOT_OPTION} == false ]]; then
|
|
cmd+=" --noreboot"
|
|
fi
|
|
set -x
|
|
# exec the command to make sure it always exit after
|
|
exec $cmd
|
|
set +x
|
|
fi
|
|
|
|
if [[ ${BISECT_PACKAGE} == *chromeos-chrome ]]; then
|
|
# deploy_chrome needs to run inside chrome source tree
|
|
pushd ~/chrome_root
|
|
set -x
|
|
deploy_chrome --force --build-dir=${chrome_build_dir}/Release \
|
|
--device=${BISECT_REMOTE}
|
|
set +x
|
|
popd
|
|
else
|
|
set -x
|
|
cros deploy ${BISECT_REMOTE} ${BISECT_PACKAGE} --log-level=info
|
|
set +x
|
|
fi
|
|
deploy_status=$?
|
|
|
|
if [[ ${BISECT_REBOOT_OPTION} == false ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
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
|
|
fi
|
|
|
|
echo "BUILDING IMAGE"
|
|
pushd ~/trunk/src/scripts
|
|
USE="${BISECT_USE_FLAGS}" ./build_image test --board=${BISECT_BOARD} \
|
|
--noenable_rootfs_verification --noeclean
|
|
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"
|
|
echo "4. Abort this installation and mark test as failed"
|
|
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 125;;
|
|
4) exit 1;;
|
|
*) echo "Please answer 1, 2, 3, or 4.";;
|
|
esac
|
|
done
|
|
|
|
cros_flash_status=$?
|
|
done
|
|
else
|
|
echo "build_image returned a non-zero status: ${build_status}"
|
|
exit 1
|
|
fi
|
|
|
|
exit 0
|