blob: 6228f5c880dc54fb67d4f94ec885966bf351c88d [file] [log] [blame]
# !/bin/sh
#****************************************************************************************
# Copyright (c) 2012, 2013 Oracle and/or its affiliates. All rights reserved.
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
# which accompanies this distribution.
#
# The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
# and the Eclipse Distribution License is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# Contributors:
# - egwin - 13 September 2012 - Initial implementation
# - egwin - 07 March 2013 - Updates for staging to SonatypeOSS
#****************************************************************************************
#----------------------------------------------------------------------------------------
# This script is designed to be run interactively to promote an existing published
# build to a milestone, or a Milestone build to a release. It expects to be run from
# the 'build.eclipse.com' server.
#----------------------------------------------------------------------------------------
#==========================
# Basic Env Setup
#
#Define common variables
THIS=$0
PROGNAME=`basename ${THIS}`
CUR_DIR=`dirname ${THIS}`
umask 0002
BUILD=$1
MILESTONE=$2
BRANCH_NM=$3
DEBUG_ARG=$4
ANT_ARGS=" "
ANT_OPTS="-Xms512m -Xmx1024m -XX:MaxPermSize=512m"
START_DATE=`date '+%y%m%d-%H%M'`
#Directories
ANT_HOME=/shared/common/apache-ant-1.7.0
HOME_DIR=/shared/rt/eclipselink
EXEC_DIR=${HOME_DIR}
DNLD_DIR=/home/data/httpd/download.eclipse.org/rt/eclipselink
JAVA_HOME=/shared/common/jdk-1.6.x86_64
LOG_DIR=${HOME_DIR}/logs
RELENG_REPO=${HOME_DIR}/eclipselink.releng
RUNTIME_REPO=${HOME_DIR}/eclipselink.runtime
#ANT Invokation Variables
BUILDFILE=${RUNTIME_REPO}/autobuild.xml
ANT_TARGET=build-milestone
#Global Variables
RELEASE=false
PATH=${JAVA_HOME}/bin:${ANT_HOME}/bin:/usr/bin:/usr/local/bin:${PATH}
# Export necessary global environment variables
export ANT_ARGS ANT_OPTS ANT_HOME HOME_DIR JAVA_HOME LOG_DIR PATH
#==========================
# Functions Definitions
#
unset usage
usage() {
echo "Usage: ${PROGNAME} (BUILD |'release') MILESTONE BRANCH_NM [debug]"
echo " BUILD - full build identifier, or 'release' (example: 2.4.1.v201209013-98ef31a). Used to generate branch,"
echo " version, date and hash info needed. If 'release', tells promote to release the specified"
echo " MILESTONE."
echo " MILESTONE - a milestone (exampe: M4) to promote the specified build to. Also used in dir storage, and maven."
echo " storage, and Maven publishing."
echo " BRANCH_NM - The git branchname for the branch the build was based upon (Example: master, 2.4, 2.3, etc.)"
echo " DEBUG_ARG - if defined, designates a run should be 'debug'."
}
unset createPath
createPath() {
# Usage: createPath path
path=$1
if [ "${DEBUG}" = "true" ] ; then
echo "createPath: Attempting to create '${path}' path."
fi
newdir=
for directory in `echo ${path} | tr '/' ' '`
do
newdir=${newdir}/${directory}
if [ ! -d "${newdir}" ] ; then
if [ "${DEBUG}" = "true" ] ; then
echo "createPath: Creating subdir: '${newdir}'"
fi
mkdir ${newdir}
if [ $? -ne 0 ]
then
echo " Error (createPath): Creation of ${newdir} failed!"
exit
fi
fi
done
}
unset genSafeTmpDir
genSafeTmpDir() {
tmp=${TMPDIR-/tmp}
tmp=$tmp/somedir.$RANDOM.$RANDOM.$RANDOM.$$
(umask 077 && mkdir $tmp) || {
echo "Could not create temporary directory! Exiting." 1>&2
exit 1
}
echo "results stored in: '${tmp}'"
}
unset parseBuild
parseBuild() {
build=$1
echo "- parseBuild -"
# cut parameters: -s: only print if delimeter exists in input; -d delimeter; -f field(s) to print
BRANCH=`echo ${build} | cut -s -d'.' -f1-2`
if [ "${BRANCH}" = "" ] ; then
usage
echo "BRANCH Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
echo " VERSION should be in the 3 part OSGi standard - Major.Minor.patch"
echo " "
exit 2
fi
VERSION=`echo ${build} | cut -s -d'.' -f1-3`
if [ "${VERSION}" = "" ] ; then
usage
echo "VERSION Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
echo " VERSION should be in the 3 part OSGi standard - Major.Minor.patch"
echo " "
exit 2
fi
QUALIFIER=`echo ${build} | cut -s -d'.' -f4`
if [ "${QUALIFIER}" = "" ] ; then
usage
echo "QUALIFIER Error: There is something wrong with BUILD. ('$build' should be VERSION.QUALIFIER)!"
echo " QUALIFIER should be in the form: vDATE-HASH where DATE is YYYYMMDD"
echo " "
exit 2
fi
# assign value of first field delimited by '-' (only use values containing '-' (-s)), with 'v' stripped, to DATE
BLD_DATE=`echo ${QUALIFIER} | cut -s -d'-' -f1 | cut -s -d'v' -f2`
if [ "${BLD_DATE}" = "" ] ; then
usage
echo "BLD_DATE Error: There is something wrong with QUALIFIER!"
echo " '$qualifier' should be in the form:"
echo " vDATE-HASH where DATE is YYYYMMDD"
echo " "
exit 2
fi
# assign value of 2nd field delimited by '-' (only use values containing '-' (-s)), to HASH
GIT_HASH=`echo ${QUALIFIER} | cut -s -d'-' -f2`
if [ "${GIT_HASH}" = "" ] ; then
usage
echo "GIT_HASH Error: There is something wrong with QUALIFIER!"
echo " '$qualifier' should be in the form:"
echo " vDATE-HASH where DATE is YYYYMMDD"
echo " "
exit 2
fi
if [ "$DEBUG" = "true" ] ; then
echo "build ='$build'"
echo "BRANCH ='$BRANCH'"
echo "VERSION ='$VERSION'"
echo "QUALIFIER='$QUALIFIER'"
echo "BLD_DATE ='$BLD_DATE'"
echo "GIT_HASH ='$GIT_HASH'"
fi
}
unset validateGitRepo
validateGitRepo() {
echo "- validateGitRepo -"
#Must run git commands from Git repo dir so, store current dir, and switch to repo
curdir=`pwd`
cd ${RUNTIME_REPO}
# parse status of repo for current branch
ststus_msg=`${GIT_EXEC} status`
gitbranch=`echo $ststus_msg | grep -m1 "#" | cut -s -d' ' -f4`
echo "Currently on '${gitbranch}' in '${RUNTIME_REPO}'"
# is current branch the desired branch?
error_cnt=0
if [ "${BRANCH_NM}" = "${gitbranch}" ] ; then
echo "Git repo already on branch '$BRANCH_NM'."
else
# switch to desired branch
${GIT_EXEC} checkout ${BRANCH_NM}
if [ "$?" = "0" ] ; then
# parse status of repo for current branch
ststus_msg=`${GIT_EXEC} status`
gitbranch=`echo $ststus_msg | grep -m1 "#" | cut -s -d' ' -f4`
echo "Now on '${gitbranch}' in '${RUNTIME_REPO}'"
echo "Git checkout complete."
else
# if encountered error, increment error_cnt
error_cnt=`expr ${error_cnt} + 1`
fi
fi
# verify switch took place
if [ "$error_cnt" = "0" ] ; then
echo "Git Repo on correct branch for promotion to continue..."
else
echo "Error detected switching branches. exiting..."
exit 1
fi
# ensure repo is up-to-date
# has to occur after setting the correct banch because "git pull" only grabs changes on the active branch.
echo "Ensuring repo is up-to-date."
${GIT_EXEC} pull
cd $curdir
}
unset validateBuild
validateBuild() {
echo "- validateBuild -"
if [ -d ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE} ] ; then
echo "Valid build dir: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}'"
if [ -e ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip ] ; then
echo "Valid build: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip' found."
else
echo "Invalid build: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}.${QUALIFIER}.zip' not found."
echo "Valid builds are:"
ls ${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}/eclipselink-${VERSION}*.zip
exit 1
fi
else
echo "Invalid build dir: '${DNLD_DIR}/nightly/${VERSION}/${BLD_DATE}'"
echo "Valid build dates are:"
ls ${DNLD_DIR}/nightly/${VERSION}
exit 1
fi
#cd $curdir
}
# TODO: again NEED branch to verify instead of branch_NM, but need branch_NM to interact with Git
unset validateMilestone
validateMilestone() {
milestone=$1
echo "- validateMilestone -"
# TODO: Verify ${milestone} is 'release', or starts with M# or RC#
if [ -d ${DNLD_DIR}/milestones/${VERSION}/${milestone} ] ; then
echo "Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' already exists."
if [ -e ${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}.${QUALIFIER}.zip ] ; then
echo " Milestone ${milestone} Build: '${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}.${QUALIFIER}.zip' already promoted."
else
promotedBuild=`ls ${DNLD_DIR}/milestones/${VERSION}/${milestone}/eclipselink-${VERSION}*.zip`
echo " Milestone ${milestone} Build: '${promotedBuild}' found."
fi
echo " You should either choose another Milestone number, or clean previous promote (if partial) before running again."
exit 1
else
echo "Milestone dir: '${DNLD_DIR}/milestone/${VERSION}/${milestone}' not preexisting."
echo "Continuing..."
fi
}
unset parseVersion
parseVersion() {
branch_nm=$1
echo "- parseVersion -"
if [ -d ${DNLD_DIR}/milestones ] ; then
if [ "$branch_nm" = "master" ] ; then
# Version is 'highest' dir ending in '0'
VERSION=`ls -r ${DNLD_DIR}/milestones | grep -m1 0$`
else
# Version is 'highest' dir begining with value of $branch_nm
VERSION=`ls -r ${DNLD_DIR}/milestones | grep -m1 $branch_nm`
fi
else
echo "Cannot find milestones. '${DNLD_DIR}/milestones' not found."
fi
echo "Version= '$VERSION'"
}
unset validateReleaseMilestone
validateReleaseMilestone() {
milestone=$1
echo "- validateReleaseMilestone -"
# if milestone begins with either "M" or "RC" (doesn't (not begin with M) and (not begin with RC))
test1=`echo $milestone | grep -m1 ^M`
test2=`echo $milestone | grep -m1 ^RC`
if [ ! \( \( "$test1" = "" \) -a \( "$test2" = "" \) \) ] ; then
if [ -d ${DNLD_DIR}/milestones/${VERSION}/${milestone} ] ; then
echo " Target Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' exists. Continuing..."
else
echo "Milestone dir: '${DNLD_DIR}/milestones/${VERSION}/${milestone}' doesn't exist."
exit 1
fi
else
usage
echo "Invalid Milestone detected: '$milestone' doesn't begin with 'M' or 'RC'"
exit 1
fi
}
unset parseReleaseMilestone
parseReleaseMilestone() {
#find 'build' data from published milestone
echo "Target Milestone: '${MILESTONE}'"
BUILD=`ls ${DNLD_DIR}/milestones/${VERSION}/${MILESTONE} | grep -m1 P2signed | cut -d'-' -f3-4 | cut -d'.' -f1-4`
echo "BUILD: '${BUILD}'"
# set Milestone to 'release' for ant script
# TODO: fix ant so will promote from published milestone rather than nightly
MILESTONE=RELEASE
parseBuild ${BUILD}
}
#TODO Must have Git validation and setup completed first
unset callAnt
callAnt() {
#Need milestine branch, version, qualifier, date, githash
milestone=$1
branch=$2
branch_nm=$3
version=$4
qualifier=$5
blddate=$6
githash=$7
echo " "
echo "- callAnt -"
# Define SYSTEM variables needed
BldDepsDir=${HOME_DIR}/bld_deps/${branch} # Needed for Eclipse dependencies when publishing/promoting
if [ ! -d "${BldDepsDir}" ] ; then
echo "${BldDepsDir} not found!"
fi
if [ ! -d "${RELENG_REPO}" ] ; then
echo "${RELENG_REPO} not found!"
fi
#verify src, root dest, and needed variables exist before proceeding
if [ \( ! "${milestone}" = "" \) -a \( ! "${branch}" = "" \) -a \( ! "${blddate}" = "" \) -a \( ! "${version}" = "" \) -a \( ! "${qualifier}" = "" \) ] ; then
echo "Preparing to promote ${milestone} for ${version}...."
if [ "${DEBUG}" = "true" ] ; then
echo "callAnt: Required data verified... proceeding..."
echo " milestone = '${milestone}'"
echo " branch = '${branch}'"
echo " blddate = '${blddate}'"
echo " version = '${version}'"
echo " qualifier = '${qualifier}'"
echo " githash = '${githash}'"
fi
#Invoke Antscript for Branch specific promotion
arguments="-Dbuild.deps.dir=${BldDepsDir} -Dreleng.repo.dir=${RELENG_REPO} -Dgit.exec=${GIT_EXEC}"
arguments="${arguments} -Dbranch.name=${branch_nm} -Drelease.version=${version} -Dbuild.type=${milestone} -Dbranch=${branch}"
arguments="${arguments} -Dversion.qualifier=${qualifier} -Dbuild.date=${blddate} -Dgit.hash=${githash}"
# arguments="${arguments} -Drepository.username=${USER} -Drepository.userpass=${PASSWD}"
# Run Ant from ${exec_location} using ${buildfile} ${arguments}
echo "pwd='`pwd`"
echo "ant ${BUILDFILE} ${arguments} ${ANT_TARGET}"
if [ -f ${BUILDFILE} ] ; then
ant -f ${BUILDFILE} ${arguments} ${ANT_TARGET}
if [ "$?" = "0" ]
then
echo "Ant promote complete."
else
echo "Ant Promote Failed!"
fi
else
echo "'${BUILDFILE}' doesn't exist. Aborting ant run..."
fi
else
# Something is not right! skipping.."
echo " Required locations and data failed to verify... aborting Promote...."
ERROR=true
if [ "${DEBUG}" = "true" ] ; then
echo "callAnt: Required locations and data:"
echo " milestone = '${milestone}'"
echo " branch = '${branch}'"
echo " blddate = '${blddate}'"
echo " version = '${version}'"
echo " qualifier = '${qualifier}'"
echo " githash = '${githash}'"
fi
fi
}
#==========================
# Main Begins
#==========================
# Validate run parameters
if [ "${BUILD}" = "" ] ; then
usage
echo " "
echo "BUILD not specified! Exiting..."
exit 1
fi
if [ "${MILESTONE}" = "" ] ; then
usage
echo " "
echo "MILESTONE not specified! Exiting..."
exit 1
fi
if [ "${BRANCH_NM}" = "" ] ; then
usage
echo " "
echo "BRANCH_NM not specified! Exiting..."
exit 1
fi
#if [ "${USER}" = "" ] ; then
# echo " "
# echo "USER not specified! Exiting..."
# exit 1
#fi
#if [ "${PASSWD}" = "" ] ; then
# usage
# echo " "
# echo "PASSWD not specified! Exiting..."
# exit 1
#fi
# If anything is in DEBUG_ARG then do a dummy "DEBUG" run
# (Do not call ant, do not modify or create files, do report variable states)
DEBUG=false
if [ -n "$DEBUG_ARG" ] ; then
DEBUG=true
echo "Debug is on!"
fi
#==========================
# Define Environment
echo "-= Validate Environment =- "
if [ ! -d ${JAVA_HOME} ] ; then
echo "Expecting Java at: '${JAVA_HOME}', but is not there!"
JAVA_HOME=/shared/common/jdk1.6.0_05
if [ ! -d ${JAVA_HOME} ] ; then
echo "Tried again. Expecting Java at: '${JAVA_HOME}', but is not there!"
#exit
fi
fi
echo "JAVA_HOME verified at: '${JAVA_HOME}'"
if [ ! -d ${ANT_HOME} ] ; then
echo "Expecting Ant at: '${ANT_HOME}', but is not there!"
#exit
fi
echo "ANT_HOME verified at: '${ANT_HOME}'"
if [ ! -d ${HOME_DIR} ] ; then
echo "Need to create HOME_DIR '${HOME_DIR}'"
if [ "${DEBUG}" = "false" ] ; then
echo "DEBUG=$DEBUG"
createPath ${HOME_DIR}
else
echo " Debug on, No actual work being done."
fi
fi
if [ ! -d ${LOG_DIR} ] ; then
echo "Need to create LOG_DIR '${LOG_DIR}'"
if [ "${DEBUG}" = "false" ] ; then
createPath ${LOG_DIR}
else
echo " Debug on, No actual work being done."
fi
fi
GIT_EXEC=/usr/local/bin/git
if [ ! -x ${GIT_EXEC} ] ; then
echo "Cannot find Git executable using default value '$GIT_EXEC'. Attempting Autofind..."
GIT_EXEC=`which git`
if [ $? -ne 0 ] ; then
echo "Error: Unable to find GIT executable! Git functionality disabled."
GIT_EXEC=false
exit 1
else
echo "Found: ${GIT_EXEC}"
fi
else
echo "Found: ${GIT_EXEC}"
fi
if [ ! -d ${RELENG_REPO} ] ; then
echo "Releng repo missing! Will try to clone."
echo "${GIT_EXEC} clone ssh://git.eclipse.org/gitroot/eclipselink/eclipselink.releng.git"
if [ ! -d ${RELENG_REPO} ] ; then
echo "Still cannot find '${RELENG_REPO}'. Something went wrong... aborting."
exit 1
else
echo "Cloning successful."
fi
else
echo "Releng repo '${RELENG_REPO}' found."
fi
if [ ! -d ${RUNTIME_REPO} ] ; then
echo "EclipseLink Runtime repo missing! Will try to clone."
echo "${GIT_EXEC} clone ssh://git.eclipse.org/gitroot/eclipselink/eclipselink.runtime.git"
if [ ! -d ${RUNTIME_REPO} ] ; then
echo "Still cannot find '${RUNTIME_REPO}'. Something went wrong... aborting."
exit 1
else
echo "Cloning successful."
fi
else
echo "EclipseLink Runtime repo '${RUNTIME_REPO}' found."
fi
echo " Validated."
echo " "
## Convert "BRANCH" to BRANCH_NM (version or trunk) and BRANCH (svn branch path)
# BRANCH_NM is used for reporting and naming purposes
# BRANCH is used to quailify the actual Branch path
#==========================
# Begin WORK
echo "Promote begin at: ${START_DATE}"
#Determine if 'release' run or regular Milestone promotion
if [ "$BUILD" = "release" ] ; then
RELEASE=true
# Figure out VERSION based upon BRANCH_NM
parseVersion $BRANCH_NM
# verify that specified milestone exists.
validateReleaseMilestone $MILESTONE
# relevant build coordinats from Milestone artifacts
parseReleaseMilestone
# Ensure we are on the correct branch in the repo, if build info is good
validateGitRepo
else
# Get needed info from BUILD
parseBuild $BUILD
# Validate BUILD Exists
validateBuild
# Ensure we are on the correct branch in the repo, if build info is good
validateGitRepo
# Validate MILESTONE against convention, and verify not preexisting
validateMilestone $MILESTONE
fi
echo "BUILD ='${BUILD}'"
echo " BRANCH ='$BRANCH'"
echo " VERSION ='$VERSION'"
echo "QUALIFIER ='$QUALIFIER'"
echo " BLD_DATE ='$BLD_DATE'"
echo " GIT_HASH ='$GIT_HASH'"
echo "MILESTONE ='${MILESTONE}'"
echo "BRANCH_NM ='${BRANCH_NM}'"
callAnt $MILESTONE $BRANCH $BRANCH_NM $VERSION $QUALIFIER $BLD_DATE $GIT_HASH
echo "Promote complete at: `date '+%y%m%d-%H%M'`"
echo " "
echo " "