blob: 2198c4ae06e0815ce5b486bd502a2a852bbf1efa [file] [log] [blame]
#!/usr/bin/env bash
# script to copy update jars from their working area to the staging area
# Simple utility to run as cronjob to run Eclipse Platform builds
# Normally resides in $BUILD_HOME
# Start with minimal path for consistency across machines
# plus, cron jobs do not inherit an environment
# care is needed not have anything in ${HOME}/bin that would effect the build
# unintentionally, but is required to make use of "source buildeclipse.shsource" on
# local machines.
# Likely only a "release engineer" would be interested, such as to override "SIGNING" (setting it
# to false) for a test I-build on a remote machine.
export PATH=/usr/local/bin:/usr/bin:/bin:${HOME}/bin
# unset common variables (some defined for e4Build) which we don't want (or, set ourselves)
unset JAVA_HOME
unset JAVA_ROOT
unset JAVA_JRE
unset CLASSPATH
unset JAVA_BINDIR
unset JRE_HOME
# 0002 is often the default for shell users, but it is not when ran from
# a cron job, so we set it explicitly, so releng group has write access to anything
# we create.
oldumask=`umask`
umask 0002
# Remember, don't echo except when testing, or mail will be sent each time it runs.
#echo "umask explicitly set to 0002, old value was $oldumask"
function usage() {
printf "\n\tScript to promote aggregation to staging area" >&2
printf "\n\tUsage: %s -s <stream> " "$(basename $0)" >&2
printf "\n\t\t%s" "where <stream> is 'main' or 'maintenance'" >&2
printf "\n\t\t%s" "(and main currently means mars and maintenance means luna)" >&2
printf "\n" >&2
}
if [[ $# == 0 ]]
then
printf "\n\tNo arguments given.\n"
usage
exit 1
fi
if [[ $# > 21 ]]
then
printf "\n\tToo many arguments given.\n"
usage
exit 1
fi
stream=
# the initial ':' keeps getopts in quiet mode ... meaning it doesn't print "illegal argument" type messages.
# to get it in completely silent mode, assign $OPTERR=0
# the other ':' is the ususal "OPTARG"
while getopts ':hs:' OPTION
do
options_found=1
case $OPTION in
h)
usage
exit 1
;;
s)
stream=$OPTARG
;;
\?)
# I've seen examples wehre just ?, or [?] is used, which means "match any one character",
# whereas literal '?' is returned if getops finds unrecognized argument.
# I've not seen documented, but if no arguments supplied, seems getopts returns
# '?' and sets $OPTARG to '-'.
# so ... decided to handle "no arguments" case before calling getopts.
printf "\n\tUnknown option: -%s\n" $OPTARG
usage
;;
*)
# This fall-through not really needed in this case, esp. with '?' clause.
# Usually need one or the other.
# getopts appears to return '?' if no options or an unrecognized option.
# Decide to use it for program check, in case allowable options are added,
# but no matching case statemetns.
printf "\n\t%s" "ERROR: unhandled option found: $OPTION. Check script case statements. " >&2
printf "\n" >&2
usage
exit
;;
esac
done
# while we currently don't use/expect additional arguments, it's best to
# shift away arguments handled by above getopts, so other code (in future) could
# handle additional trailing arguments not intended for getopts.
shift $(($OPTIND - 1))
function removeLock
{
# remove lock file from hundson build's "pauseAll.sh" script once we are all done.
# remember, we need to _always_ remove the lock file, so do not "exit" from script with calling removeLock
rm -vf "${BUILD_HOME}"/lockfile
rm -vf "${BUILD_HOME}"/beingPromoted
}
function checkForErrorExit
{
# arg 1 must be return code, $?
# arg 2 (remaining line) can be message to print before exiting do to non-zer exit code
exitCode=$1
shift
message="$*"
if [ "${exitCode}" -ne "0" ]
then
echo
echo " ERROR. exit code: ${exitCode}" ${message}
echo
touch "${BUILD_HOME}"/promoteFailed
removeLock
exit "${exitCode}"
fi
}
case "$stream" in
main)
export release=mars
export stagingsegment=staging
;;
maintenance)
export release=luna
export stagingsegment=maintenance
;;
*)
usage
exit 1
;;
esac
# finds file on users path, before current directory
# hence, non-production users can set their own values for test machines
# must be called after case statement sets release and staging segment
# It is required to specify a top level directory, that will contain all else involved with build, control and output
if [[ -z "${BUILD_HOME}" ]]
then
export BUILD_HOME=${BUILD_HOME:-/shared/simrel/${release}}
#echo "BUILD_HOME: $BUILD_HOME"
fi
# remember to leave no slashes on first filename in source command,
# so that users path is used to find it (first, if it exists)
# variables that user might want/need to override, should be defined,
# in our own aggr_properties.shsource using the X=${X:-"xyz"} syntax.
source aggr_properties.shsource 2>/dev/null
source ${BUILD_HOME}/org.eclipse.simrel.tools/aggr_properties.shsource
# First check if being promoted by another job. If so, can exit immediately
if [[ -e "${BUILD_HOME}"/beingPromoted ]]
then
exit
fi
if [[ ! -e "${BUILD_HOME}"/lockfile ]]
then
# if lock file does not exist, then do not try and promote, just exit.
# For now, we'll write message, but eventually, after cronjob proven, we'll
# do this silently.
# echo "No lock file found, so exiting promote"
exit
fi
# first thing is to create the beingPromoted file, so other promote jobs won't run
touch "${BUILD_HOME}"/beingPromoted
fromDirectory=${AGGREGATOR_RESULTS}
export toDirectory=${stagingDirectory}
echo "BUILD_HOME: $BUILD_HOME"
echo "BUILD_TOOLS_DIR: ${BUILD_TOOLS_DIR}"
echo "stream: $stream"
echo "release: $release"
echo "stagingSegment: $stagingSegment"
echo "fromDirectory: $fromDirectory"
echo "toDirectory: $toDirectory"
# make sure 'toDirectory' has been defined and is no zero length, or
# else following will eval to "rm -fr /*" ... potentially catastrophic
if [ -z "${toDirectory}" ]
then
checkForErrorExit 1 "The variable 'toDirectory' must be defined to run this script"
else
echo
echo " Count of old features, bundle jars, and packed jars prior to promotion";
"${BUILD_TOOLS_DIR}"/printStats.sh
checkForErrorExit $? "printStats did not return normally"
echo
echo
echo " Removing previous staging directory files at"
echo " "${toDirectory}
echo
if [ -d ${toDirectory} ]
then
rm -fr "${toDirectory}"/*
checkForErrorExit $? "could not remove " ${toDirectory}
fi
echo
echo " Copying new plugins and features "
echo " from ${fromDirectory}"
echo " to ${toDirectory}"
echo
# plugins and features
rsync -rvp ${fromDirectory}/final/* ${toDirectory}/
checkForErrorExit $? "could not copy files as expected"
# technically, would not need this, if no 'aggregate' directory.
# TODO: add logic later to avoid extra copy?
# composite artifact and content files
rsync -vp ${fromDirectory}/final/*.jar ${toDirectory}
checkForErrorExit $? "could not copy files as expected"
# copy standard index page
rsync -vp "${BUILD_TOOLS_DIR}/templateFiles/${stagingsegment}/index.html" ${toDirectory}
checkForErrorExit $? "could not copy files as expected"
"${BUILD_TOOLS_DIR}"/addRepoProperties-staging.sh ${stagingsegment}
checkForErrorExit $? "repo properties could not be updated as expected"
# copy standard p2.index page
# We do it last, to use as an indicator file that we are done.
rsync -vp ${fromDirectory}/final/p2.index ${toDirectory}
checkForErrorExit $? "could not copy files as expected"
# TODO: eventually, we could make "sanity check" test on number of files, etc., and fail if more than 10% off, or similar
echo
echo " Count of new features, bundle jars, and packed jars after promotion";
"${BUILD_TOOLS_DIR}"/printStats.sh
checkForErrorExit $? "printStats did not return normally"
echo
fi
removeLock