| #!/usr/bin/env bash |
| |
| # this localBuildProperties.shsource file is to ease local builds to override some variables. |
| # It should not be used for production builds. |
| source localBuildProperties.shsource 2>/dev/null |
| export BUILD_HOME=${BUILD_HOME:-/shared/eclipse/builds} |
| |
| # To allow this cron job to work from hudson, or traditional crontab |
| if [[ -z "${WORKSPACE}" ]] |
| then |
| export UTILITIES_HOME=/shared/eclipse |
| else |
| export UTILITIES_HOME=${WORKSPACE}/utilities/production |
| fi |
| |
| |
| # These variable are not correctly defined centrally, |
| # and are also defined in various Ant scripts. |
| # For production, use value for shared instance |
| HUDSON_PROTOCOL=${HUDSON_PROTOCOL:-"https"} |
| HUDSON_HOST=${HUDSON_HOST:-"ci.eclipse.org"} |
| # is standard port for "eclipse", but can not leave blank, since we use ':' in some URLs |
| HUDSON_PORT=${HUDSON_PORT:-"443"} |
| HUDSON_ROOT_URI=${HUDSON_ROOT_URI:-"releng"} |
| # For production, use the special performance machine at eclipse |
| HUDSON_PERF_HOST=${HUDSON_PERF_HOST:-"ci.eclipse.org"} |
| HUDSON_PERF_PORT=${HUDSON_PERF_PORT:-"443"} |
| HUDSON_PERF_PROTOCOL=${HUDSON_PERF_PROTOCOL:-"https"} |
| LINUX_PERF_SEGMENT=${LINUX_PERF_SEGMENT:-"releng"} |
| |
| function convertToZeroPaddedMillisecs () |
| { |
| inNumber=$1 |
| printf -v outNumber "%.3f" "${inNumber}" |
| RC=$? |
| if [[ $RC != 0 ]] |
| then |
| printf "%s" "InvalidInput" |
| else |
| printf "%s" "${outNumber}" |
| fi |
| } |
| |
| function dropOnDLServer() |
| { |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildType as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| pathToDL=$( dlToPath "$eclipseStream" "$buildId") |
| |
| if [[ "$pathToDL" == 1 ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: pathToDL could not be computed." >&2 |
| return 1 |
| fi |
| toDir="/home/data/httpd/download.eclipse.org/${pathToDL}" |
| echo $toDir |
| } |
| function updateSiteOnDL() |
| { |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildType as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| # contrary to intuition (and previous behavior, bash 3.1) do NOT use quotes around right side of expression. |
| if [[ "${eclipseStream}" =~ ([[:digit:]]*)\.([[:digit:]]*)\.([[:digit:]]*) ]] |
| then |
| eclipseStreamMajor=${BASH_REMATCH[1]} |
| eclipseStreamMinor=${BASH_REMATCH[2]} |
| eclipseStreamService=${BASH_REMATCH[3]} |
| else |
| echo "ERROR: eclipseStream, $eclipseStream, must contain major, minor, and service versions, such as 4.2.0" >&2 |
| exit 1 |
| fi |
| buildType=${buildId:0:1} |
| |
| toSiteDir="/home/data/httpd/download.eclipse.org/eclipse/updates" |
| |
| |
| updatesSuffix="builds" |
| |
| toMainUpdateDir=$toSiteDir/${eclipseStreamMajor}.${eclipseStreamMinor}-${buildType}-${updatesSuffix}/ |
| # We'll check for existence, and create if doesn't exist ... as long as it is "under" our |
| # toSiteDir, it is likely an intentional new one, rather than an error. |
| if [[ ! -d "${toMainUpdateDir}" ]] |
| then |
| if [[ -d "${toSiteDir}" ]] |
| then |
| # create |
| mkdir -p "${toMainUpdateDir}" |
| RC=$? |
| if [[ $RC != 0 ]] |
| then |
| echo "ERROR: could not create main update site: ${toMainUpdateDir}" >&2 |
| # "return" empty string, as indication of error" |
| toMainUpdateDir="" |
| fi |
| else |
| echo "PROGRAM ERROR: main update site root did not exist: ${toSiteDir}" >&2 |
| # "return" empty string, as indication of error" |
| toMainUpdateDir="" |
| fi |
| fi |
| echo $toMainUpdateDir |
| } |
| # compute update site on build server |
| function updateSiteOnBuildDir() |
| { |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildType as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| # contrary to intuition (and previous behavior, bash 3.1) do NOT use quotes around right side of expression. |
| if [[ "${eclipseStream}" =~ ([[:digit:]]*)\.([[:digit:]]*)\.([[:digit:]]*) ]] |
| then |
| eclipseStreamMajor=${BASH_REMATCH[1]} |
| eclipseStreamMinor=${BASH_REMATCH[2]} |
| eclipseStreamService=${BASH_REMATCH[3]} |
| else |
| echo "eclipseStream, $eclipseStream, must contain major, minor, and service versions, such as 4.2.0" >&2 |
| return 1 |
| fi |
| buildType=${buildId:0:1} |
| |
| |
| buildRoot=${BUILD_HOME}/${eclipseStreamMajor}${buildType} |
| |
| siteDir=${buildRoot}/siteDir |
| updatesSuffix="builds" |
| fromDir=$siteDir/updates/${eclipseStreamMajor}.${eclipseStreamMinor}-${buildType}-${updatesSuffix}/${buildId} |
| |
| echo $fromDir |
| } |
| |
| # compute main part of download server drop directory |
| function dropFromBuildDir () |
| { |
| |
| eclipseStream=$1 |
| buildId=$2 |
| pathFromDL=$( dlFromPath "$eclipseStream" "$buildId" ) |
| |
| |
| if [[ "$pathFromDL" == 1 ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: pathToDL could not be computed." >&2 |
| return 1 |
| fi |
| |
| eclipseStreamMajor=${eclipseStream:0:1} |
| buildType=${buildId:0:1} |
| |
| buildRoot=${BUILD_HOME}/${eclipseStreamMajor}${buildType} |
| |
| siteDir=${buildRoot}/siteDir |
| |
| fromDir=${siteDir}/${pathFromDL}/${buildId} |
| |
| echo "$fromDir" |
| |
| } |
| |
| # compute main (middle part) of download site |
| function dlToPath() |
| { |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildId as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| eclipseStreamMajor=${eclipseStream:0:1} |
| buildType=${buildId:0:1} |
| |
| pathToDL=eclipse/downloads/drops |
| if (( $eclipseStreamMajor > 3 )) |
| then |
| pathToDL=$pathToDL$eclipseStreamMajor |
| fi |
| |
| echo $pathToDL |
| } |
| |
| function dlFromPath() |
| { |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildId as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| |
| eclipseStreamMajor=${eclipseStream:0:1} |
| buildType=${buildId:0:1} |
| |
| pathFromDL=eclipse/downloads/drops |
| if (( $eclipseStreamMajor > 3 )) |
| then |
| pathFromDL=$pathFromDL$eclipseStreamMajor |
| fi |
| |
| echo $pathFromDL |
| } |
| |
| |
| function syncDropLocation () |
| { |
| echo "start syncDropLocation" |
| eclipseStream=$1 |
| if [[ -z "${eclipseStream}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide eclipseStream as first argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| echo "eclipseStream: $eclipseStream" |
| |
| buildId=$2 |
| if [[ -z "${buildId}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide buildId as second argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| echo "buildId: $buildId" |
| |
| |
| EBUILDER_HASH=$3 |
| if [[ -z "${EBUILDER_HASH}" ]] |
| then |
| printf "\n\n\t%s\n\n" "ERROR: Must provide builder (or aggregator) hash as fourth argument, for this function $(basename $0)" >&2 |
| return 1; |
| fi |
| echo "EBUILDER_HASH: $EBUILDER_HASH" |
| |
| eclipseStreamMajor=${eclipseStream:0:1} |
| buildType=${buildId:0:1} |
| |
| fromDir=$( dropFromBuildDir $eclipseStream $buildId ) |
| if [[ ! -d "${fromDir}" ]] |
| then |
| echo "ERROR: fromDir is not a directory? fromDir: ${fromDir}" |
| return 1 |
| fi |
| |
| |
| toDir=$( dropOnDLServer $eclipseStream $buildId ) |
| if [[ ! -d "${toDir}" ]] |
| then |
| echo "ERROR: toDir is not a directory? toDir: ${toDir}" |
| return 1 |
| fi |
| |
| echo " fromDir: ${fromDir}" >&1 |
| echo " toDir: ${toDir}" >&1 |
| |
| # here, for dl site, best not to preserve times, since (if mirrored) |
| # would be more accurate for mirroring system to have |
| # actual times (and we are copying only one specific |
| # sub-directory) (But, we do for now, for easier testing) |
| if [[ -n "${fromDir}" && -d "${fromDir}" && -n "${toDir}" && -d "${toDir}" ]] |
| then |
| # Note the slash at end of aggregator ... we do not want to exclude eclipse.platform.releng.aggregator-(builder hash).zip |
| # TODO: remove --verbose, once confident it works as expected. |
| rsync --times --omit-dir-times --recursive --prune-empty-dirs --exclude="*apitoolingreference/*" --exclude="*org.eclipse.releng.basebuilder/*" --exclude="*eclipse.platform.releng.aggregator/*" --exclude="*/repository/*" --exclude="*workspace-*/*" "${fromDir}" "${toDir}" |
| rccode=$? |
| else |
| rccode=9 |
| fi |
| if [[ $rccode != 0 ]] |
| then |
| echo "ERROR: rsync did not complete normally.rccode: $rccode" |
| return $rccode |
| else |
| # Now update main DL page index pages, to show available |
| source ${UTILITIES_HOME}/sdk/updateIndexFilesFunction.shsource |
| updateIndex |
| fi |
| |
| echo "ending syncDropLocation" |
| } |
| function linkURL () |
| { |
| url="${1}" |
| if [[ -z "${url}" ]] |
| then |
| echo "Programming error. URL must not be null as argument to 'linkURL'" |
| exit 1 |
| fi |
| link="<a href=\"${url}\">${url}</a>" |
| echo ${link} |
| } |
| |
| function sendEclipseMail () |
| { |
| TO="$1" |
| FROM="$2" |
| SUBJECT="$3" |
| message1="$4" |
| ( |
| echo "To: ${TO}" |
| echo "From: ${FROM}" |
| if [[ -n "${InReplyTo}" ]] |
| then |
| echo "In-Reply-To: ${InReplyTo}" |
| fi |
| if [[ -n "${Reference}" ]] |
| then |
| echo "Reference: ${Reference}" |
| fi |
| echo "MIME-Version: 1.0" |
| echo "Content-Type: text/html; charset=utf-8" |
| echo "Subject: ${SUBJECT}" |
| echo "<html><body>" |
| echo -e "${message1}" |
| echo "</body></html>" |
| ) | /usr/lib/sendmail -t |
| |
| } |
| |
| function setToAndFromAddresses () |
| { |
| # This bit of data is used in a few other scripts, such as |
| # syncDropLocation.sh and updateDropLoction.sh |
| # It primarily sets the TO and FROM fields for email. |
| # It also supplements the SUBJECT. |
| |
| |
| # override 'TO' in localBuildProperties.shsource if doing local tests |
| # for initial testing, only to me -- change as desired after initial testing. |
| if [[ "${buildType}" =~ [PYXU] ]] |
| then |
| case "${buildType}" in |
| "P" ) |
| export TO=${TO:-"sravankumarl@in.ibm.com,jdt-core-dev@eclipse.org"} |
| export SUBJECT="Patch Build: ${SUBJECT}" ;; |
| "U" ) |
| export TO=${TO:-"sravankumarl@in.ibm.com,noopur_gupta@in.ibm.com,jdt-ui-dev@eclipse.org"} |
| export SUBJECT="Branch SDK Build: ${SUBJECT}" ;; |
| "Y" ) |
| export TO=${TO:-"sravankumarl@in.ibm.com,jdt-core-dev@eclipse.org"} |
| export SUBJECT="Branch SDK Build: ${SUBJECT}" ;; |
| "X" ) |
| export TO=${TO:-"sravankumarl@in.ibm.com"} |
| export SUBJECT="Experimental Build: ${SUBJECT}" ;; |
| *) |
| export TO=${TO:-"sravankumarl@in.ibm.com"} |
| export SUBJECT="Unknown buildType ${buildType}: ${SUBJECT}" |
| echo -e "\n\tWARNING: Unreachable code. Programming error. case statement did not match any pattern!\n" |
| esac |
| else |
| if [[ "${invisibleBuild}" == "true" ]] |
| then |
| export TO=${TO:-"sravankumarl@in.ibm.com, akurtako@redhat.com"} |
| else |
| export TO=${TO:-"platform-releng-dev@eclipse.org"} |
| fi |
| fi |
| |
| export FROM=${FROM:-"genie.releng@eclipse.org"} |
| |
| } |