diff options
author | Matt Tennant <mtennant@chromium.org> | 2013-11-25 15:07:38 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2013-11-27 00:37:13 +0000 |
commit | 69d08e7871a57ba2dac4ecbfaaeeae395741018f (patch) | |
tree | 79a1934564a26ac6d9e0e09871bd4aa5dde94d70 /contrib | |
parent | f274615b41a2c9302fa4b95bf2b8da39fde6bb01 (diff) | |
download | chromite-69d08e7871a57ba2dac4ecbfaaeeae395741018f.tar.gz |
eval_workstation: New script used in evaluating workstation efficiency.
I recently had to evaluate potential new developer workstations, and
this is the script I developed to automate the process. It runs X times
through a flow that includes various typical steps in the development
process, such as "repo sync", "build_packages", "build_image", etc.
BUG=chromium:320663
TEST=Completed evaluation
Change-Id: Iaf815af7c13ad4b35be567f775a3a09d053072b5
Reviewed-on: https://chromium-review.googlesource.com/177941
Tested-by: Matt Tennant <mtennant@chromium.org>
Reviewed-by: Aviv Keshet <akeshet@chromium.org>
Commit-Queue: Matt Tennant <mtennant@chromium.org>
Diffstat (limited to 'contrib')
-rwxr-xr-x | contrib/eval_workstation | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/contrib/eval_workstation b/contrib/eval_workstation new file mode 100755 index 000000000..688750103 --- /dev/null +++ b/contrib/eval_workstation @@ -0,0 +1,225 @@ +#!/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 "$@" |