blob: 94d6a03629845fb2991475b3f224c6f14311544d [file] [log] [blame]
# !/bin/sh
# $Id: buildUpdate.sh,v 1.9 2007/03/14 06:02:53 aplatov Exp $
# buildUpdate.sh script to generate Update Managers jars & promote them to download.eclipse
# Copyright \(c\) 2004-2006, IBM. Nick Boldt. codeslave\(at\)ca.ibm.com
# This script should build the required project plugins, features + site.xml
# requires accompanying properties file, promoteToEclipse.*.properties or buildUpdate.properties, where * = emf or uml2
# can also specify any other properties file with -f flag
echo "[umj] buildUpdate.sh started on: `date +%Y%m%d\ %H\:%M\:%S`"
##########################################################################################
if [ $# -lt 1 ]; then
echo " "
echo "usage: buildUpdate.sh"
echo "-f <properties file used to run script (default ./promoteToEclipse.properties)>"
echo "-sub <REQUIRED: specify subproject as ocl, validation, query, transaction, etc.>"
echo "-user <username on *.eclipse.org (default is $USER)>"
echo "-q, -Q <scp, unzip, cvs checkout: -Q (quieter) where possible, -q elsewhere>"
echo "-debug <debug this script and ProductUpdateBuilder script [0|1|2] (default 0)>"
echo "-buildID <perform UM site jars build on which build ID (eg., I200601191242)>"
echo "-branch <branch of the files to be built, eg., 1.0.0, 1.0.1 (overrides value in property file)>"
echo "-promote <promote built jars to download> (optional)"
echo "-nobuilder <skip checking out o.e.releng.basebuilder> (optional)"
echo "-skipjars <skip uploading jars to download.eclipse (just the new XML)> (optional)"
echo "-nocleanup <don't delete temp files when done> (optional)"
echo "-noCompareUMFolders <after uploading the drop, DO NOT compare source and target for matching MD5s, etc.>"
echo "-basebuilderBranch <org.eclipse.releng.basebuilder CVS branch>" #; default to value in build.options.txt if avail>"
echo "-no4thPart <build 3-part jars (2.0.1) instead of the default, 4-part jars (2.0.1.I200601191242)>"
echo " "
echo "Examples:"
echo "Build (normal): ./buildUpdate.sh -sub ocl -Q -buildID I200601191242 \\"
echo " 2>&1 | tee ~/buildUpdate_\`date +%Y%m%d_%H%M%S\`.txt"
echo "Build then promote: ./buildUpdate.sh -sub query -Q -buildID I200601191242 -promote"
echo "Build 3-part jars: ./buildUpdate.sh -sub query -Q -buildID I200601191242 -no4thPart"
echo " "
exit 1
fi
# default to default properties file
defaultPropertiesFile=./promoteToEclipse.properties
propertiesFiles="";
# Create local variable based on the input
while [ "$#" -gt 0 ]; do
case $1 in
'-f')
propertiesFile=$2;
echo " $1 $2";
shift 1
;;
'-sub')
subprojectName=$2;
echo " $1 $2";
# chain them together in order of priority: override (if applic), subproj specific one, default
propertiesFiles=$propertiesFiles" ./promoteToEclipse."$subprojectName".properties "$defaultPropertiesFile;
loaded=0;
for propertiesFile in $propertiesFiles; do
if [ "$loaded" -eq 0 ] && [ -r $propertiesFile ]; then
echo -n " [loading $propertiesFile ... "; . $propertiesFile; echo "done]"; loaded=1;
fi
done
if [ "$loaded" -eq 0 ]; then
echo " [Can't load any of: $propertiesFiles. Exiting!]";
exit 99;
fi
shift 1
;;
'-user')
echo " $1 $2";
user=$2;
shift 1
;;
'-buildID')
echo " $1 $2";
buildID=$2;
shift 1
;;
'-branch')
echo " $1 $2";
branch=$2;
shift 1
;;
'-promote')
echo " $1";
promote=1;
build=1;
shift 0
;;
'-nobuilder')
echo " $1";
builder=0;
shift 0
;;
'-nocleanup' | '-noclean')
echo " $1";
cleanup=0;
shift 0
;;
'-skipjars')
echo " $1";
skipjars=1;
shift 0
;;
'-q')
echo " $1";
quietCVS=-q;
quiet=-q;
shift 0
;;
'-Q')
echo " $1";
quietCVS=-Q;
quiet=-q;
shift 0
;;
'-debug')
echo " $1 $2";
debug=$2;
shift 1
;;
'-basebuilderBranch')
echo " $1 $2";
basebuilderBranch=$2;
shift 1
;;
'-noCompareUMFolders')
echo " $1";
noCompareUMFolders=1;
shift 0
;;
'-no4thPart')
echo " $1";
no4thPart=1;
shift 0
;;
esac
shift 1
done
if [ "$subprojectName" = "" ]; then # no value set!
echo "[promote] No subproject name set in properties file or by -sub flag. Script cannot continue. Exiting...";
exit 99;
fi
if [ "$branch" = "" ]; then # no value set!
echo "[promote] No branch value set in properties file or by -branch flag. Script cannot continue. Exiting...";
exit 99;
fi
if [ "$buildID" = "" ]; then # no value set!
echo "[promote] No build ID value set in properties file or by -buildID flag. Script cannot continue. Exiting...";
exit 99;
fi
##########################################################################################
#users (for ssh and cvs connections)
buildServerCVSUser=$user"@"$buildServerFullName
if [[ $branch = "0.8.0" ]]; then
updatesPrefix=0.8
else
updatesPrefix=1.0
fi
#path to update site on build server
localUpdatesWebDir=$localWebDir/updates/$updatesPrefix
# path to update site on download
updatesDir=$projectWWWDir/updates/$updatesPrefix
#TODO: move into modeling
CVSRep=":ext:"$user"@"$eclipseServerFullName":/cvsroot/technology"
wwwCVSRep=":ext:"$user"@"$eclipseServerFullName":/cvsroot/org.eclipse"
wwwRemote=$user"@"$downloadServerFullName
# temp folder
tmpfolder=$HOME/tmp-buildUpdate.sh-$subprojectName-$user-`date +%Y%m%d_%H%M%S`
# working directory for CVS checkouts & building
buildDir=$tmpfolder/1 ;
bootclasspath="$javaHome/jre/lib/*.jar:$buildDir/org.eclipse.releng.generators/buildTools.jar:$buildDir/org.eclipse.releng.generators/productUpdateBuilder.jar"
##########################################################################################
getBuildIDactual ()
{
#new, more efficient method as of nov 12 thanks to ken's identification of the old way's limitation
buildIDactual=`find $buildDropsDir/$branch/$buildID -name "$SDKfilenamepattern"`
buildIDactual=${buildIDactual##*SDK-}; # trim up to SDK- (substring notation)
buildIDactual=${buildIDactual%%\.zip}; # trim off .zip (substring notation)
echo "Using build ID: $buildIDactual"
}
##########################################################################################
buildIDactual=buildID;
getBuildIDactual;
##########################################################################################
#ssh $buildServerCVSUser "mkdir -p $buildDir";
mkdir -p $buildDir
if [ $promote -eq 1 ]; then
mkdir -p $buildDir/../2
fi
cd $buildDir ;
if [ $builder -eq 1 ]; then
if [ "x$basebuilderBranch" = "x" ]; then
if [[ ! $basebuilderBranch ]]; then
basebuilderBranch=$(cat $buildDropsDir/$branch/$buildID/build.cfg | grep basebuilderBranch); basebuilderBranch=${basebuilderBranch#basebuilderBranch=}; # echo $basebuilderBranch
if [[ ! $basebuilderBranch ]]; then
basebuilderBranch="HEAD";
fi
fi
fi
echo "[umj-co] [1] Checking out org.eclipse.releng.basebuilder from dev using $basebuilderBranch"
#ssh $buildServerCVSUser "cd $buildDir; cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse $quietCVS co -P -r $basebuilderBranch org.eclipse.releng.basebuilder"
cp -r ~/basebuilder/M3_33/org.eclipse.releng.basebuilder $buildDir
else
echo "[umj-co] [1] Checking out org.eclipse.releng.basebuilder from dev... omitted."
fi
# org.eclipse.releng.basebuilder directory
relengBaseBuilderDir=$buildDir/org.eclipse.releng.basebuilder
echo "[umj] relengBaseBuilderDir: $relengBaseBuilderDir"
#unpack files from cvs to get buildUpdateJars.xml, productUpdateBuilder.jar, buildTools.jar
echo "[umj-co] [2] Checking out $relengGeneratorsCVSPath"
cd $buildDir
cvs -d $CVSRep $quietCVS co -P -d org.eclipse.releng.generators $relengGeneratorsCVSPath
updatesCVSPath=www/dltk/updates/$updatesPrefix
echo "[umj-co] [3] Checking out $updatesCVSPath/* from $wwwCVSRep"
cd $buildDir/../1
cvs -d $wwwCVSRep $quietCVS co -P -d site $updatesCVSPath/site.xml
cvs -d $wwwCVSRep $quietCVS co -P -d site $updatesCVSPath/site-interim.xml
cvs -d $wwwCVSRep $quietCVS co -P -d site $updatesCVSPath/index.php
cd $buildDir/../1/site
cd $buildDir/ ;
#run ant script
echo "[umj] [4] Invoking Eclipse build to create UM jars for build ID $buildID..."
buildIDactual=`find $buildDropsDir/$branch/$buildID -name "$SDKfilenamepattern"`
buildIDactual=${buildIDactual##*SDK-}; # trim up to SDK-
buildIDactual=${buildIDactual%%\.zip}; # trim off .zip
#echo $buildIDactual
if [ "$buildIDactual" != "$buildID" ]; then
buildDesc=$buildIDactual; # eg., 2.0.1RC1 != M200409081700
else
buildDesc=$branch; # eg., 2.0.1
fi
# new, for use with plugins as jars: unpack SDK zips and then replace foo.jar with foo/ folders instead
rm -fr $buildDir/org.eclipse.releng.generators/updateJars
mkdir -p $buildDir/org.eclipse.releng.generators/updateJars/site
index=0;
element_count=${#filePrefixesToUnzipArray[@]}
while [ "$index" -lt "$element_count" ]; do
zipfilename=${filePrefixesToUnzipArray[$index]}"$buildIDactual.zip"
unzip -uo -qq $buildDropsDir/$branch/$buildID/$zipfilename -d $buildDir/org.eclipse.releng.generators/updateJars
let "index = $index + 1";
done
jarlist=`find $buildDir/org.eclipse.releng.generators/updateJars/eclipse/plugins -maxdepth 1 -name "*.jar"`
for jarfile in $jarlist; do
folder=${jarfile%\.jar}
echo "Unpacking "${jarfile#*plugins/}" ...";
#echo "Unpacking $jarfile into $folder ...";
unzip -uo -qq $jarfile -d $folder;
#echo "Removing $jarfile ...";
rm -fr $jarfile;
done
# java home & vm used to run the build. Defaults to java on system path
## must be Sun 1.4 - IBM 1.4 crashes server and Sun 5.0 throws NPE (SAXParser problem)
javaHome=/usr/local/j2re1.4.2_13
vm=$javaHome/bin/java
command="$vm -cp $relengBaseBuilderDir/startup.jar org.eclipse.core.launcher.Main"
command=$command" -application org.eclipse.ant.core.antRunner"
command=$command" -f $buildDir/$antScript $target"
command=$command" -Dbootclasspath=$bootclasspath"
command=$command" -Dtimestamp=$buildID"
command=$command" -DbuildDesc=$buildDesc"
command=$command" -DdropDir=$buildDropsDir/$branch/$buildID"
command=$command" -DprojectName=$projectName"
command=$command" -DsubprojectName=$subprojectName"
command=$command" -Ddebug=$debug"
if [ $no4thPart -eq 1 ]; then
sitexml="site.xml";
command=$command" -DfourthPart=no4thPart"
command=$command" -Dsitexml=$sitexml"
no4thPart=1;
elif [ "$buildIDactual" = "$branch" ]; then
sitexml="site.xml";
command=$command" -DfourthPart=no4thPart"
command=$command" -Dsitexml=$sitexml"
no4thPart=1;
elif [ "$buildIDactual" != "$buildID" ]; then
# if alias 2.0.1RC1 != buildID M200408121234, we have an aliased build; need 4th part to ensure proper sequencing
sitexml="site-interim.xml";
command=$command" -DfourthPart=add4thPart"
command=$command" -Dsitexml=$sitexml"
else
# if alias 2.0.1RC1 != 2.0.1
# if alias M200408121234 = buildID M200408121234
sitexml="site-interim.xml";
command=$command" -DfourthPart=add4thPart"
command=$command" -Dsitexml=$sitexml"
fi
cp -f $buildDir/site/$sitexml $buildDir/org.eclipse.releng.generators/updateJars/site/
echo "$command" | perl -pe "s/ -/\n -/g";
$command
# generate MD5s
md5file="./md5s/"$subprojectName"_"$buildIDactual".md5";
md5filepath=$buildDir"/../"$md5file
mkdir -p $buildDir/../md5s
cd $buildDir/org.eclipse.releng.generators/updateJars/site
md5sum features/*.jar plugins/*.jar > $md5filepath # list md5s for all new jars
echo "[umj] [5a] Copy new jars & site/* to $localUpdatesWebDir ..."
#TODO: move to www/modeling/mdt/updates and www/modeling/emf/updates
# copy new jars & site.xml to /var/www/technology/$projectName/updates
cd $buildDir/org.eclipse.releng.generators/updateJars/site && cp -r . $localUpdatesWebDir && cd $buildDir/site && cp -r . $localUpdatesWebDir
# copy md5 file into both places, too: first to local build/cvs server
mkdir -p $localUpdatesWebDir/md5s && cp $md5filepath $localUpdatesWebDir/md5s
echo "[umj] [5b] Fix permissions in $localUpdatesWebDir ..."
cd $localUpdatesWebDir ;
chgrp -fR $eclipseUserGroup *;
find $localUpdatesWebDir -type f -exec chmod -f $eclipsePermsFile {} \; ;
find $localUpdatesWebDir -type f -exec chmod -f $eclipsePermsFile {} \; ;
#promote to download
if [ $promote -eq 1 ]; then
echo "[umj] [6] Update site/* to dev.eclipse.org ..." ;
cd $buildDir/site ;
cvs -d $wwwCVSRep $quietCVS ci -m "buildUpdate: automatic UM site update" ;
if [ $skipjars -eq 0 ]; then
echo "[umj] [7a] Promoting jars to $downloadServerFullName..." ;
cd $buildDir/org.eclipse.releng.generators/updateJars/site ;
scp -r $buildDir/org.eclipse.releng.generators/updateJars/site/. $wwwRemote:$updatesDir;
else
echo "[umj] [7a] Promoting jars to $downloadServerFullName... omitted." ;
fi
echo "[umj] [7b] Promoting site/* to $downloadServerFullName..." ;
cd $buildDir/site ;
scp -r $quiet $buildDir/site/. $wwwRemote:$updatesDir
# copy md5 file into both places, too: second onto production server
ssh $wwwRemote "mkdir -p $updatesDir/md5s/"
scp $quiet $md5filepath $wwwRemote:$updatesDir/md5s/
echo "[umj] [7c] Fix permissions in $updatesDir ..." ;
ssh $wwwRemote "
cd $updatesDir/..;
chgrp -fR $eclipseUserGroup $updatesProfix;
find $updatesDir/../$updatesProfix -type d -exec chmod -f $eclipsePermsDir {} \; ;
find $updatesDir/../$updatesProfix -type f -exec chmod -f $eclipsePermsFile {} \; ;
";
# validate MD5s
if [ $noCompareUMFolders -eq 0 ]; then
### CHECK MD5s and compare dir filesizes for match (du -s)
echo "[umj] [7d] [`date +%H:%M:%S`] Comparing local and remote folders MD5 sums to ensure SCP completeness... "
$buildScriptsDir/compareFolders.sh -md5only -md5file $md5file -user $user -local $localUpdatesWebDir -remote $updatesDir -server $wwwRemote
returnCode=$?
if [ $returnCode -gt 0 ]; then
echo "[umj] [`date +%H:%M:%S`] ERROR! Script exiting with code $returnCode from compareFolders.sh"
exit $returnCode;
fi
else
echo "[umj] [7d] [`date +%H:%M:%S`] Comparing local and remote folders to ensure SCP completeness ... omitted."
fi
else
echo "[umj] [6] Check in new site/* to CVS... omitted."
echo "[umj] [7] Promoting jars & site/* to $downloadServerFullName... omitted."
fi
exit 0
# cleanup
if [ $cleanup -eq 1 ]; then
rm -fr $tmpfolder/
fi
########### DONE ###########
echo "[umj] buildUpdate.sh completed on: `date +%Y%m%d\ %H\:%M\:%S`"