blob: 871963b06bdd2b1e2e2493ef6272eee274ccd286 [file] [log] [blame]
#!/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 archive build results. Used by the buildbots.
# Load common constants. This should be the first executable line.
# The path to common.sh should be relative to your script's location.
. "$(dirname "$0")/common.sh"
# Script must be run outside the chroot
assert_outside_chroot
IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images"
# Default to the most recent image
DEFAULT_TO="${GCLIENT_ROOT}/archive"
DEFAULT_FROM="${IMAGES_DIR}/$DEFAULT_BOARD/$(ls -t1 \
$IMAGES_DIR/$DEFAULT_BOARD 2>&-| head -1)"
# Flags
DEFINE_boolean archive_debug $FLAGS_TRUE \
"Archive debug information for build"
DEFINE_string board "$DEFAULT_BOARD" \
"The board to build packages for."
DEFINE_string build_number "" \
"The build-bot build number (when called by buildbot only)." "b"
DEFINE_string chroot "$DEFAULT_CHROOT_DIR" \
"The chroot of the build to archive."
DEFINE_boolean factory_install_mod $FLAGS_FALSE \
"Modify image for factory install purposes"
DEFINE_boolean factory_test_mod $FLAGS_FALSE \
"Modify image for factory testing purposes"
DEFINE_string from "$DEFAULT_FROM" \
"Directory to archive"
DEFINE_string gsutil "gsutil" \
"Location of gsutil"
DEFINE_string gsd_gen_index "" \
"Location of gsd_generate_index.py"
DEFINE_string acl "private" \
"ACL to set on GSD archives"
DEFINE_string gsutil_archive "" \
"Optional datastore archive location"
DEFINE_integer keep_max 0 "Maximum builds to keep in archive (0=all)"
DEFINE_boolean official_build $FLAGS_FALSE "Set CHROMEOS_OFFICIAL=1 for release builds."
DEFINE_boolean test_mod $FLAGS_TRUE "Modify image for testing purposes"
DEFINE_string to "$DEFAULT_TO" "Directory of build archive"
DEFINE_string zipname "image.zip" "Name of zip file to create."
# Parse command line
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
# Set if default from path is used
DEFAULT_USED=
# Reset "default" FLAGS_from based on passed-in board if not set on cmd-line
if [ "$FLAGS_from" = "$DEFAULT_FROM" ]
then
FLAGS_from="${IMAGES_DIR}/$FLAGS_board/$(ls -t1 \
$IMAGES_DIR/$FLAGS_board 2>&-| head -1)"
DEFAULT_USED=1
fi
# Die on any errors.
set -e
if [ -z $DEFAULT_USED ] && [ $FLAGS_test_mod -eq $FLAGS_TRUE ]
then
echo "test_mod requires that the default from path be used."
echo "If non default behavior is desired, run mod_image_for_test manually"
echo "re-run archive build without test_mod"
exit 1
fi
if [ ! -d "$FLAGS_from" ]
then
echo "$FLAGS_from does not exist. Exiting..."
exit 1
fi
if [ $FLAGS_official_build -eq $FLAGS_TRUE ]
then
CHROMEOS_OFFICIAL=1
fi
# Get version information
. "${SCRIPTS_DIR}/chromeos_version.sh"
# Get git hash
# Use git:8 chars of sha1
REVISION=$(git rev-parse HEAD)
REVISION=${REVISION:0:8}
# Use the version number plus revision as the last change. (Need both, since
# trunk builds multiple times with the same version string.)
LAST_CHANGE="${CHROMEOS_VERSION_STRING}-r${REVISION}"
if [ -n "$FLAGS_build_number" ]
then
LAST_CHANGE="$LAST_CHANGE-b${FLAGS_build_number}"
fi
# The Chromium buildbot scripts only create a clickable link to the archive
# if an output line of the form "last change: XXX" exists
echo "last change: $LAST_CHANGE"
echo "archive from: $FLAGS_from"
# Create the output directory
OUTDIR="${FLAGS_to}/${LAST_CHANGE}"
ZIPFILE="${OUTDIR}/${FLAGS_zipname}"
FACTORY_ZIPFILE="${OUTDIR}/factory_${FLAGS_zipname}"
echo "archive to dir: $OUTDIR"
echo "archive to file: $ZIPFILE"
rm -rf "$OUTDIR"
mkdir -p "$OUTDIR"
SRC_IMAGE="${FLAGS_from}/chromiumos_image.bin"
BACKUP_IMAGE="${FLAGS_from}/chromiumos_image_bkup.bin"
# Apply mod_image_for_test to the developer image, and store the
# result in a new location. Usage:
# do_chroot_mod "$OUTPUT_IMAGE" "--flags_to_mod_image_for_test"
function do_chroot_mod() {
MOD_ARGS=$2
OUTPUT_IMAGE=$1
cp -f "${SRC_IMAGE}" "${BACKUP_IMAGE}"
./enter_chroot.sh -- ./mod_image_for_test.sh --board $FLAGS_board \
--yes ${MOD_ARGS}
mv "${SRC_IMAGE}" "${OUTPUT_IMAGE}"
mv "${BACKUP_IMAGE}" "${SRC_IMAGE}"
}
# Modify image for test if flag set.
if [ $FLAGS_test_mod -eq $FLAGS_TRUE ]
then
echo "Modifying image for test"
do_chroot_mod "${FLAGS_from}/chromiumos_test_image.bin" ""
pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/local"
echo "Archiving autotest build artifacts"
tar cjfv "${FLAGS_from}/autotest.tar.bz2" autotest
popd
fi
if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ]
then
echo "Modifying image for factory test"
do_chroot_mod "${FLAGS_from}/chromiumos_factory_image.bin" \
"--factory"
fi
if [ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]
then
echo "Modifying image for factory install"
do_chroot_mod "${FLAGS_from}/chromiumos_factory_install_image.bin" \
"--factory_install"
fi
# Remove the developer build if test image is also built.
if [ $FLAGS_test_mod -eq $FLAGS_TRUE ] ; then
rm -f ${SRC_IMAGE}
fi
# Zip the build
echo "Compressing and archiving build..."
cd "$FLAGS_from"
MANIFEST=`ls | grep -v factory`
zip -r "${ZIPFILE}" ${MANIFEST}
if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \
[ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]
then
FACTORY_MANIFEST=`ls | grep factory`
zip -r "${FACTORY_ZIPFILE}" ${FACTORY_MANIFEST}
chmod 644 "${FACTORY_ZIPFILE}"
fi
cd -
# Update LATEST file
echo "$LAST_CHANGE" > "${FLAGS_to}/LATEST"
# Make sure files are readable
chmod 644 "$ZIPFILE" "${FLAGS_to}/LATEST"
chmod 755 "$OUTDIR"
function gsutil_archive() {
IN_PATH="$1"
OUT_PATH="$2"
if [ -n "$FLAGS_gsutil_archive" ]
then
FULL_OUT_PATH="${FLAGS_gsutil_archive}/${OUT_PATH}"
echo "Using gsutil to archive to ${OUT_PATH}..."
${FLAGS_gsutil} cp ${IN_PATH} ${FULL_OUT_PATH}
${FLAGS_gsutil} setacl ${FLAGS_acl} ${FULL_OUT_PATH}
if [ $FLAGS_gsd_gen_index != "" ]
then
echo "Updating indexes..."
${FLAGS_gsd_gen_index} \
--gsutil=${FLAGS_gsutil} \
-a ${FLAGS_acl} \
-p ${FULL_OUT_PATH} ${FLAGS_gsutil_archive}
fi
fi
}
if [ $FLAGS_test_mod -eq $FLAGS_TRUE -a $FLAGS_official_build -eq $FLAGS_TRUE ]
then
echo "Creating hwqual archive"
HWQUAL_NAME="chromeos-hwqual-${FLAGS_board}-${CHROMEOS_VERSION_STRING}"
"${SCRIPTS_DIR}/archive_hwqual" --from "${OUTDIR}" \
--output_tag "${HWQUAL_NAME}"
gsutil_archive "${OUTDIR}/${HWQUAL_NAME}.tar.bz2" \
"${LAST_CHANGE}/${HWQUAL_NAME}.tar.bz2"
fi
gsutil_archive "${ZIPFILE}" "${LAST_CHANGE}/${FLAGS_zipname}"
if [ $FLAGS_archive_debug -eq $FLAGS_TRUE ]
then
echo "Creating debug archive"
pushd "${FLAGS_chroot}/build/${FLAGS_board}/usr/lib"
sudo tar czfv "${OUTDIR}/debug.tgz" --exclude debug/usr/local/autotest \
--exclude debug/tests debug
CMD="chown \${SUDO_UID}:\${SUDO_GID} ${OUTDIR}/debug.tgz"
sudo sh -c "${CMD}"
popd
gsutil_archive "${OUTDIR}/debug.tgz" "${LAST_CHANGE}/debug.tgz"
fi
if [ $FLAGS_factory_test_mod -eq $FLAGS_TRUE ] || \
[ $FLAGS_factory_install_mod -eq $FLAGS_TRUE ]
then
gsutil_archive "${FACTORY_ZIPFILE}" \
"${LAST_CHANGE}/factory_${FLAGS_zipname}"
fi
gsutil_archive "${FLAGS_to}/LATEST" "LATEST"
# Purge old builds if necessary
if [ $FLAGS_keep_max -gt 0 ]
then
echo "Deleting old builds (all but the newest ${FLAGS_keep_max})..."
cd "$FLAGS_to"
# +2 because line numbers start at 1 and need to skip LATEST file
rm -rf `ls -t1 | tail --lines=+$(($FLAGS_keep_max + 2))`
cd -
fi
echo "Done."