#!/usr/bin/env bash #******************************************************************************* # Copyright (c) 2016 IBM Corporation and others. # # This program and the accompanying materials # are made available under the terms of the Eclipse Public License 2.0 # which accompanies this distribution, and is available at # https://www.eclipse.org/legal/epl-2.0/ # # SPDX-License-Identifier: EPL-2.0 # # Contributors: # David Williams - initial API and implementation #******************************************************************************* # boot strap basic variable values, to drive Eclipse Platform builds. # We set RAWDATE first thing, just to make it more accurate of the "start of the build". # We have found on Hudson (but never by cron jobs) that by the time the build starts, it is often already 1 minute # past the time we scheduled. This may eventually be fixed (or improved) in Hudson (see bug 496403). # Initially we tried heuristic of deducting 60 seconds (bug 496345) but occasionally Hudson would start the job in, say 51 seconds, making # our build ID a minute less that it should be. Then we tried 30 seconds (bug 500233), but given a look at the long term history # of Hudson "start" times, it seems 30 seconds may fail at times too. # So modified to truncate "epoch seconds" to the nearest 5 minutes since in our production builds we always schedule them # to start at "even" times, such as "on the hour", occasionally "on the half hour", and rarely on "quarter hours" and maybe once at 10 after. :) # So as long as schedule as it currently is, it seems truncating to nearest 5 minutes will always work. We have seen Hudson "delay times" range from # about 20 seconds to at most about 2 minutes, but never any near 5 minutes so that shouldn't be a concern, # unless Hudson delays start to get really long (over 5 minutes) for some reason. if [[ -z "${RAWDATE}" ]] then RAWDATE=$( date +%s ) remainder=$(( RAWDATE % 300 )) RAWDATE=$((RAWDATE - remainder)) export RAWDATE echo -e "\n\t[DEBUG] RAWDATE in ${0##*/} was empty (as expected) so setting to \"now minus $remainder\" (truncating to nearest 5 minutes): ${RAWDATE}\n" else echo -e "\n\t[DEBUG] RAWDATE in ${0##*/} was already set. RAWDATE: ${RAWDATE}\n" fi if [[ -z "${SCRIPT_PATH}" ]] then echo -e "\n\t[ERROR] SCRIPT_PATH is not defined as expected in ${0##*/}" exit 1 else echo -e "\n\t[INFO] SCRIPT_PATH defined as ${SCRIPT_PATH}" fi source "${SCRIPT_PATH}/bashUtilities.shsource" # USAGE: fn-git-cache BUILD_ROOT # ROOT: /shared/eclipse/builds/${major}${type} fn-git-cache () { # we (now) leave branch our of git-cache path, or else "topic branches", such as # 'david_williams/II20130409-0900' complicates directory structure checkNArgs $# 1 if [[ $? != 0 ]]; then return 1; fi ROOT="$1"; shift echo $ROOT/gitCache } # USAGE: fn-git-dir GIT_CACHE URL # GIT_CACHE: /shared/eclipse/builds/R4_2_maintenance/gitCache # URL: file:///gitroot/platform/eclipse.platform.releng.aggregator.git fn-git-dir () { checkNArgs $# 2 if [[ $? != 0 ]]; then return 1; fi GIT_CACHE="$1"; shift URL="$1"; shift echo $GIT_CACHE/$( basename "$URL" .git ) } # USAGE: fn-build-id BUILD_TYPE # BUILD_TYPE: I, M, N, X, Y, P, U fn-build-id () { checkNArgs $# 1 if [[ $? != 0 ]]; then return 1; fi BUILD_TYPE="$1"; shift TIMESTAMP=$( date +%Y%m%d-%H%M --date='@'$RAWDATE ) echo ${BUILD_TYPE}${TIMESTAMP} } # USAGE: fn-build-dir ROOT BUILD_ID STREAM # ROOT: /shared/eclipse/builds # BUILD_ID: M20121119-1900 # STREAM: 4.3.0 fn-build-dir () { checkNArgs $# 3 if [[ $? != 0 ]]; then return 1; fi ROOT="$1"; shift BUILD_ID="$1"; shift STREAM="$1"; shift eclipseStreamMajor=${STREAM:0:1} dropDirSegment=siteDir/eclipse/downloads/drops if (( $eclipseStreamMajor > 3 )) then dropDirSegment=siteDir/eclipse/downloads/drops4 fi echo $ROOT/$dropDirSegment/$BUILD_ID } # if not defined "externally", then something is wrong # with our assumptions and we should simply fail here. # If the definition ever needs to be put back here, then # see bootstrap.shsource for how REPO_AND_ACESS is defined. assertNotEmpty REPO_AND_ACCESS if [[ -z "${AGGREGATOR_REPO}" ]] then export AGGREGATOR_REPO=${REPO_AND_ACCESS}/platform/eclipse.platform.releng.aggregator.git fi assertNotEmpty BUILD_ROOT assertNotEmpty AGGREGATOR_REPO assertNotEmpty BUILD_TYPE assertNotEmpty STREAM if [[ -z "${gitCache}" ]] then gitCache=$( fn-git-cache "${BUILD_ROOT}" ) assertNotEmpty gitCache export gitCache else echo "gitCache was already defined as $gitCache" fi if [[ -z "${aggDir}" ]] then aggDir=$( fn-git-dir "$gitCache" "$AGGREGATOR_REPO" ) assertNotEmpty aggDir export aggDir else echo "aggDir was already defined as $aggDir" fi # NOTE: if BUILD_ID is already set, we need to make sure it # is one of "our" BUILD_IDs, # since if we try to run on Hudson, it gets's Hudson's # version of BUILD_D which is like "2016-03-13_17-12-03" # Therefore, we not only check "if set", we also check # it's format to be sure it matches the pattern we use. # We do not expect S or R in this context # if we ever do, it is a 3 part id, not 2 part. # Either of the two "digits" forms should work. #buildIdPattern="^[MNIPYU][0-9]{8}-[0-9]{4}$" buildIdPattern="^[MNIPYU][[:digit:]]{8}-[[:digit:]]{4}$" if [[ -z "${BUILD_ID}" || ! "${BUILD_ID}" =~ $buildIdPattern ]] then BUILD_ID=$(fn-build-id "$BUILD_TYPE" ) assertNotEmpty BUILD_ID export BUILD_ID echo "BUILD_ID was defined as $BUILD_ID" else echo "BUILD_ID was already defined as $BUILD_ID" fi if [[ -z "${buildDirectory}" ]] then buildDirectory=$( fn-build-dir "$BUILD_ROOT" "$BUILD_ID" "$STREAM" ) assertNotEmpty buildDirectory export buildDirectory # this should be when we first create buildDirectory echo "Making buildDirectory: ${buildDirectory}" # Testing confirmed that umask was correct initially. #echo "initial umask in bootstrapVariables.shsource: $(umask)" #umask 0002 #echo "umask after setting in bootstrapVariables.shsource: $(umask)" # it appears GID bit is not always set correctly. # Appears related to "depth" of directories made. # If we "cd" to parent directory, then it works. # even using --mode u=rwx,g=rwxs,o=rx did not make it correctly. # See https://bugs.eclipse.org/bugs/show_bug.cgi?id=492493 #mkdir -p --verbose --mode u=rwx,g=rwxs,o=rx "${buildDirectory}" mkdir -p --verbose $BUILD_ROOT/siteDir/eclipse/downloads/drops4 pushd $BUILD_ROOT/siteDir/eclipse/downloads/drops4 mkdir --verbose $BUILD_ID popd else echo "buildDirectory was already defined as $buildDirectory" fi