#!/bin/sh # # This script builds a delivery # # Parameters: # $1: target directory # $2: build type (dev, rel) # $3: SVN location (trunk, tags, branches) # $4: delivery name # $5: delivery version # $6: branch identifier # # Environment variable that MUST be defined # by the calling script # # SVN_URL SVN_USER SVN_PASS # # Binaries # BIN_CHMOD="/bin/chmod" BIN_CUT="/bin/cut" BIN_ECHO="/bin/echo" BIN_GETDIST="/usr/bin/getdist" BIN_MKDIR="/bin/mkdir" BIN_RM="/bin/rm" BIN_SVN="/usr/bin/svn" BIN_TAR="/bin/tar" # # Parameters # TARGET_DIR="" BUILD_TYPE="" SVN_LOCATION="" SVN_DELIVERY="" SVN_VERSION="" SVN_BRANCH="" # # Internal variables # EXIT=0 BUILD=1 COMPONENTS="" SVN_LOG="" TARBALL_NAME="" # # Config variables # TARGET_OS="" FILES_TO_DELETE="" # # Functions # deletedir() # $1: dir to delete { DIR=$1 if [ -n "$DIR" ] ; then if [ "$DIR" != "/" ] ; then $BIN_RM -rf $DIR else $BIN_ECHO "-> The name of the directory to delete is '/' !!!" EXIT=1 fi else $BIN_ECHO "-> The name of the directory to delete is empty" EXIT=1 fi } readconfig() # $1: target directory # $2: build type (dev, rel) # $3: SVN location (trunk, tags, branches) # $4: delivery name # $5: delivery version # $6: branch identifier { if [ $EXIT -eq 0 ] ; then $BIN_ECHO "Reading configuration" if [ -z "$1" ] ; then $BIN_ECHO "-> Target directory parameter is missing" EXIT=1 else if [ -d $1 ] ; then TARGET_DIR=$1 else $BIN_ECHO "-> Target directory '$1' does not exist" EXIT=1 fi fi if [ -z "$2" ] ; then $BIN_ECHO "-> Build type is missing" EXIT=1 else if [ "$2" != "dev" -a "$2" != "rel" ] ; then $BIN_ECHO "-> Build type '$2' is not supported" EXIT=1 else BUILD_TYPE=$2 fi fi if [ -z "$3" ] ; then $BIN_ECHO "-> SVN location parameter is missing" EXIT=1 else if [ "$3" != "trunk" -a "$3" != "tags" -a "$3" != "branches" ] ; then $BIN_ECHO "-> SVN location '$3' is not supported" EXIT=1 else SVN_LOCATION=$3 fi fi if [ -z "$4" ] ; then $BIN_ECHO "-> SVN delivery parameter is missing" EXIT=1 else SVN_DELIVERY=$4 fi if [ -z "$5" ] ; then if [ "$SVN_LOCATION" = "tags" -o "$SVN_LOCATION" = "branches" ] ; then $BIN_ECHO "-> SVN version parameter is missing" EXIT=1 fi else SVN_VERSION=$5 fi if [ -z "$6" ] ; then if [ "$SVN_LOCATION" = "branches" ] ; then $BIN_ECHO "-> SVN branch parameter is missing" EXIT=1 fi else SVN_BRANCH=$6 fi if [ -x $BIN_GETDIST ] ; then HOST_OS=`$BIN_GETDIST` else $BIN_ECHO "-> Binary '$BIN_GETDIST' is missing" EXIT=1 fi if [ ! -x $BIN_SVN ] ; then $BIN_ECHO "-> Binary '$BIN_SVN' is missing" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then case "$SVN_LOCATION" in trunk) SVN_VERSION="" SVN_BRANCH="" SVN_PATH_PACKAGE="trunk/delivery/$SVN_DELIVERY/package" SVN_LOG="$TARGET_DIR/delivery-$SVN_DELIVERY-trunk.svnlog" TARBALL_NAME=$SVN_DELIVERY-trunk ;; tags) SVN_BRANCH="" SVN_PATH_PACKAGE="tags/delivery/$SVN_DELIVERY/$SVN_VERSION/package" SVN_LOG="$TARGET_DIR/delivery-$SVN_DELIVERY-$SVN_VERSION.svnlog" TARBALL_NAME=$SVN_DELIVERY-$SVN_VERSION ;; branches) SVN_PATH_PACKAGE="branches/delivery/$SVN_DELIVERY/$SVN_VERSION-$SVN_BRANCH/package" SVN_LOG="$TARGET_DIR/delivery-$SVN_DELIVERY-$SVN_VERSION-$SVN_BRANCH.svnlog" TARBALL_NAME=$SVN_DELIVERY-$SVN_VERSION-$SVN_BRANCH ;; *) $BIN_ECHO "-> SVN location '$SVN_LOCATION' is not supported" EXIT=1 esac fi if [ $EXIT -eq 0 ] ; then if [ -e $TARGET_DIR/$TARBALL_NAME ] ; then $BIN_ECHO "-> Directory '$TARGET_DIR/$TARBALL_NAME' already exists" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then $BIN_RM -f $SVN_LOG fi if [ $EXIT -eq 0 ] ; then TMP_DIR="$TARGET_DIR/readconfig" if [ -e $TMP_DIR ] ; then $BIN_ECHO "-> Directory '$TMP_DIR' already exists" EXIT=1 else $BIN_MKDIR -p $TMP_DIR if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while creating directory '$TMP_DIR'" EXIT=1 fi fi fi if [ $EXIT -eq 0 ] ; then pushd $TMP_DIR >> /dev/null 2>&1 $BIN_ECHO -e "\n\n\n$BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$SVN_PATH_PACKAGE .\n\n\n" >> $SVN_LOG $BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$SVN_PATH_PACKAGE . >> $SVN_LOG 2>&1 if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while checkouting URL '$SVN_URL/$SVN_PATH_PACKAGE'" EXIT=1 fi popd >> /dev/null 2>&1 fi if [ $EXIT -eq 0 ] ; then if [ -e $TMP_DIR/config ] ; then TARGET_OS="" DEV_COMPONENTS="" REL_COMPONENTS="" . $TMP_DIR/config if [ "$BUILD_TYPE" = "dev" ] ; then COMPONENTS=$DEV_COMPONENTS else COMPONENTS=$REL_COMPONENTS fi else $BIN_ECHO "-> File '$TMP_DIR/config' is missing" EXIT=1 fi fi deletedir $TMP_DIR if [ $EXIT -eq 0 ] ; then echo "-> OK" fi } checkbuild() { if [ $EXIT -eq 0 ] ; then $BIN_ECHO "Checking delivery '$SVN_DELIVERY'" BUILD=0 if [ -z "$TARGET_OS" ] ; then BUILD=1 else for OS in $TARGET_OS ; do if [ "$OS" = "$HOST_OS" ] ; then BUILD=1 fi done fi if [ $BUILD -eq 1 ] ; then MESSAGE="Delivery need to be built for this OS" else MESSAGE="No need to build for this OS" fi fi if [ $EXIT -eq 0 ] ; then $BIN_ECHO "-> $MESSAGE" fi } buildcomponent() { if [ $EXIT -eq 0 ] ; then COMPONENT=$1 $BIN_ECHO "Preparing to build component '$COMPONENT'" COMPONENT_SVN_LOCATION=`$BIN_ECHO $COMPONENT | $BIN_CUT -d':' -f1` COMPONENT_SVN_COMPONENT=`$BIN_ECHO $COMPONENT | $BIN_CUT -d':' -f2` COMPONENT_SVN_VERSION="" COMPONENT_SVN_RELEASE="" COMPONENT_SVN_BRANCH="" if [ "$COMPONENT_SVN_LOCATION" != "trunk" ] ; then COMPONENT_SVN_VERSION_RELEASE_BRANCH=`$BIN_ECHO $COMPONENT | $BIN_CUT -d':' -f3` COMPONENT_SVN_VERSION=`$BIN_ECHO $COMPONENT_SVN_VERSION_RELEASE_BRANCH | $BIN_CUT -d'-' -f1` COMPONENT_SVN_RELEASE=`$BIN_ECHO $COMPONENT_SVN_VERSION_RELEASE_BRANCH | $BIN_CUT -d'-' -f2` if [ "$COMPONENT_SVN_LOCATION" = "branches" ] ; then COMPONENT_SVN_BRANCH=`$BIN_ECHO $COMPONENT_SVN_VERSION_RELEASE_BRANCH | $BIN_CUT -d'-' -f3` fi fi case "$COMPONENT_SVN_LOCATION" in trunk) COMPONENT_SVN_PATH_PACKAGE="trunk/component/$COMPONENT_SVN_COMPONENT/package" ;; tags) COMPONENT_SVN_PATH_PACKAGE="tags/component/$COMPONENT_SVN_COMPONENT/package/$COMPONENT_SVN_VERSION-$COMPONENT_SVN_RELEASE" ;; branches) COMPONENT_SVN_PATH_PACKAGE="branches/component/$COMPONENT_SVN_COMPONENT/package/$COMPONENT_SVN_VERSION-$COMPONENT_SVN_RELEASE-$COMPONENT_SVN_BRANCH" ;; *) $BIN_ECHO "-> SVN location '$COMPONENT_SVN_LOCATION' is not supported" EXIT=1 esac fi if [ $EXIT -eq 0 ] ; then TMP_DIR="$TARGET_DIR/buildcomponent" if [ -e $TMP_DIR ] ; then $BIN_ECHO "-> Directory '$TMP_DIR' already exists" EXIT=1 else $BIN_MKDIR -p $TMP_DIR/package if [ ! -d $TMP_DIR/package ] ; then $BIN_ECHO "-> Error while creating directory '$TMP_DIR/package'" EXIT=1 fi fi fi if [ $EXIT -eq 0 ] ; then pushd $TMP_DIR/package >> /dev/null 2>&1 $BIN_ECHO -e "\n\n\n$BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$COMPONENT_SVN_PATH_PACKAGE .\n\n\n" >> $SVN_LOG $BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$COMPONENT_SVN_PATH_PACKAGE . >> $SVN_LOG 2>&1 if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while checkouting URL '$SVN_URL/$COMPONENT_SVN_PATH_PACKAGE'" EXIT=1 fi popd >> /dev/null 2>&1 fi if [ $EXIT -eq 0 ] ; then if [ ! -e $TMP_DIR/package/config ] ; then $BIN_ECHO "-> The package configuration file '$TMP_DIR/package/config' is missing" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then . $TMP_DIR/package/config if [ -z "$VERSION" ] ; then $BIN_ECHO "-> Version of packaging scripts is missing" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then $BIN_MKDIR -p $TMP_DIR/packaging if [ ! -d $TMP_DIR/packaging ] ; then $BIN_ECHO "-> Error while creating directory '$TMP_DIR/packaging'" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then pushd $TMP_DIR/packaging >> /dev/null 2>&1 case "$COMPONENT_SVN_LOCATION" in trunk) COMPONENT_SVN_PATH_PACKAGING="trunk/packaging/component" ;; *) COMPONENT_SVN_PATH_PACKAGING="$COMPONENT_SVN_LOCATION/packaging/$VERSION/component" ;; esac $BIN_ECHO -e "\n\n\n$BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$COMPONENT_SVN_PATH_PACKAGING .\n\n\n" >> $SVN_LOG $BIN_SVN checkout --username $SVN_USER --password $SVN_PASS $SVN_URL/$COMPONENT_SVN_PATH_PACKAGING . >> $SVN_LOG 2>&1 if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while checkouting URL '$SVN_URL/$COMPONENT_SVN_PATH_PACKAGING'" EXIT=1 fi popd >> /dev/null 2>&1 fi if [ $EXIT -eq 0 ] ; then if [ ! -e $TMP_DIR/packaging/build ] ; then $BIN_ECHO "-> File '$TMP_DIR/packaging/build' is missing" EXIT=1 fi fi if [ $EXIT -eq 0 ] ; then $BIN_ECHO "-> OK" $BIN_CHMOD 755 $TMP_DIR/packaging/build $TMP_DIR/packaging/build "$TARGET_DIR/$TARBALL_NAME" "$COMPONENT_SVN_LOCATION" "$COMPONENT_SVN_COMPONENT" "$COMPONENT_SVN_VERSION" "$COMPONENT_SVN_RELEASE" "$COMPONENT_SVN_BRANCH" if [ $? -ne 0 ] ; then EXIT=1 fi fi deletedir $TMP_DIR } deletefiles() { if [ $EXIT -eq 0 ] ; then $BIN_ECHO "Deleting files for delivery '$SVN_DELIVERY'" if [ -n "$FILES_TO_DELETE" ] ; then pushd $TARGET_DIR/$TARBALL_NAME >> /dev/null 2>&1 $BIN_RM -f $FILES_TO_DELETE popd >> /dev/null 2>&1 $BIN_ECHO "-> OK" else $BIN_ECHO "-> No files to delete" fi fi } createtarball() { if [ $EXIT -eq 0 ] ; then $BIN_ECHO "Creating tarball for delivery '$SVN_DELIVERY'" pushd $TARGET_DIR >> /dev/null 2>&1 $BIN_TAR -czf $TARBALL_NAME.tar.gz $TARBALL_NAME if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while creating tarball" else $BIN_ECHO "-> OK" fi popd >> /dev/null 2>&1 fi } # # Main script # readconfig $1 $2 $3 $4 $5 $6 checkbuild if [ $BUILD -eq 1 ] ; then DELETE_TARBALL_DIR=0 if [ $EXIT -eq 0 ] ; then $BIN_MKDIR -p $TARGET_DIR/$TARBALL_NAME if [ $? -ne 0 ] ; then $BIN_ECHO "-> Error while creating directory '$TARGET_DIR/$TARBALL_NAME'" EXIT=1 else DELETE_TARBALL_DIR=1 fi fi for COMPONENT in $COMPONENTS ; do buildcomponent $COMPONENT done deletefiles createtarball if [ $DELETE_TARBALL_DIR -eq 1 ] ; then deletedir $TARGET_DIR/$TARBALL_NAME fi fi if [ $EXIT -ne 0 ] ; then $BIN_ECHO "" $BIN_ECHO "****************************************" $BIN_ECHO "Build of delivery '$SVN_DELIVERY' failed !" $BIN_ECHO "SVN log: $SVN_LOG" $BIN_ECHO "****************************************" fi exit $EXIT