| #!/usr/bin/env bash |
| #******************************************************************************* |
| # Copyright (c) 2016 IBM Corporation and others. |
| # All rights reserved. This program and the accompanying materials |
| # are made available under the terms of the Eclipse Public License v1.0 |
| # which accompanies this distribution, and is available at |
| # http://www.eclipse.org/legal/epl-v10.html |
| # |
| # 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 |
| |
| |