#!/bin/bash # Copyright (c) 2010 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. # Script to sync your checkout, build a Chromium OS image, and test it all # with one command. Can also check out a new Chromium OS checkout and # perform a subset of the above operations. # # Here are some example runs: # # sync_build_test.sh # syncs, recreates local repo and chroot, builds, and masters an # image in the checkout based on your current directory, or if you # are not in a checkout, based on the top level directory the script # is run from. # # sync_build_test.sh --image_to_usb=/dev/sdb -i # same as above but then images USB device /dev/sdb with the image. # Also prompt the user in advance of the steps we'll take to make # sure they agrees. # # sync_build_test.sh --top=~/foo --nosync --remote 192.168.1.2 # builds and masters an image in ~/foo, and live updates the machine # at 192.168.1.2 with that image. # # sync_build_test.sh --top=~/newdir --test "Pam BootPerfServer" \ # --remote=192.168.1.2 # creates a new checkout in ~/newdir, builds and masters an image # which is live updated to 192.168.1.2 and then runs # two tests (Pam and BootPerfServer) against that machine. # # sync_build_test.sh --grab_buildbot=LATEST --test Pam --remote=192.168.1.2 # grabs the latest build from the buildbot, properly modifies it, # reimages 192.168.1.2, and runs the given test on it. # # Environment variables that may be useful: # BUILDBOT_URI - default value for --buildbot_uri # CHROMIUM_REPO - default value for --repo # CHRONOS_PASSWD - default value for --chronos_passwd # # --- BEGIN COMMON.SH BOILERPLATE --- # Load common CrOS utilities. Inside the chroot this file is installed in # /usr/lib/crosutils. Outside the chroot we find it relative to the script's # location. find_common_sh() { local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")")) local path SCRIPT_ROOT= for path in "${common_paths[@]}"; do if [ -r "${path}/common.sh" ]; then SCRIPT_ROOT=${path} break fi done } find_common_sh . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1) # --- END COMMON.SH BOILERPLATE --- . "${SCRIPT_ROOT}/remote_access.sh" DEFINE_string board "" "Board setting" DEFINE_boolean build ${FLAGS_TRUE} \ "Build all code (but not necessarily master image)" DEFINE_boolean build_autotest ${FLAGS_FALSE} "Build autotest" DEFINE_string buildbot_uri "${BUILDBOT_URI}" \ "Base URI to buildbot build location which contains LATEST file" DEFINE_string chrome_gold ${FLAGS_TRUE} \ "Build Chrome using gold if it is installed and supported." DEFINE_string chrome_root "" \ "The root of your chrome browser source. Should contain a 'src' subdir. \ If this is set, chrome browser will be built from source." DEFINE_string chronos_passwd "${CHRONOS_PASSWD}" \ "Use this as the chronos user passwd (defaults to \$CHRONOS_PASSWD)" DEFINE_string chroot "" "Chroot to build/use" DEFINE_boolean enable_rootfs_verification ${FLAGS_FALSE} \ "Enable rootfs verification when building image" DEFINE_boolean force_make_chroot ${FLAGS_FALSE} "Run make_chroot indep of sync" DEFINE_string grab_buildbot "" \ "Instead of building, grab this full image.zip URI generated by the \ buildbot" DEFINE_boolean ignore_remote_test_failures ${FLAGS_FALSE} \ "Ignore any remote tests that failed and don't return failure" DEFINE_boolean image_to_live ${FLAGS_FALSE} \ "Put the resulting image on live instance (requires --remote)" DEFINE_boolean image_to_vm ${FLAGS_FALSE} "Create a VM image" DEFINE_string image_to_usb "" \ "Treat this device as USB and put the image on it after build" # You can set jobs > 1 but then your build may break and you may need # to retry. Setting it to 1 is best for non-interactive sessions. DEFINE_integer jobs -1 "Concurrent build jobs" DEFINE_boolean master ${FLAGS_TRUE} "Master an image from built code" DEFINE_boolean minilayout ${FLAGS_FALSE} "Use minimal code checkout" DEFINE_boolean mod_image_for_test ${FLAGS_FALSE} "Modify the image for testing" DEFINE_boolean official ${FLAGS_FALSE} "Sync/Build/Test official Chrome OS" DEFINE_boolean oldchromebinary ${FLAGS_TRUE} "Always use chrome binary package" DEFINE_string repo "${CHROMIUMOS_REPO}" "gclient repo for chromiumos" DEFINE_boolean sync ${FLAGS_TRUE} "Sync the checkout" DEFINE_string test "" \ "Test the built image with the given params to run_remote_tests" DEFINE_string top "" \ "Root directory of your checkout (defaults to determining from your cwd)" DEFINE_string vm_options "--no_graphics" "VM options" DEFINE_boolean withdev ${FLAGS_TRUE} "Build development packages" DEFINE_boolean usepkg ${FLAGS_TRUE} "Use binary packages" DEFINE_boolean unittest ${FLAGS_TRUE} "Run unit tests" DEFINE_boolean yes ${FLAGS_FALSE} "Reply yes to all prompts" y # Returns a heuristic indicating if we believe this to be a google internal # development environment. # Returns: # 0 if so, 1 otherwise function is_google_environment() { hostname | egrep -q .google.com\$ return $? } # Validates parameters and sets "intelligent" defaults based on other # parameters. function validate_and_set_param_defaults() { TMP=$(mktemp -d "/tmp/sync_build_test.XXXX") if [[ -z "${FLAGS_top}" ]]; then local test_dir=$(pwd) while [[ "${test_dir}" != "/" ]]; do if [[ -d "${test_dir}/src/platform/dev" ]]; then FLAGS_top="${test_dir}" break fi test_dir=$(dirname "${test_dir}") done fi if [[ -z "${FLAGS_top}" ]]; then # Use the top directory based on where this script runs from FLAGS_top=${GCLIENT_ROOT} fi # Canonicalize any symlinks if [[ -d "${FLAGS_top}" ]]; then FLAGS_top=$(readlink -f "${FLAGS_top}") fi if [[ -z "${FLAGS_chroot}" ]]; then FLAGS_chroot="${FLAGS_top}/chroot" fi # If chroot does not exist, force making it if [[ ! -d "${FLAGS_chroot}" ]]; then FLAGS_force_make_chroot=${FLAGS_TRUE} fi # If chrome_root option passed, set as option for ./enter_chroot if [[ -n "${FLAGS_chrome_root}" ]]; then chroot_options="--chrome_root=${FLAGS_chrome_root}" fi if [[ -n "${FLAGS_test}" ]]; then # If you specify that tests should be run, we assume the image # is modified to run tests. FLAGS_mod_image_for_test=${FLAGS_TRUE} if [[ -n "${FLAGS_remote}" ]]; then # If you specify that tests should be run, we assume you want # to live update the image. FLAGS_image_to_live=${FLAGS_TRUE} else # Otherwise we assume you want to run the VM tests. FLAGS_image_to_vm=${FLAGS_TRUE} fi fi # If they gave us a remote host, then we assume they want us to do a live # update. if [[ -n "${FLAGS_remote}" ]]; then FLAGS_image_to_live=${FLAGS_TRUE} remote_access_init fi # Figure out board. if [[ -z "${FLAGS_board}" ]]; then if [[ -n "${FLAGS_remote}" ]]; then learn_board else get_default_board [[ -z "${DEFAULT_BOARD}" ]] && DEFAULT_BOARD="x86-generic" FLAGS_board="${DEFAULT_BOARD}" fi fi if [[ ${FLAGS_build} -eq ${FLAGS_TRUE} ]]; then if [[ -n "${FLAGS_chrome_root}" ]]; then if [ ! -d "${FLAGS_chrome_root}" ]; then die "Cannot find ${FLAGS_chrome_root} (tildes not expanded)" fi if [ ! -d "${FLAGS_chrome_root}/src/third_party/cros" ]; then die "You need to add .gclient lines for Chrome on Chrome OS" fi fi fi # Grabbing a buildbot build is exclusive with syncing and building if [[ -n "${FLAGS_grab_buildbot}" ]]; then if [[ "${FLAGS_grab_buildbot}" == "LATEST" ]]; then if [[ -z "${FLAGS_buildbot_uri}" ]]; then die "--grab_buildbot=LATEST requires --buildbot_uri or setting \ BUILDBOT_URI" exit 1 fi fi FLAGS_sync=${FLAGS_FALSE} FLAGS_build=${FLAGS_FALSE} FLAGS_unittest=${FLAGS_FALSE} FLAGS_master=${FLAGS_FALSE} fi if [[ ${FLAGS_image_to_live} -eq ${FLAGS_TRUE} ]]; then if [[ ${FLAGS_mod_image_for_test} -eq ${FLAGS_FALSE} ]]; then warn "You have specified to live reimage a machine with" warn "an image that is not modified for test (so it cannot be" warn "later live reimaged)" fi if [[ -n "${FLAGS_image_to_usb}" ]]; then warn "You have specified to both live reimage a machine and" warn "write a USB image. Is this what you wanted?" fi if [[ -z "${FLAGS_remote}" ]]; then die "Please specify --remote with --image_to_live" fi fi if [[ ${FLAGS_mod_image_for_test} -eq ${FLAGS_TRUE} ]]; then # Override any specified chronos password with the test one FLAGS_chronos_passwd="test0000" # If you're modding for test, you also want developer packages. FLAGS_withdev=${FLAGS_TRUE} fi if [[ -n "${FLAGS_image_to_usb}" ]]; then local device=${FLAGS_image_to_usb#/dev/} if [[ -z "${device}" ]]; then die "Expected --image_to_usb option of /dev/* format" fi local is_removable=$(cat /sys/block/${device}/removable) if [[ "${is_removable}" != "1" ]]; then die "Could not verify that ${device} for image_to_usb is removable" fi fi } function has_board_directory() { [[ -d "${FLAGS_top}/chroot/build/${FLAGS_board}" ]] } # Prints a description of what we are doing or did function describe_steps() { if [[ ${FLAGS_sync} -eq ${FLAGS_TRUE} ]]; then local is_official="" [ ${FLAGS_official} -eq ${FLAGS_TRUE} ] && is_official=" (official)" info " * Sync client (repo sync)${is_official} (disable using --nosync)" fi if [[ ${FLAGS_force_make_chroot} -eq ${FLAGS_TRUE} ]]; then info " * Rebuild chroot (make_chroot) in ${FLAGS_chroot}" fi local set_passwd=${FLAGS_FALSE} if ! has_board_directory; then info " * Setup new board ${FLAGS_board} (setup_board)" fi if [[ ${FLAGS_build} -eq ${FLAGS_TRUE} ]]; then local extra_build="" if [[ ${FLAGS_withdev} -eq ${FLAGS_TRUE} ]]; then extra_build=" with dev packages" fi if [[ ${FLAGS_oldchromebinary} -eq ${FLAGS_TRUE} ]]; then extra_build=" (but pull Chrome binary)" fi info " * Build packages${extra_build} (build_packages) \ (disable using --nobuild)" set_passwd=${FLAGS_TRUE} if [[ ${FLAGS_build_autotest} -eq ${FLAGS_TRUE} ]]; then info " * Cross-build autotest client tests (build_autotest)" fi if [[ -n "${FLAGS_chrome_root}" ]]; then info " * After Chrome builds in build_packages, building Chrome from \ sources at ${FLAGS_chrome_root}" fi fi if [[ ${FLAGS_master} -eq ${FLAGS_TRUE} ]]; then info " * Master image (build_image) (disable using --nomaster)" fi if [[ -n "${FLAGS_grab_buildbot}" ]]; then if [[ "${FLAGS_grab_buildbot}" == "LATEST" ]]; then info " * Grab latest buildbot image under ${FLAGS_buildbot_uri}" else info " * Grab buildbot image zip at URI ${FLAGS_grab_buildbot}" fi fi if [[ ${FLAGS_unittest} -eq ${FLAGS_TRUE} ]]; then info " * Run cros_run_unit_tests to run all unit tests \ (disable using --nounittest)" fi if [[ ${FLAGS_mod_image_for_test} -eq ${FLAGS_TRUE} ]]; then if [[ -n "${FLAGS_grab_buildbot}" ]]; then info " * Use the prebuilt image modded for test (rootfs_test.image)" info " * Install prebuilt cross-compiled autotests in chroot" else info " * Make image able to run tests (mod_image_for_test)" fi set_passwd=${FLAGS_TRUE} else info " * Not modifying image for test (enable using --mod_image_for_test)" fi if [[ ${set_passwd} -eq ${FLAGS_TRUE} ]]; then if [[ -n "${FLAGS_chronos_passwd}" ]]; then info " * Set chronos password to ${FLAGS_chronos_passwd}" else info " * Set chronos password randomly" fi fi if [[ -n "${FLAGS_image_to_usb}" ]]; then info " * Write the image to USB device ${FLAGS_image_to_usb}" fi if [[ ${FLAGS_image_to_live} -eq ${FLAGS_TRUE} ]]; then info " * Reimage live test Chromium OS instance at ${FLAGS_remote}" fi if [[ ${FLAGS_image_to_vm} -eq ${FLAGS_TRUE} ]]; then info " * Copy off a separate VM image" fi if [[ -n "${FLAGS_test}" ]]; then if [[ -n "${FLAGS_remote}" ]]; then info " * Run (and build) tests (${FLAGS_test}) on machine at \ ${FLAGS_remote}" else info " * Start a VM locally and run (and build) tests (${FLAGS_test}) \ on it" fi else info " * Not running any autotests (pass --test=suite_Smoke for instance \ to change)" fi } # Prompt user Y/N to continue function prompt_to_continue() { if [ ${FLAGS_yes} -eq ${FLAGS_TRUE} ]; then info "Continuing without prompting since you passed --yes" return fi echo "" read -p "Are you sure (y/N)? " SURE echo "(Pass -y to skip this prompt)" echo "" # Get just the first character if [[ "${SURE:0:1}" != "y" ]]; then die "Ok, better safe than sorry." fi } # Get user's permission on steps to take function interactive() { echo "" info "Planning these steps on ${FLAGS_top} for ${FLAGS_board}:" describe_steps prompt_to_continue } # Changes to a directory relative to the top/root directory of # the checkout. # Arguments: # $1 - relative path function chdir_relative() { local dir=$1 info "Running: cd ${dir}" # Allow use of .. before the innermost directory of FLAGS_top exists if [[ "${dir}" == ".." ]]; then dir=$(dirname "${FLAGS_top}") else dir="${FLAGS_top}/${dir}" fi cd "${dir}" } function info_div { info "#############################################################" } # Describe to the user that a phase is running (and make it obviously when # scrolling through lots of output). # Arguments: # $1 - phase description function describe_phase() { local desc="$1" echo "" info_div info "${desc}" } function cleanup() { [ -n "${TMP}" ] && rm -rf "${TMP}" cleanup_remote_access } # Called when there is a failure and we exit early function failure() { trap - EXIT # Clear these out just in case. export GSDCURL_USERNAME="" export GSDCURL_PASSWORD="" describe_phase "Failure during: ${LAST_PHASE}" show_duration info_div cleanup } # Runs a phase, describing it first, and also updates the sudo timeout # afterwards. # Arguments: # $1 - phase description # $2.. - command/params to run function run_phase() { local desc="$1" shift LAST_PHASE="${desc}" describe_phase "${desc}" local line="Running: " line+=$@ info "${line}" info_div echo "" "$@" sudo true } # Runs a phase, similar to run_phase, but runs within the chroot. # Arguments: # $1 - phase description # $2.. - command/params to run in chroot function run_phase_in_chroot() { local desc="$1" shift run_phase "${desc}" ./enter_chroot.sh "--chroot=${FLAGS_chroot}" \ ${chroot_options} -- "$@" } # Record start time. function set_start_time() { START_TIME=$(date '+%s') } # Display duration function show_duration() { local current_time=$(date '+%s') local duration=$((${current_time} - ${START_TIME})) local minutes_duration=$((${duration} / 60)) local seconds_duration=$((${duration} % 60)) info "$(printf "Total time: %d:%02ds\n" "${minutes_duration}" \ "${seconds_duration}")" } # Runs repo init on a new checkout directory. function config_new_repo_checkout() { mkdir -p "${FLAGS_top}" cd "${FLAGS_top}" local minilayout="" [ ${FLAGS_minilayout} -eq ${FLAGS_TRUE} ] && minilayout="-m minilayout.xml" local git_uri="http://git.chromium.org/git/manifest" if [ ${FLAGS_official} -eq ${FLAGS_TRUE} ]; then git_uri="ssh://git@gitrw.chromium.org:9222/manifest-internal" fi repo init -u "${git_uri}" ${minilayout} } # Configures/initializes a new checkout function config_new_checkout() { info "Checking out ${FLAGS_top}" config_new_repo_checkout } # Runs gclient sync, setting up .chromeos_dev and preparing for # local repo setup function sync() { # cd to the directory below chdir_relative . run_phase "Synchronizing client" repo sync # Change to a directory that is definitely a git repo chdir_relative src/third_party/chromiumos-overlay git cl config "file://$(pwd)/../../../codereview.settings" chdir_relative . } # Downloads a buildbot image function grab_buildbot() { read -p "Username [${LOGNAME}]: " GSDCURL_USERNAME export GSDCURL_USERNAME read -s -p "Password: " GSDCURL_PASSWORD export GSDCURL_PASSWORD CURL="${SCRIPTS_DIR}/bin/cros_gsdcurl.py" if [[ "${FLAGS_grab_buildbot}" == "LATEST" ]]; then local latest=$(${CURL} "${FLAGS_buildbot_uri}/LATEST") if [[ -z "${latest}" ]]; then die "Error finding latest." fi FLAGS_grab_buildbot="${FLAGS_buildbot_uri}/${latest}/image.zip" fi local dl_dir="${TMP}/image" mkdir -p "${dl_dir}" info "Grabbing image from ${FLAGS_grab_buildbot} to ${dl_dir}" run_phase "Downloading image" ${CURL} "${FLAGS_grab_buildbot}" \ -o "${dl_dir}/image.zip" # Clear out the credentials so they can't be used later. export GSDCURL_USERNAME="" export GSDCURL_PASSWORD="" cd "${dl_dir}" unzip image.zip local image_basename=$(basename "$(dirname "${FLAGS_grab_buildbot}")") local image_base_dir="${FLAGS_top}/src/build/images/${FLAGS_board}" local image_dir="${image_base_dir}/${image_basename}" info "Copying in build image to ${image_dir}" rm -rf "${image_dir}" mkdir -p "${image_dir}" if [[ ${FLAGS_mod_image_for_test} -eq ${FLAGS_TRUE} ]]; then run_phase "Installing buildbot test modified image" \ mv chromiumos_test_image.bin "${image_dir}/chromiumos_image.bin" FLAGS_mod_image_for_test=${FLAGS_FALSE} else run_phase "Installing buildbot base image" \ mv chromiumos_base_image.bin "${image_dir}/chromiumos_image.bin" fi if [[ -n "${FLAGS_test}" ]]; then if [[ ! -d "${FLAGS_top}/chroot/build/${FLAGS_board}" ]]; then die "To run tests on a buildbot image, run setup_board first." fi if [[ -e "autotest.tgz" || -e "autotest.tar.bz2" ]]; then # pull in autotest local dir="${FLAGS_chroot}/build/${FLAGS_board}/usr/local" local tar_args="xzf" local tar_name="${dl_dir}/autotest.tgz" if [[ -e "autotest.tar.bz2" ]]; then tar_args="xjf" tar_name="${dl_dir}/autotest.tar.bz2" fi sudo rm -rf "${dir}/autotest" # Expand in temp directory as current user, then move it as # root to keep local user ownership run_phase "Unpacking buildbot autotest cross-compiled binaries" \ tar ${tar_args} "${tar_name}" run_phase "Installing buildbot autotest cross-compiled binaries" \ sudo mv autotest ${dir} fi fi chdir_relative . run_phase "Removing downloaded image" rm -rf "${dl_dir}" } function main() { assert_outside_chroot assert_not_root_user # Parse command line FLAGS "$@" || exit 1 eval set -- "${FLAGS_ARGV}" # Die on any errors. set -e validate_and_set_param_defaults # Cache up sudo status sudo true interactive set_start_time trap failure EXIT local withdev_param="" if [[ ${FLAGS_withdev} -eq ${FLAGS_TRUE} ]]; then withdev_param="--withdev" fi local jobs_param="" if [[ ${FLAGS_jobs} -gt 1 ]]; then jobs_param="--jobs=${FLAGS_jobs}" fi local board_param="--board=${FLAGS_board}" if [[ ! -e "${FLAGS_top}" ]]; then config_new_checkout fi if [[ ${FLAGS_sync} -eq ${FLAGS_TRUE} ]]; then sync fi if [[ -n "${FLAGS_grab_buildbot}" ]]; then grab_buildbot fi if [[ ${FLAGS_force_make_chroot} -eq ${FLAGS_TRUE} ]]; then chdir_relative src/scripts run_phase "Replacing chroot" ./make_chroot --replace \ "--chroot=${FLAGS_chroot}" ${jobs_param} fi if [[ ${FLAGS_build} -eq ${FLAGS_TRUE} ]]; then # It's necessary to enable localaccount for BVT tests to pass. chdir_relative src/scripts run_phase "Enable local account" \ ./enable_localaccount.sh chronos "${FLAGS_chroot}" local pkg_param="" if [[ ${FLAGS_usepkg} -eq ${FLAGS_FALSE} ]]; then pkg_param="--nousepkg" fi chdir_relative src/scripts # Only setup board target if the directory does not exist if ! has_board_directory; then run_phase_in_chroot "Setting up board target" \ ./setup_board ${pkg_param} "${board_param}" fi local build_autotest_param="" if [[ ${FLAGS_build_autotest} -eq ${FLAGS_TRUE} ]]; then build_autotest_param="--withautotest" fi if [[ ${FLAGS_oldchromebinary} -eq ${FLAGS_TRUE} ]]; then pkg_param="${pkg_param} --oldchromebinary" fi run_phase_in_chroot "Building packages" \ ./build_packages "${board_param}" \ ${withdev_param} ${build_autotest_param} \ ${pkg_param} fi if [[ ${FLAGS_chrome_root} ]]; then chdir_relative src/scripts # You can always pass USE=gold, the ebuild will only really use # gold if x86 and the binaries are found. local chrome_use="" if [ ${FLAGS_chrome_gold} -eq ${FLAGS_TRUE} ]; then chrome_use="${chrome_use} gold" fi if [ ${FLAGS_official} -eq ${FLAGS_TRUE} ]; then chrome_use="${chrome_use} internal" fi [ -z "${FLAGS_test}" ] && chrome_use="${chrome_use} -build_tests" run_phase_in_chroot "Building Chromium browser" env \ BOARD="${FLAGS_board}" USE="${chrome_use}" FEATURES="-usersandbox" \ CHROME_ORIGIN=LOCAL_SOURCE emerge-${FLAGS_board} chromeos-chrome fi if [[ ${FLAGS_unittest} -eq ${FLAGS_TRUE} ]] && \ [[ "${FLAGS_board}" == "x86-generic" ]] ; then chdir_relative src/scripts run_phase_in_chroot "Running unit tests" ./cros_run_unit_tests \ ${board_param} fi if [[ ${FLAGS_master} -eq ${FLAGS_TRUE} ]]; then chdir_relative src/scripts if [[ -n "${FLAGS_chronos_passwd}" ]]; then run_phase_in_chroot "Setting default chronos password" \ sh -c "echo '${FLAGS_chronos_passwd}' | \ ~/trunk/src/scripts/set_shared_user_password.sh" fi local other_params="--enable_rootfs_verification" if [[ ${FLAGS_enable_rootfs_verification} -eq ${FLAGS_FALSE} ]]; then other_params="--noenable_rootfs_verification" fi run_phase_in_chroot "Mastering image" ./build_image \ "${board_param}" --replace ${withdev_param} \ ${jobs_param} ${other_params} fi if [[ ${FLAGS_mod_image_for_test} -eq ${FLAGS_TRUE} ]]; then chdir_relative src/scripts run_phase_in_chroot "Modifying image for test" \ "./mod_image_for_test.sh" "${board_param}" --yes fi if [[ -n "${FLAGS_image_to_usb}" ]]; then chdir_relative src/scripts run_phase "Installing image to USB" \ ./image_to_usb.sh --yes "--to=${FLAGS_image_to_usb}" "${board_param}" fi if [[ ${FLAGS_image_to_live} -eq ${FLAGS_TRUE} ]]; then chdir_relative src/scripts run_phase "Re-imaging live Chromium OS machine ${FLAGS_remote}" \ ./image_to_live.sh "--remote=${FLAGS_remote}" --update_known_hosts fi if [[ ${FLAGS_image_to_vm} -eq ${FLAGS_TRUE} ]]; then chdir_relative src/scripts run_phase_in_chroot "Creating VM image from existing image" \ ./image_to_vm.sh "--board=${FLAGS_board}" fi if [[ -n "${FLAGS_test}" ]]; then chdir_relative src/scripts if [[ -z "${FLAGS_remote}" ]]; then # Launch remote machine and run tests. We need first to # figure out what IP to use. if ! run_phase "Running VM tests locally" \ ./bin/cros_run_vm_test "--board=${FLAGS_board}" \ "--test_case=${FLAGS_test}" ${FLAGS_vm_options}; then if [[ ${FLAGS_ignore_remote_test_failures} -eq ${FLAGS_FALSE} ]]; then die "VM tests failed and --ignore_remote_test_failures not passed" fi fi else # We purposefully do not quote FLAGS_test below as we expect it may # have multiple parameters if ! run_phase "Running tests on Chromium OS machine ${FLAGS_remote}" \ ./run_remote_tests.sh "--remote=${FLAGS_remote}" ${FLAGS_test} \ "${board_param}" --build; then if [[ ${FLAGS_ignore_remote_test_failures} -eq ${FLAGS_FALSE} ]]; then die "Remote tests failed and --ignore_remote_test_failures not passed" fi fi fi fi trap cleanup EXIT echo "" info_div info "Successfully used ${FLAGS_top} to:" describe_steps show_duration info_div } main "$@"