Difference between revisions of "Continuous Integration/proposal"

From CDOT Wiki
Jump to: navigation, search
(Created page with '<source lang="bash"> #!/bin/bash # script for automating synchronization of # Internal Repoand External Repo of NexJ # CDOT - 22/Oct/2010 #changed to /usr/bin/rm for using…')
 
 
(12 intermediate revisions by one other user not shown)
Line 1: Line 1:
<source lang="bash">
+
{{Admon/obsolete}}
  
#!/bin/bash
+
{{NexJ_Express Index}}
 +
==Automating The Synchronization of NexJ Server Express External Repository(Oct 6, 2010)==
 +
The solution that is proposed contains three main tasks:
 +
:1.Checking for new Change Sets on the Internal Repository
 +
:2.Building and Unit Testing each Change Set
 +
:3.Creating a patch from a Change Set and applying it to the External Repository<br/>
 +
[[ Image: controller.jpg | 450px ]]<br/>
  
 +
===Part 1 – Checking for new Change Sets on the Internal Repository===
 +
At a scheduled time, a process will run that will compare the current Revision ID of the External Repository to that in the Internal Repository. If there is a new revision/s in the Internal Repository, then these changes will be pulled to the Controller.<br/>
 +
[[ Image: part1.jpg | 450px ]]<br/>
  
# script for automating synchronization of
+
===Part 2 – Building and Unit Testing Each Change Set===
# Internal Repoand External Repo of NexJ
+
Each change set Pulled from the Internal Repository is built on the Controller using the “build” target in the Ant script and after a successful build is tested with JUnit Tests. <br/>
# CDOT - 22/Oct/2010
+
[[ Image: part2.jpg | 400px ]]<br/>
  
 
+
===Part 3 – Applying a Change Set to the External Repository===
#changed to /usr/bin/rm for using in cmd
+
A patch will be created only after a change set is built and tested successfully. This patch will then be applied to the External Repository.<br/>
PATH=/usr/bin:$PATH
+
[[ Image: part3.jpg | 400px ]]<br/>
 
 
 
 
nexj_home="D:/cygwin/data/hudson/nexj_express"
 
patch="${nexj_home}/patches"
 
src="${nexj_home}/src"
 
doc="${nexj_home}/doc"
 
ANT="${nexj_home}/java/apache-ant-1.7.1/bin/ant"
 
tmpInternal="${nexj_home}/tmpInternal"
 
tmpExternal="${nexj_home}/tmpExternal/core"
 
hgExt="D:/cygwin/home/NexJExpress/External"
 
hgExtURL="https://ossbuild:go_express@cvs-ext.nexj.com/oss/core"
 
hgIntDir="${nexj_home}/hg.nexj.com/core"
 
hgIntURL="D:/cygwin/home/NexJExpress/Internal"
 
 
 
 
 
# add this info to the name of report file
 
reportDate=`date +%Y-%m-%0e-TIME-%H-%M`;
 
# add this info to the name of build and test log files
 
buildDate=`date +%Y-%m-%0e`;
 
# flag to check if there was any error for results in Hudson
 
error=0
 
 
 
 
 
# go to the working directory and clean up everything
 
cd ${nexj_home} 2> /dev/null
 
if [ $? != 0 ]; then
 
    echo "No such directory ${nexj_home}"
 
    exit 1
 
fi
 
 
 
 
 
#Remove temporary repositories
 
if [ -d tmpExternal ]; then
 
rm -r tmpExternal
 
echo "tmpExternal removed"
 
fi
 
 
 
 
 
##########################
 
## Working with Internal
 
##########################
 
cd $hgIntDir 2> /dev/null
 
if [ $? != 0 ]; then
 
mkdir $hgIntDir
 
hg clone -b default $hgIntURL $hgIntDir
 
cd $hgIntDir
 
fi
 
 
 
 
 
# Get latest code from internal
 
hg pull -u -b default 2> /dev/null
 
if [ $? != 0 ]; then
 
    echo "hg pull failed for hgIntURL ${hgIntURL}"
 
    exit 1
 
fi
 
 
 
 
 
# Get latest internal revision number
 
revInternal=`hg log -r tip -b default --template '{node}'`
 
echo "Internal Rev $revInternal"
 
if [[ $revInternal =~ "+" ]]; then
 
echo "========================================="
 
echo "ERROR! Revision $revInternal is not commited yet"
 
echo "========================================="
 
exit 1
 
fi
 
 
 
 
 
##########################
 
## Working with External
 
##########################
 
# Get the latest code from external repo
 
mkdir -p ${tmpExternal} 2> /dev/null
 
if [ $? != 0 ]; then
 
    echo "could not create ${tmpExternal}"
 
    exit 1
 
fi
 
 
 
 
 
hg clone ${hgExt} ${tmpExternal}    # later will be hg clone ${hgExtURL} ${tmpExternal}
 
if [ $? != 0 ]; then
 
echo "Clone was not successful"
 
exit 1
 
fi
 
 
 
 
 
# extract the revision number of latest changeset commited to the External Repo
 
cd ${tmpExternal} 
 
revExternal=`hg log -r tip | grep rev `
 
if [ $? != 0 ]; then
 
    echo "There is no repository availble at ${hgExt}"
 
    exit 1
 
