awips2/tools/devAutoDeploy/HudsonScripts/new-nightly-build.sh
root 9f19e3f712 Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: 64fa9254b946eae7e61bbc3f513b7c3696c4f54f
2012-01-06 08:55:05 -06:00

295 lines
9.8 KiB
Bash

#!/bin/bash -x
#----------------------------------------------------------------------
# Automated build script. Provides export of code base to a single
# directory and some ordering of builds.
#
# Usage:
# new-nightly-build.sh [bundles] [delete] [share] [svn-connect] [group] ... [group]
#----------------------------------------------------------------------
# Args:
# $1 :: bundles file - path to file containing list of bundles
# to create.
# default: don't create an bundle installers
# $2 :: delete flag - true to delete, false to not delete
# default: true
# $3 :: location of directory containing packages and output location
# default: /share1
# $4 :: svn repo connection string
# default: file:///home/keystone/repo/products/awips/trunk2
# $5.. :: list of SVN project groups needed for the build
# default: cave cots edexOsgi nativeLib RadarServer Installer
#
# Note: all args are optional, but cumulative. i.e., in order to change
# the svn connection string, you must specify delete flag and
# location values.
#----------------------------------------------------------------------
# Limitations:
# 1) This script is designed to be executed by Hudson -- it may need
# modification to run with another auto build system
# 2) The list of bundles to build is defined by a file named
# 'new-nightly-build-bundles', which is must be co-located with
# this script. See that file for more information.
#----------------------------------------------------------------------
#-- set defaults for arguments
#----------------------------------------------------------------------
#-- bundle definition file -- will be arg $1
bundle_fl=
#-- delete flag -- will be arg $2
delete_projects="true"
#-- share1 location -- will be arg $3
#-- (allows using different packages archive and output directory)
SHARE1=/share1
#-- connect string for the repo directory -- will be arg $4
connection='file:///home/keystone/repo/products/awips/trunk2'
#-- project groups to export out -- will be arguments $5...
projects='cave cots edexOsgi nativeLib RadarServer Installer'
#----------------------------------------------------------------------
#-- decode the command line
#----------------------------------------------------------------------
if [ -n "${1}" ];then
bundle_fl=${1}
fi
if [ -n "${2}" ];then
delete_projects=${2}
fi
if [ -n "${3}" ];then
SHARE1=${3}
fi
if [ -n "${4}" ];then
connection=${4}
fi
if [ $# -gt 4 ];then
# there are projects listed
projects=${5}
shift 5
for a in $@;do
projects="${projects} ${a}"
done
fi
#----------------------------------------------------------------------
# get the bundles list from 'new-nightly-build-bundles'
#----------------------------------------------------------------------
if [ -n "${bundle_fl}" ];then
if [ ! -e ${bundle_fl} ];then
echo "bundle file '${bundle_fl}' not found -- no bundles will be processed"
bundles=
else
. ${bundle_fl}
bundles=`echo "${bundles}" | tr ' ' _`
bundles=`echo "${bundles}" | tr : ' '`
fi
else
echo "no bundle file specified -- no bundles will be processed"
fi
#----------------------------------------------------------------------
# function to determine if an installer project has special handling
# e.g. we want to create the code base installer before we compile
# the source code
#
# returns:
# 0 :: not a "special" project
# 1 :: is a "special" project
#----------------------------------------------------------------------
special() {
#just ignore code ant and eclipse since they aren't ready,
#javadoc is needed later for the ade, and master is not a 'real' installer
special_handling='javadoc code ant eclipse master'
ext=`echo ${1} | /usr/bin/cut -d. -f2`
count=`echo ${special_handling} | grep -cw ${ext}`
return `test ${count} -eq 0`
}
#----------------------------------------------------------------------
# function that records a build problem into a text file for later
# use. If the file doesn't already exist, it iw created with a
# header.
#
# args:
# $1 :: component
#----------------------------------------------------------------------
ERROR_COUNT=0
BUILD_DATE=`date "+%b %d %Y"`
problem() {
let ERROR_COUNT=ERROR_COUNT+1
message="encountered problems building component ${1} -- check log for details"
if [ ! -f /tmp/email.txt ];then
echo "${BUILD_DATE} Nightly Build Issues:" > /tmp/build-issues.txt
fi
echo "`date +%T`: ${message}" >> /tmp/build-issues.txt
}
#----------------------------------------------------------------------
# function to send an email in the event an error has occurred.
#
# args:
#----------------------------------------------------------------------
notify() {
mail_list="Kace_Chrisman mark_w_fegan Scott_Risch greg.armendariz"
subject="Nightly Build Issue -- ${BUILD_DATE}"
for a in ${mail_list};do
mail -s "${subject}" ${a}@raytheon.com < /tmp/build-issues.txt
done
}
#----------------------------------------------------------------------
# clear previous build-issues file
#----------------------------------------------------------------------
if [ -e /tmp/build-issues.txt ];then
rm -f /tmp/build-issues.txt
fi
#----------------------------------------------------------------------
# create directories needed for the build
#----------------------------------------------------------------------
output_dir=${SHARE1}/installers
install_files_dir=${output_dir}/install_files
components_dir=${output_dir}/install_files/components
#----------------------------------------------------------------------
# cleanup workspace -- if not done after last build
#----------------------------------------------------------------------
if [ -e all ]
then
rm -rf all
fi
mkdir -p all/
cd all
WORKING_DIR=`pwd`
mkdir -p ${components_dir}
#----------------------------------------------------------------------
# export the code baseline
#----------------------------------------------------------------------
echo "Exporting '${projects}'"
for p in $projects;do
echo "exporting project ${p}"
for a in `/usr/local/bin/svn list ${connection}/${p}`;do
if [ "${a}" != ".project" ];then
/usr/local/bin/svn export -q --force ${connection}/${p}/${a}
fi
done
done
#----------------------------------------------------------------------
# create the code base installer before building
# -- avoids including build products
#----------------------------------------------------------------------
#echo "building ADE Code base installer"
#cd ${WORKING_DIR}/Installer.code
#${ANT_HOME}/bin/ant -Dawips.cm.share=$SHARE1 buildAll
#rc=$?
#if [ $rc -ne 0 ];then
# problem "Installer.code"
#fi
#/bin/cp release~/*.jar ${components_dir}
#----------------------------------------------------------------------
# build the underlying projects
#----------------------------------------------------------------------
ECLIPSE_HOME=${WORKING_DIR}/uframe-eclipse
echo "building EDEX"
cd ${WORKING_DIR}/build.edex
./build.sh -eclipse=${ECLIPSE_HOME}
rc=$?
if [ $rc -ne 0 ];then
problem "build.edex"
fi
echo "building RCM"
cd ${WORKING_DIR}/build.rcm
./build.sh -eclipse=${ECLIPSE_HOME}
rc=$?
if [ $rc -ne 0 ];then
problem "build.rcm"
fi
echo "building CAVE"
cd ${WORKING_DIR}/build
./build.sh -eclipse=${ECLIPSE_HOME}
rc=$?
if [ $rc -ne 0 ];then
problem "build.cave"
fi
#----------------------------------------------------------------------
# build the installer projects
#----------------------------------------------------------------------
cd ${WORKING_DIR}
for a in `ls | grep Installer`;do
#-- Installer.master contains common resourses;
#-- Installer.javadoc needs to build later
#-- special() identifies projects that should be worked elsewhere
special ${a}
if [ $? -eq 0 ]; then
cd ${WORKING_DIR}/${a}
${ANT_HOME}/bin/ant -Dawips.cm.share=$SHARE1 buildAll
rc=$?
if [ $rc -ne 0 ];then
problem "${a}"
fi
/bin/cp release~/*.jar ${components_dir}
fi
done
#----------------------------------------------------------------------
# build the JavaDoc -- also copy to ADE installer directory
#----------------------------------------------------------------------
echo "building ADE JavaDoc installer"
cd ${WORKING_DIR}/Installer.javadoc
${ANT_HOME}/bin/ant -Dawips.cm.share=$SHARE1 buildAll
rc=$?
if [ $rc -ne 0 ];then
problem "Installer.javadoc"
fi
/bin/cp release~/*.jar ${components_dir}
# -- remove this once we switch to the final version of the installer builds
/bin/cp release~/*.jar ${output_dir}/ade
rm -rf ${output_dir}/ade/javadocs/*
rm -rf ${output_dir}/ade/otherdocs/*
/bin/cp -R temp~/build/jar/javadoc/api/* ${output_dir}/ade/javadocs
/bin/cp -R temp~/build/jar/docs/* ${output_dir}/ade/otherdocs
# ---------------------------------------------------------------------
# Build a new style deployment packages for workstation, ADE, EDEX
# ---------------------------------------------------------------------
echo "building bundle installers"
if [ -n "${bundles}" ];then
cd ${WORKING_DIR}/deploy.builder
for b in ${bundles};do
bundle=`echo ${b} | tr _ ' '`
./build ${bundle}
rc=$?
if [ $rc -ne 0 ];then
problem `echo ${bundle} | cut -d ' ' -f1`
fi
done
cp release~/*.jar ${install_files_dir}
cp release~/*.sh ${output_dir}
cp release~/*.txt ${output_dir}
chmod a+x ${output_dir}/*.sh
else
echo " no installer bundles specified"
fi
#----------------------------------------------------------------------
# check if emails need to be sent
#----------------------------------------------------------------------
if [ ${ERROR_COUNT} -ne 0 ]; then
notify
fi
#----------------------------------------------------------------------
# cleanup build -- will be added later
#----------------------------------------------------------------------
if [ "${delete_projects}" == "true" ];then
cd ${WORKING_DIR}/..
rm -rf all
fi