| #!/bin/bash |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| function usage() { |
| cat << USAGE |
| Usage: ./package.sh -d DISTRO [OPTIONS]... |
| Package CloudStack for specific distribution and provided options. |
| |
| If there's a "branding" string in the POM version (e.g. x.y.z.a-NAME[-SNAPSHOT]), the branding name will |
| be used in the final generated package like: cloudstack-management-x.y.z.a-NAME.NUMBER.el7.centos.x86_64 |
| note that you can override/provide "branding" string with "-b, --brand" flag as well. |
| |
| Mandatory arguments: |
| -d, --distribution string Build package for specified distribution ("centos7") |
| |
| Optional arguments: |
| -p, --pack string Define which type of libraries to package ("oss"|"OSS"|"noredist"|"NOREDIST") (default "oss") |
| - oss|OSS to package with only redistributable libraries |
| - noredist|NOREDIST to package with non-redistributable libraries |
| -r, --release integer Set the package release version (default is 1 for normal and prereleases, empty for SNAPSHOT) |
| -s, --simulator string Build package for Simulator ("default"|"DEFAULT"|"simulator"|"SIMULATOR") (default "default") |
| -b, --brand string Set branding to be used in package name (it will override any branding string in POM version) |
| -T, --use-timestamp Use epoch timestamp instead of SNAPSHOT in the package name (if not provided, use "SNAPSHOT") |
| -t --templates Passes necessary flag to package the required templates. Comma separated string - kvm,xen,vmware,ovm,hyperv |
| |
| Other arguments: |
| -h, --help Display this help message and exit |
| |
| Examples: |
| package.sh --distribution centos7 |
| package.sh --distribution centos7 --pack oss |
| package.sh --distribution centos7 --pack noredist |
| package.sh --distribution centos7 --pack noredist -t "kvm,xen" |
| package.sh --distribution centos7 --release 42 |
| package.sh --distribution centos7 --pack noredist --release 42 |
| |
| USAGE |
| exit 0 |
| } |
| |
| PWD=$(cd $(dirname "$0") && pwd -P) |
| NOW="$(date +%s)" |
| |
| # packaging |
| # $1 redist flag |
| # $2 simulator flag |
| # $3 distribution name |
| # $4 package release version |
| # $5 brand string to apply/override |
| # $6 use timestamp flag |
| function packaging() { |
| RPMDIR=$PWD/../dist/rpmbuild |
| PACK_PROJECT=cloudstack |
| |
| if [ -n "$1" ] ; then |
| DEFOSSNOSS="-D_ossnoss $1" |
| fi |
| if [ -n "$2" ] ; then |
| DEFSIM="-D_sim $2" |
| fi |
| if [ "$6" == "true" ]; then |
| INDICATOR="$NOW" |
| else |
| INDICATOR="SNAPSHOT" |
| fi |
| |
| DISTRO=$3 |
| |
| MVN=$(which mvn) |
| if [ -z "$MVN" ] ; then |
| MVN=$(locate bin/mvn | grep -e mvn$ | tail -1) |
| if [ -z "$MVN" ] ; then |
| echo -e "mvn not found\n cannot retrieve version to package\n RPM Build Failed" |
| exit 2 |
| fi |
| fi |
| |
| VERSION=$(cd $PWD/../; $MVN org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression=project.version | grep --color=none '^[0-9]\.') |
| REALVER=$(echo "$VERSION" | cut -d '-' -f 1) |
| |
| if [ -n "$5" ]; then |
| BRAND="${5}." |
| else |
| BASEVER=$(echo "$VERSION" | sed 's/-SNAPSHOT//g') |
| BRAND=$(echo "$BASEVER" | cut -d '-' -f 2) |
| |
| if [ "$REALVER" != "$BRAND" ]; then |
| BRAND="${BRAND}." |
| else |
| BRAND="" |
| fi |
| fi |
| |
| if echo "$VERSION" | grep -q SNAPSHOT ; then |
| if [ -n "$4" ] ; then |
| DEFREL="-D_rel ${BRAND}${INDICATOR}.$4" |
| else |
| DEFREL="-D_rel ${BRAND}${INDICATOR}" |
| fi |
| else |
| if [ -n "$4" ] ; then |
| DEFREL="-D_rel ${BRAND}$4" |
| else |
| DEFREL="-D_rel ${BRAND}1" |
| fi |
| fi |
| |
| if [ "$USE_TIMESTAMP" == "true" ]; then |
| # use timestamp instead of SNAPSHOT |
| if echo "$VERSION" | grep -q SNAPSHOT ; then |
| # apply/override branding, if provided |
| if [ "$BRANDING" != "" ]; then |
| VERSION=$(echo "$VERSION" | cut -d '-' -f 1) # remove any existing branding from POM version to be overriden |
| VERSION="$VERSION-$BRANDING-$NOW" |
| else |
| VERSION=`echo $VERSION | sed 's/-SNAPSHOT/-'$NOW'/g'` |
| fi |
| |
| branch=$(cd $PWD/../; git rev-parse --abbrev-ref HEAD) |
| (cd $PWD/../; ./tools/build/setnextversion.sh --version $VERSION --sourcedir . --branch $branch --no-commit) |
| fi |
| else |
| # apply/override branding, if provided |
| if [ "$BRANDING" != "" ]; then |
| VERSION=$(echo "$VERSION" | cut -d '-' -f 1) # remove any existing branding from POM version to be overriden |
| VERSION="$VERSION-$BRANDING" |
| |
| branch=$(cd $PWD/../; git rev-parse --abbrev-ref HEAD) |
| (cd $PWD/../; ./tools/build/setnextversion.sh --version $VERSION --sourcedir . --branch $branch --no-commit) |
| fi |
| fi |
| |
| DEFTEMP="-D_temp ''" |
| if [ "$TEMPLATES" != "" ]; then |
| if [[ ",$TEMPLATES," = *",all,"* ]]; then |
| DEFTEMP="-D_temp '-Dsystemvm-kvm -Dsystemvm-xen -Dsystemvm-vmware'" |
| else |
| TEMP=-Dsystemvm-"${TEMPLATES//,/" -Dsystemvm-"}" |
| DEFTEMP="-D_temp ${TEMP}" |
| fi |
| fi |
| |
| DEFFULLVER="-D_fullver $VERSION" |
| DEFVER="-D_ver $REALVER" |
| |
| echo "Preparing to package Apache CloudStack $VERSION" |
| |
| mkdir -p "$RPMDIR/SPECS" |
| mkdir -p "$RPMDIR/BUILD" |
| mkdir -p "$RPMDIR/RPMS" |
| mkdir -p "$RPMDIR/SRPMS" |
| mkdir -p "$RPMDIR/SOURCES/$PACK_PROJECT-$VERSION" |
| |
| echo ". preparing source tarball" |
| (cd $PWD/../; tar -c --exclude .git --exclude dist . | tar -C "$RPMDIR/SOURCES/$PACK_PROJECT-$VERSION" -x ) |
| (cd "$RPMDIR/SOURCES/"; tar -czf "$PACK_PROJECT-$VERSION.tgz" "$PACK_PROJECT-$VERSION") |
| |
| echo ". executing rpmbuild" |
| cp "$PWD/$DISTRO/cloud.spec" "$RPMDIR/SPECS" |
| |
| (cd "$RPMDIR"; rpmbuild --define "_topdir ${RPMDIR}" "${DEFVER}" "${DEFFULLVER}" "${DEFREL}" ${DEFPRE+"$DEFPRE"} ${DEFOSSNOSS+"$DEFOSSNOSS"} ${DEFSIM+"$DEFSIM"} ${DEFTEMP+"$DEFTEMP"} -bb SPECS/cloud.spec) |
| if [ $? -ne 0 ]; then |
| if [ "$USE_TIMESTAMP" == "true" ]; then |
| (cd $PWD/../; git reset --hard) |
| fi |
| echo "RPM Build Failed " |
| exit 3 |
| else |
| if [ "$USE_TIMESTAMP" == "true" ]; then |
| (cd $PWD/../; git reset --hard) |
| fi |
| echo "RPM Build Done" |
| fi |
| exit |
| } |
| |
| TARGETDISTRO="" |
| SIM="" |
| PACKAGEVAL="" |
| RELEASE="" |
| BRANDING="" |
| USE_TIMESTAMP="false" |
| |
| unrecognized_flags="" |
| |
| while [ -n "$1" ]; do |
| case "$1" in |
| -h | --help) |
| usage |
| exit 0 |
| ;; |
| |
| -p | --pack) |
| PACKAGEVAL=$2 |
| if [ "$PACKAGEVAL" == "oss" -o "$PACKAGEVAL" == "OSS" ] ; then |
| PACKAGEVAL="" |
| elif [ "$PACKAGEVAL" == "noredist" -o "$PACKAGEVAL" == "NOREDIST" ] ; then |
| PACKAGEVAL="noredist" |
| else |
| echo "Error: Unsupported value for --pack" |
| usage |
| exit 1 |
| fi |
| shift 2 |
| ;; |
| |
| -s | --simulator) |
| SIM=$2 |
| if [ "$SIM" == "default" -o "$SIM" == "DEFAULT" ] ; then |
| SIM="false" |
| elif [ "$SIM" == "simulator" -o "$SIM" == "SIMULATOR" ] ; then |
| SIM="simulator" |
| else |
| echo "Error: Unsupported value for --simulator" |
| usage |
| exit 1 |
| fi |
| shift 2 |
| ;; |
| |
| -d | --distribution) |
| TARGETDISTRO=$2 |
| if [ -z "$TARGETDISTRO" ] ; then |
| echo "Error: Missing target distribution" |
| usage |
| exit 1 |
| fi |
| shift 2 |
| ;; |
| |
| -r | --release) |
| RELEASE=$2 |
| shift 2 |
| ;; |
| |
| -b | --brand) |
| BRANDING=$2 |
| shift 2 |
| ;; |
| |
| -T | --use-timestamp) |
| USE_TIMESTAMP="true" |
| shift 1 |
| ;; |
| |
| -t | --templates) |
| TEMPLATES=$2 |
| shift 1 |
| ;; |
| |
| -*) |
| unrecognized_flags="${unrecognized_flags}$1 " |
| shift 1 |
| ;; |
| |
| *) |
| shift 1 |
| ;; |
| esac |
| done |
| |
| if [ -n "$unrecognized_flags" ]; then |
| echo "Warning: Unrecognized option(s) found \" ${unrecognized_flags}\"" |
| echo " You're advised to fix your build job scripts and prevent using these" |
| echo " flags, as in the future release(s) they will break packaging script." |
| echo "" |
| fi |
| |
| # Fail early if working directory is NOT clean and --use-timestamp was provided |
| if [ "$USE_TIMESTAMP" == "true" ]; then |
| if [ -n "$(cd $PWD/../; git status -s)" ]; then |
| echo "Erro: You have uncommitted changes and asked for --use-timestamp to be used." |
| echo " --use-timestamp flag is going to temporarily change POM versions and" |
| echo " revert them at the end of build, and there's no way we can do partial" |
| echo " revert. Please commit your changes first or omit --use-timestamp flag." |
| exit 1 |
| fi |
| fi |
| |
| echo "Packaging CloudStack..." |
| packaging "$PACKAGEVAL" "$SIM" "$TARGETDISTRO" "$RELEASE" "$BRANDING" "$USE_TIMESTAMP" |