123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- #!/bin/bash
- # error out if any statements fail
- set -e
- #set -x
- function usage() {
- echo "$0 [options] <tag> <user> <email>"
- echo
- echo " tag : Release tag (eg: 2.14.4, 2.15-beta1, ...)"
- echo " user: Git username"
- echo " email: Git email"
- echo
- echo "Options:"
- echo " -h : Print usage"
- echo " -b <branch> : Branch to release from (eg: trunk, 2.14.x, ...)"
- echo " -r <rev> : Revision to release (eg: 12345)"
- echo " -g <ver> : GeoTools version/revision (eg: 20.4, master:12345)"
- echo " -w <ver> : GeoWebCache version/revision (eg: 1.14.4, 1.14.x:abcd)"
- echo
- echo "Environment variables:"
- echo " SKIP_BUILD : Skips main release build"
- echo " SKIP_COMMUNITY : Skips community release build"
- echo " SKIP_TAG : Skips tag on release branch"
- echo " SKIP_GT : Skips the GeoTools build, as used to build revision"
- echo " SKIP_GWC : Skips the GeoWebCache build, as used to build revision"
- echo " MAVEN_FLAGS : Used to supply additional option, like -U or -X to build process."
- }
- # parse options
- while getopts "hb:r:g:w:" opt; do
- case $opt in
- h)
- usage
- exit
- ;;
- b)
- branch=$OPTARG
- ;;
- r)
- rev=$OPTARG
- ;;
- g)
- gt_ver=$OPTARG
- ;;
- w)
- gwc_ver=$OPTARG
- ;;
- \?)
- usage
- exit 1
- ;;
- :)
- echo "Option -$OPTARG requires an argument"
- exit 1
- ;;
- esac
- done
- # clear options to parse main arguments
- shift $(( OPTIND -1 ))
- tag=$1
- git_user=$2
- git_email=$3
- # sanity check
- if [ -z $tag ] || [ -z $git_user ] || [ -z $git_email ] || [ ! -z $4 ]; then
- usage
- exit 1
- fi
- # load properties + functions
- . "$( cd "$( dirname "$0" )" && pwd )"/properties
- . "$( cd "$( dirname "$0" )" && pwd )"/functions
- # more sanity checks
- if [ `is_version_num $tag` == "0" ]; then
- echo "$tag is a not a valid release tag"
- exit 1
- fi
- if [ `is_primary_branch_num $tag` == "1" ]; then
- echo "$tag is a not a valid release tag, can't be same as primary branch name"
- exit 1
- fi
- #checkout branch locally if it doesn't exist
- if ! git show-ref refs/heads/$branch; then
- echo "checkout branch #branch locally"
- git fetch origin $branch:$branch
- fi
- # ensure there is a jira release
- jira_id=`get_jira_id $tag`
- if [ -z $jira_id ]; then
- echo "Could not locate release $tag in JIRA"
- exit -1
- fi
- # move to root of source tree
- pushd .. > /dev/null
- dist=`pwd`/distribution/$tag
- mkdir -p $dist/plugins
- echo "Building release with following parameters:"
- echo " branch = $branch"
- echo " revision = $rev"
- echo " tag = $tag"
- echo " geotools = $gt_ver"
- echo " geowebcache = $gwc_ver"
- echo " jira id = $jira_id"
- echo " distribution = $dist"
- echo
- echo "maven/java settings:"
- mvn -version $MAVEN_FLAGS
- echo "maven opts:"
- echo "$MAVEN_OPTS"
- echo "maven flags:"
- echo "$MAVEN_FLAGS"
- echo "maven localRepository:"
- mvn help:evaluate $MAVEN_FLAGS -Dexpression=settings.localRepository -N --no-transfer-progress -B | grep -v '\[INFO\]'
- # clear out any changes
- git reset --hard HEAD
- # checkout and update primary branch
- git checkout $branch
- git pull origin $branch
- # check to see if a release branch already exists
- if [ `git branch --list rel_$tag | wc -l` == 1 ]; then
- echo "branch rel_$tag exists, deleting it"
- git branch -D rel_$tag
- fi
- # checkout the branch to release from
- git checkout $branch
- # ensure the specified revision actually on this branch
- if [ $rev != "HEAD" ]; then
- set +e
- git log | grep $rev
- if [ $? != 0 ]; then
- echo "Revision $rev not a revision on branch $branch"
- exit -1
- fi
- set -e
- fi
- # create a release branch
- git checkout -b rel_$tag $rev
- # setup geotools dependency
- if [ -z $SKIP_GT ]; then
- if [ ! -z $gt_ver ]; then
- # deterine if this is a revision or version number
- if [ "`is_version_num $gt_ver`" == "1" ]; then
- gt_tag=$gt_ver
- fi
- # if version specified as branch/revision check it out
- if [ -z $gt_tag ]; then
- arr=(${gt_ver//@/ })
- if [ "${#arr[@]}" != "2" ]; then
- echo "Bad version $gt_ver, must be specified as <branch>@<revision>"
- exit 1
- fi
- gt_branch=${arr[0]}
- gt_rev=${arr[1]}
- gt_dir=build/geotools/$gt_branch/$gt_rev
- if [ ! -e $gt_dir ]; then
- echo "cloning geotools repo from $GT_GIT_URL"
- git clone $GT_GIT_URL $gt_dir
- fi
- # checkout branch/rev
- pushd $gt_dir > /dev/null
- echo "checking out geotools ${gt_branch}@${gt_rev}"
- git checkout $gt_rev
- # build geotools
- mvn clean install $MAVEN_FLAGS -Dall -DskipTests
- popd > /dev/null
- # derive the gt version
- gt_tag=`get_pom_version $git_dir/pom.xml`
- fi
- fi
- fi
- if [ ! -z $gt_tag ]; then
- echo "GeoTools version = $gt_tag"
- fi
- # update geotools version
- if [ ! -z $gt_tag ]; then
- sed -i "s/\(<gt.version>\).*\(<\/gt.version>\)/\1$gt_tag\2/g" src/pom.xml
- else
- # look up from pom instead
- gt_tag=`cat src/pom.xml | grep "<gt.version>" | sed 's/ *<gt.version>\(.*\)<\/gt.version>/\1/g'`
- fi
- # setup geowebcache dependency
- if [ -z $SKIP_GWC ]; then
- if [ ! -z $gwc_ver ]; then
- # deterine if this is a revision or version number
- if [ "`is_version_num $gwc_ver`" == "1" ]; then
- gwc_tag=$gwc_ver
- fi
- # if version specified as branch/revision check it out
- if [ -z $gwc_tag ]; then
- arr=(${gwc_ver//@/ })
- if [ "${#arr[@]}" != "2" ]; then
- echo "Bad version $gwc_ver, must be specified as <branch>:<revision>"
- exit 1
- fi
- gwc_branch=${arr[0]}
- gwc_rev=${arr[1]}
- gwc_dir=build/geowebcache/$gwc_branch/$gwc_rev
- if [ ! -e $gwc_dir -o ! -e $gwc_dir/geowebcache ]; then
- rm -rf $gwc_dir
- mkdir -p $gwc_dir
- echo "checking out geowebache ${gwc_branch}@${gwc_rev}"
- git clone $GWC_GIT_URL $gwc_dir
- pushd $gwc_dir > /dev/null
- git checkout $gwc_rev
- popd > /dev/null
- fi
- # build geowebache
- pushd $gwc_dir/geowebcache > /dev/null
- mvn clean install $MAVEN_FLAGS -DskipTests
- # derive the gwc version
- gwc_tag=`get_pom_version pom.xml`
- popd > /dev/null
- fi
- fi
- fi
- if [ ! -z $gwc_tag ]; then
- echo "GeoWebCache version = $gwc_tag"
- fi
- # update geowebcache version
- if [ ! -z $gwc_tag ]; then
- sed -i "s/\(<gwc.version>\).*\(<\/gwc.version>\)/\1$gwc_tag\2/g" src/pom.xml
- else
- gwc_tag=`cat src/pom.xml | grep "<gwc.version>" | sed 's/ *<gwc.version>\(.*\)<\/gwc.version>/\1/g'`
- fi
- # update version numbers
- old_ver=`get_pom_version src/pom.xml`
- echo "updating version numbers from $old_ver to $tag"
- find src -name pom.xml -exec sed -i "s/$old_ver/$tag/g" {} \;
- find doc -name conf.py -exec sed -i "s/$old_ver/$tag/g" {} \;
- find doc -name pom.xml -exec sed -i "s/$old_ver/$tag/g" {} \;
- pushd src/release > /dev/null
- shopt -s extglob
- # sed -i "s/$old_ver/$tag/g" !(pom).xml installer/win/*.nsi installer/win/*.conf
- shopt -u extglob
- popd > /dev/null
- pushd src > /dev/null
- # build the release
- if [ -z $SKIP_BUILD ]; then
- echo "building release"
- mvn clean install $MAVEN_FLAGS -DskipTests -P release
-
- # build the javadocs
- mvn javadoc:aggregate $MAVEN_FLAGS
- ##################
- # Build the docs
- ##################
- pushd ../doc/en > /dev/null
- # ant clean user -Dproject.version=$tag
- # ant user-pdf -Dproject.version=$tag
- # ant developer -Dproject.version=$tag
- mvn clean compile $MAVEN_FLAGS
- mvn package $MAVEN_FLAGS
-
- popd > /dev/null
- else
- echo "Skipping mvn clean install $MAVEN_FLAGS -DskipTests -P release"
- fi
- if [ -z $SKIP_COMMUNITY ]; then
- pushd community > /dev/null
- set +e
- mvn clean install $MAVEN_FLAGS -P communityRelease -DskipTests || true
- set -e
- popd > /dev/null
- else
- echo "Skipping mvn clean install $MAVEN_FLAGS -P communityRelease -DskipTests"
- fi
- echo "Assemble artifacts"
- mvn assembly:single $MAVEN_FLAGS -N
- artifacts=`pwd`/target/release
- echo "artifacts = $artifacts"
- # bundle up mac and windows installer stuff
- pushd release/installer/mac > /dev/null
- zip -q -r $artifacts/geoserver-$tag-mac.zip *
- popd > /dev/null
- pushd release/installer/win > /dev/null
- zip -q -r $artifacts/geoserver-$tag-win.zip *
- popd > /dev/null
- pushd $artifacts > /dev/null
- htmldoc=geoserver-$tag-htmldoc.zip
- if [ -e ../../../doc/en/target/$htmldoc ]; then
- echo "Using $htmldoc assembly"
- # use assembly
- cp ../../../doc/en/target/$htmldoc $htmldoc
- else
- echo "Creating $htmldoc"
- # setup doc artifacts
- if [ -e user ]; then
- unlink user
- fi
- if [ -e developer ]; then
- unlink developer
- fi
- ln -sf ../../../doc/en/target/user/html user
- ln -sf ../../../doc/en/target/developer/html developer
- ln -sf ../../../doc/en/release/README.txt readme
- if [ -e $htmldoc ]; then
- rm -f $htmldoc
- fi
- zip -q -r $htmldoc user developer readme
- unlink user
- unlink developer
- unlink readme
- fi
- popd > /dev/null
- # stage distribution artifacts
- echo "copying artifacts to $dist"
- cp $artifacts/*-plugin.zip $dist/plugins
- for a in `ls $artifacts/*.zip | grep -v plugin`; do
- cp $a $dist
- done
- cp $artifacts/../../../doc/en/target/user/latex/manual.pdf $dist/geoserver-$tag-user-manual.pdf || true
- echo "generated artifacts:"
- ls -la $dist
- # git commit changes on the release branch
- pushd .. > /dev/null
- init_git $git_user $git_email
- git add doc
- git add src
- git commit -m "updating version numbers and release notes for $tag" .
- # tag release branch
- if [ -z $SKIP_TAG ]; then
- # fetch single tag, don't fail if its not there
- git fetch origin refs/tags/$tag:refs/tags/$tag --no-tags || true
- # check to see if tag already exists
- if [ `git tag --list $tag | wc -l` == 1 ]; then
- echo "tag $tag exists, deleting it"
- git tag -d $tag
- fi
- if [ `git ls-remote --refs --tags origin tags/$tag | wc -l` == 1 ]; then
- echo "tag $tag exists on $GIT_ROOT, deleting it"
- git push --delete origin $tag
- fi
- # tag the release branch
- git tag $tag
- # push up tag
- git push origin $tag
- fi
- popd > /dev/null
- popd > /dev/null
- echo "build complete, artifacts available at $DIST_URL/distribution/$tag"
- exit 0
|