summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorMatt Tennant <mtennant@chromium.org>2013-11-25 15:07:38 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-11-27 00:37:13 +0000
commit69d08e7871a57ba2dac4ecbfaaeeae395741018f (patch)
tree79a1934564a26ac6d9e0e09871bd4aa5dde94d70 /contrib
parentf274615b41a2c9302fa4b95bf2b8da39fde6bb01 (diff)
downloadchromite-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-xcontrib/eval_workstation225
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 "$@"