| #!/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 "$@" |
| |