| #!/bin/bash |
| |
| # Copyright (c) 2013 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. |
| |
| # The purpose of this script is to run through a few steps of a typical |
| # chromeos development flow, tracking the runtime of each step, in order |
| # to evaluate a development machine. |
| |
| CROS_SDK="./chromite/bin/cros_sdk" |
| BOARD="link" |
| BRANCH="stabilize-4886.B" |
| |
| # Run a given command, printing a concise start and stop line along with |
| # the given command description. |
| function run() { |
| local description="${1}" |
| local cmd="${2}" |
| |
| # Prepare a temporary file to hold output. |
| log_basename=$(echo ${description} | sed -e 's/ /_/g') |
| logfile="${TEMPDIR}"/"${log_basename}" |
| |
| local start_time=$(date +%s) |
| |
| echo "Running '${description}' now, output to ${logfile}" |
| ${cmd} >& "${logfile}" |
| local result=$? |
| |
| local end_time=$(date +%s) |
| local elapsed_seconds=$(( end_time - start_time )) |
| echo "Running '${description}' took ${elapsed_seconds}s" |
| |
| if [[ "${result}" -ne 0 ]]; then |
| echo " Failed '${description}'. Check log." |
| exit 1 |
| fi |
| } |
| |
| # Completely delete the given directory. |
| function nuke_dir() { |
| local dir="${1}" |
| if [[ -d "${dir}" ]]; then |
| echo "Deleting existing ${dir}." |
| rm -rf "${dir}" >& /dev/null |
| fi |
| if [[ -d "${dir}" ]]; then |
| echo "Failed to delete ${dir}." |
| exit 1 |
| fi |
| } |
| |
| # TODO(mtennant): I am sure there is a clever way to combine this |
| # function with the non-sudo one above. |
| # Completely delete the given directory using sudo privileges. |
| function sudo_nuke_dir() { |
| local dir="${1}" |
| if [[ -d "${dir}" ]]; then |
| echo "Deleting existing ${dir}, using sudo." |
| sudo rm -rf "${dir}" >& /dev/null |
| fi |
| if [[ -d "${dir}" ]]; then |
| echo "Failed to delete ${dir}, using sudo!" |
| exit 1 |
| fi |
| } |
| |
| function nuke_repo() { |
| nuke_dir ".repo" |
| } |
| |
| # Delete any file or directory other than .repo. |
| # The assumption is that any chroot should have been already deleted. |
| function nuke_source() { |
| echo "Deleting all contents except .repo" |
| find . -maxdepth 1 ! -regex './.repo' ! -regex '.' | xargs rm -rf |
| } |
| |
| # Delete all caches. |
| function nuke_cache() { |
| sudo_nuke_dir ".cache" |
| sudo_nuke_dir "chroot/var/cache/chromeos-cache" |
| } |
| |
| # Delete the build root for $BOARD. |
| function nuke_build() { |
| build="chroot/build/${BOARD}" |
| sudo_nuke_dir "${build}" |
| } |
| |
| # Delete the chroot for $BOARD. |
| function nuke_chroot() { |
| if [[ -d "chroot" ]]; then |
| echo "Deleting existing chroot" |
| ${CROS_SDK} --delete >& /dev/null |
| fi |
| nuke_cache |
| } |
| |
| # Delete everything to start with a clean slate. |
| function nuke_all() { |
| nuke_chroot |
| nuke_source |
| nuke_repo |
| } |
| |
| function repo_init() { |
| echo |
| nuke_repo |
| |
| # Run repo init step |
| local cmd="repo init --repo-url https://chromium.googlesource.com/external/repo --manifest-url https://chrome-internal-review.googlesource.com/chromeos/manifest-internal --manifest-name default.xml --manifest-branch ${BRANCH}" |
| run "repo init" "${cmd}" |
| } |
| |
| function repo_sync() { |
| echo |
| nuke_source |
| |
| local cmd="repo sync --jobs=16" |
| run "repo sync" "${cmd}" |
| } |
| |
| function make_chroot() { |
| echo |
| nuke_chroot |
| |
| local cmd="${CROS_SDK} -- exit" |
| run "cros_sdk" "${cmd}" |
| } |
| |
| function build_packages_plain() { |
| echo |
| nuke_cache |
| nuke_build |
| |
| local cmd="${CROS_SDK} -- ./build_packages --board=${BOARD}" |
| run "build_packages plain" "${cmd}" |
| } |
| |
| function build_packages_source() { |
| echo |
| nuke_cache |
| nuke_build |
| |
| local cmd="${CROS_SDK} -- ./build_packages --board=${BOARD} --nousepkg" |
| run "build_packages source" "${cmd}" |
| } |
| |
| function build_image() { |
| echo |
| |
| local cmd="${CROS_SDK} -- ./build_image --board=${BOARD}" |
| run "build_image" "${cmd}" |
| } |
| |
| usage() { |
| cat <<EOF |
| Usage: eval_workstation [--help] run_count |
| |
| Run through the full ChromeOS workstation evaluation flow run_count |
| times. |
| |
| To adjust which steps are run you must edit the main loop code. |
| |
| Options: |
| -h, --help This help output |
| EOF |
| |
| if [[ $# -gt 0 ]]; then |
| printf '\nerror: %s\n' "$*" >&2 |
| exit 1 |
| else |
| exit 0 |
| fi |
| } |
| |
| main() { |
| run_count=0 |
| while [[ $# -gt 0 ]]; do |
| case $1 in |
| -h|--help) usage;; |
| -*) usage "unknown option $1";; |
| *) run_count="$1";; |
| esac |
| shift |
| done |
| |
| if [[ "${run_count}" -eq 0 ]]; then |
| usage "missing run count argument" |
| fi |
| |
| sudo true |
| |
| # Offer the user a chance to kill. |
| # TODO(mtennant): A yes/no prompt would be a better solution here. |
| echo "This script will run through a few ChromeOS build steps." |
| echo "Doing so will NUKE THE CONTENTS OF CURRENT DIRECTORY." |
| echo "If that is not okay then kill this script now." |
| sleep 10 |
| |
| for (( i=1; i<=${run_count}; i++ )); do |
| echo |
| echo "*** Starting run ${i} of ${run_count} now. ***" |
| echo |
| |
| TEMPDIR=$(mktemp -d /tmp/workstation_eval.XXXX) |
| echo "Using temporary dir: ${TEMPDIR}" |
| |
| sudo true |
| nuke_all |
| repo_init |
| repo_sync |
| make_chroot |
| build_packages_plain |
| build_packages_source |
| build_image |
| |
| echo |
| echo "Any logs created for run ${i} are under ${TEMPDIR}" |
| done |
| } |
| |
| main "$@" |