fi
 
 
 
 
 
# extract the Internal revision number from summary
 
revExternal=${revExternal#*revInternal:}
 
echo "External Rev $revExternal"
 
 
 
 
 
# report file name is created based on date
 
report="Report-(${reportDate})"
 
 
 
 
 
echo -e "\n" >> $doc/$report.txt
 
if [ $? != 0 ]; then
 
    echo "2: No such file $doc/${report}.txt"
 
    exit 1
 
fi
 
 
 
 
 
echo "REPORT FOR $reportDate" >> $doc/$report.txt
 
echo "========================================" >> $doc/$report.txt
 
 
 
 
 
# if there is no  new change set, end the script
 
if [ ${revInternal} == ${revExternal} ]; then
 
    echo "There are no new changesets." >> $doc/$report.txt
 
echo "========================================" >> $doc/$report.txt
 
cat $doc/$report.txt
 
    exit 0
 
fi
 
 
 
 
 
cd ${nexj_home}
 
# get the list of the latest changesets since last time committing to the external repo
 
revList=`hg log ${hgIntDir} -r ${revExternal}: --template '{node}\n'`
 
if [ $? != 0 ]; then
 
echo "No repository available at ${hgIntDir}"
 
exit 1
 
fi
 
for rev in $revList; do
 
if [ ${rev} != ${revExternal} ]; then
 
echo "Revision of hgIntDir is $rev"
 
 
 
 
 
cd ${hgIntDir}
 
exPatch=$patch/patch${rev}.patch
 
# if there is any patch with $rev number, remove it
 
if [ -e ${exPatch} ]; then
 
rm ${exPatch}
 
fi
 
 
 
 
 
hg export -r ${rev} > ${exPatch}
 
if [ $? != 0 ]; then
 
echo "export was not successful"
 
exit 1
 
fi
 
 
# extract hgIntDir's tip summary and add rev number
 
# to the commit summary for tmpExternal Repo
 
sumHgIntDir=`hg log -r $rev --template '{desc}\n'`
 
if [ $? != 0 ]; then
 
echo "No repository available"
 
exit 1
 
fi
 
sumTmpExternal="${sumHgIntDir}-revInternal:${rev}"
 
 
cd $tmpExternal
 
if [ $? != 0 ]; then
 
echo "2: No such directory $tmpExternal"
 
exit 1
 
fi
 
 
# applying the patch to tmpExternal Repo
 
hg import -m "$sumTmpExternal" ${exPatch}
 
if [ $? != 0 ]; then
 
echo "import of ${exPatch} was not successful"
 
exit 1
 
fi
 
 
cp "${src}/build.properties" "${tmpExternal}/work/core/build/build.properties" 2> /dev/null
 
if [ $? != 0 ]; then
 
echo "2: No such file or directory"
 
exit 1
 
fi
 
######################
 
#Build the imported changeset
 
######################
 
cd ${tmpExternal}/work/core/build
 
if [ $? != 0 ]; then
 
echo "2: No such directory ${tmpExternal}/work/core/build"
 
exit 1cd ../
 
fi
 
# build log's name is created besed on the rev number and date
 
dateLog="Rev${rev}(${buildDate})"
 
$ANT -logfile $doc/build$dateLog.txt app.ear
 
 
 
 
 
#Check if the build was successful, push it to the hgExtURL
 
grep -w "BUILD SUCCESSFUL" $doc/build$dateLog.txt 2>/dev/null
 
if [ $? -eq 0 ]; then
 
echo "BUILD & TEST SUCCESSFUL - Revision $rev" >> $doc/$report.txt
 
# if build, test and applying the patch was successful then push it
 
echo "PATCH APPLIED SUCCESSFULY - Revision $rev" >> $doc/$report.txt
 
hg push
 
error=0
 
else
 
# if build was not successful apply the created patch as a Broken changeset to the tmpExternal
 
echo "BUILD FAILED - Revision $rev" >> $doc/$report.txt
 
error=1
 
fi
 
fi
 
done
 
 
 
 
 
# Display the report
 
echo "========================================" >> $doc/$report.txt
 
echo -e "\n" >> $doc/$report.txt
 
cat $doc/$report.txt
 
 
 
 
 
exit $error
 
</source>
 

Latest revision as of 19:30, 26 January 2014

Important.png
This page may be obsolete.
It contains historical information.

Automating The Synchronization of NexJ Server Express External Repository(Oct 6, 2010)

The solution that is proposed contains three main tasks:

1.Checking for new Change Sets on the Internal Repository
2.Building and Unit Testing each Change Set
3.Creating a patch from a Change Set and applying it to the External Repository

Controller.jpg

Part 1 – Checking for new Change Sets on the Internal Repository

At a scheduled time, a process will run that will compare the current Revision ID of the External Repository to that in the Internal Repository. If there is a new revision/s in the Internal Repository, then these changes will be pulled to the Controller.
Part1.jpg

Part 2 – Building and Unit Testing Each Change Set

Each change set Pulled from the Internal Repository is built on the Controller using the “build” target in the Ant script and after a successful build is tested with JUnit Tests.
Part2.jpg

Part 3 – Applying a Change Set to the External Repository

A patch will be created only after a change set is built and tested successfully. This patch will then be applied to the External Repository.
Part3.jpg