X-Git-Url: https://code.grnet.gr/git/aquarium/blobdiff_plain/6b2c8be795439c64461701f92458ae69864b6336..refs/heads/snapshots:/make-dist.sh diff --git a/make-dist.sh b/make-dist.sh index 88f10a4..144384f 100755 --- a/make-dist.sh +++ b/make-dist.sh @@ -1,68 +1,262 @@ -#!/usr/bin/env bash +#!/bin/bash -# For debugging -clear -# set -x -LOG=build.log +# Copyright 2012 GRNET S.A. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# The views and conclusions contained in the software and documentation are +# those of the authors and should not be interpreted as representing official +# policies, either expressed or implied, of GRNET S.A. + +# Make an Aquarium binary distribution out of current working directory. +# Use at your own risk (i.e. make sure it compiles etc). + +WHERE=`dirname $0` +SHAFULL=`git rev-parse HEAD` +SHA=`echo $SHAFULL | cut -c 1-11` +DATE_FORMAT=+'%Y%m%d%H%M%S' +NOW=`date $DATE_FORMAT` +DIST=aquarium-$SHA +SERVER_SCRIPTS_SRC=$WHERE/scripts +CONF_SRC=$WHERE/src/main/resources +ARG1="$1" + +ERROR="" +P_VERBOSE="no" +P_PROPS="" +P_BUILD="normal" +P_KEEPDIST="no" +P_FAKEIT="no" +P_ARCHIVE="" +P_OFFLINE="no" +MVN_OPTS="" + +verbose() { + if [ "$P_VERBOSE" = "yes" ]; then + echo "$@" + fi +} + +verbose_p() { + verbose "Build type :" $P_BUILD + verbose "Custom configuration:" $P_PROPS + verbose "Keep dist/ folder :" $P_KEEPDIST + verbose "Custom achive name :" $P_ARCHIVE + verbose "Fake it :" $P_FAKEIT + verbose "maven offline mode :" $P_OFFLINE +} fail() { echo "failed while $1" - echo "last log lines are" - tail -n 15 $LOG - echo "see file $LOG for details" - cleanup exit 1 } -cleanup() { - git checkout master 2>>$LOG 1>>$LOG - if [ -f stashed ]; then - git stash pop 2>>$LOG 1>>$LOG - rm stashed - fi +makedistname() { + if [ -n "$P_ARCHIVE" ]; then + DIST="$P_ARCHIVE" + fi +} + +removedist() { + local KEEP=$1 + if [ "$KEEP" = "no" -a -e $DIST ]; then + echo Folder $DIST exists. Removing it. + rm -rf "$DIST" + fi +} + +createdist() { + echo + echo Creating dist dirs + + mkdir -pv $DIST + mkdir -pv $DIST/bin + mkdir -pv $DIST/lib + mkdir -pv $DIST/conf + mkdir -pv $DIST/logs } -# Check if there are pending changes -status=`git status --porcelain|grep -v "??"` -if [ ! -z "$status" ]; then - echo "The following files are not committed:" - echo - echo $status +clean() { + if [ "$P_BUILD" = "normal" ]; then echo - echo "Stashing them" - git stash save 2>&1 >>$LOG - touch stashed -fi + echo "===============================" + echo "=== mvn clean =================" + echo "===============================" + echo + echo mvn ${MVN_OPTS} clean + mvn ${MVN_OPTS} clean || fail "cleaning compilation artifacts" + echo + elif [ "$P_BUILD"="fast" ]; then + echo + echo "===============================" + echo "=== NOT executing mvn clean ===" + echo "===============================" + echo + fi +} -# Get latest tag -tag=`git tag |tail -n 1` +collectdeps() { + if [ "$P_BUILD" = "normal" ]; then + echo mvn ${MVN_OPTS} dependency:copy-dependencies + mvn ${MVN_OPTS} dependency:copy-dependencies + fi -DIR="$tag" + cp target/dependency/*.jar $DIST/lib || fail "collecting dependencies" +} -# Creating dist dirs -mkdir -p $DIR -mkdir -p $DIR/bin -mkdir -p $DIR/lib -mkdir -p $DIR/conf -mkdir -p $DIR/logs +build() { + echo + echo "===============================" + echo "=== mvn package ===============" + echo "===============================" + echo + echo mvn ${MVN_OPTS} package -DskipTests + mvn ${MVN_OPTS} package -DskipTests && { + echo + echo "Copying Aquarium classes" + aquariumjar=`find target -type f|egrep "aquarium-[0-9\.]+(-SNAPSHOT)?\.jar"` + cp $aquariumjar $DIST/lib || fail "copying $aquariumjar" + } || fail "building" +} + +collectconf() { + echo + echo Copying config files from $CONF_SRC + echo + cp $CONF_SRC/policy.json $DIST/conf || fail "copying policy.json" +# cp $CONF_SRC/roles-agreements.map $DIST/conf || fail "copying roles-agreements.map" + + if [ -n "$P_PROPS" ]; then + cp $P_PROPS $DIST/conf/aquarium.properties || fail "copying $P_PROPS" + else + cp $CONF_SRC/aquarium.properties $DIST/conf || fail "copying aquarium.properties" + fi +} + +collectscripts() { + echo + echo Copying scripts from $SERVER_SCRIPTS_SRC + echo + cp $SERVER_SCRIPTS_SRC/aquarium.sh $DIST/bin || fail "copying aquarium.sh" + cp $SERVER_SCRIPTS_SRC/start.sh $DIST/bin || fail "copying start.sh" + cp $SERVER_SCRIPTS_SRC/stop.sh $DIST/bin || fail "copying stop.sh" +} -echo "Checking out $tag" -git checkout $tag 2>>$LOG 1>>$LOG || fail "checking out" +gitmark() { + echo $SHAFULL > $DIST/gitsha.txt +} -echo "Building $tag" -mvn clean install -DskipTests=true >>build.log || fail "building project" +archive() { + ARC="${DIST}.tar.gz" -echo "Collecting dependencies" -mvn dependency:copy-dependencies >> build.log || fail "collecting dependencies" -cp target/dependency/*.jar $DIR/lib + if [ -e "$ARC" ]; then + echo + echo Removing previous $ARC + rm "$ARC" + fi + echo + echo "Creating archive" + tar zcvf "$ARC" $DIST/ || fail "creating archive" + echo "File $ARC created succesfully" + echo "Cleaning up" + ls -al "$ARC" +} -echo "Creating archive" -tar zcvf $tag.tar.gz $DIR >> build.log 2>&1 || fail "creating archive" +usage() { + echo "Usage: $0 [options]" + echo "" + echo "OPTIONS:" + echo " -a NAME Use archive NAME." + echo " The full name will be NAME.tar.gz." + echo " -b TYPE Use build TYPE. One of 'normal', 'fast'." + echo " 'normal' is the default and can be omitted." + echo " 'fast' means that it will not run mvn clean." + echo " -c FILE Use FILE as aquarium.properties configuration." + echo " -k Keep generated dist folder." + echo " -h Show this message." + echo " -n As in make -n." + echo " -o Use mvn in offline mode (--offline, -o)" + echo " -v Be verbose." -echo "Cleaning up" -rm -Rf $DIR -cleanup -rm $LOG + exit 0 +} + +while getopts ":a:b:hkc:nov" opt +do + case $opt in + a) P_ARCHIVE=$OPTARG + ;; + b) P_BUILD=$OPTARG + ;; + c) P_PROPS=$OPTARG + ;; + h) usage + ;; + k) P_KEEPDIST="yes" + ;; + n) P_FAKEIT="yes" + ;; + o) P_OFFLINE="yes"; MVN_OPTS="-o" + ;; + v) P_VERBOSE="yes" + ;; + :) ERROR="Option -$OPTARG requires an argument. Aborting..." + ;; + \?) ERROR="Invalid option: -$OPTARG" + ;; + esac +done + +if [ -n "$ERROR" ]; then + echo $ERROR >&2 + exit 1 +fi + +if [ -n "$P_PROPS" -a ! -f "$P_PROPS" ]; then + echo $P_PROPS is not a file. Aborting... >&2 + exit 1 +fi + +if [ ! "$P_BUILD" = "normal" -a ! "$P_BUILD" = "fast" ]; then + echo Build type must be one of normal, fast. $P_BUILD was given. Aborting... >&2 + exit 1 +fi + +if [ "$P_FAKEIT" = "yes" ]; then + P_VERBOSE=yes verbose_p + exit 0 +fi -echo "File $tag.tar.gz created succesfully" -# vim: set sta sts=4 shiftwidth=4 sw=4 et ai : +verbose_p && \ +makedistname && \ +removedist no && \ +createdist && \ +clean && \ +build && \ +collectdeps && \ +collectconf && \ +collectscripts && \ +gitmark && \ +archive && \ +removedist $P_KEEPDIST