changeset 1779:49b183a11b59

Add script for creating release tarballs. Reviewed-by: vanaltj, omajid Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-June/014202.html
author Severin Gehwolf <sgehwolf@redhat.com>
date Tue, 23 Jun 2015 17:10:55 +0200
parents e0322f28f9c5
children fbfa76627b5d
files distribution/tools/create-release-tarball.sh
diffstat 1 files changed, 162 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/distribution/tools/create-release-tarball.sh	Tue Jun 23 17:10:55 2015 +0200
@@ -0,0 +1,162 @@
+#!/bin/bash
+#
+# Copyright 2012-2015 Red Hat, Inc.
+#
+# This file is part of Thermostat.
+#
+# Thermostat is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2, or (at your
+# option) any later version.
+#
+# Thermostat is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Thermostat; see the file COPYING.  If not see
+# <http://www.gnu.org/licenses/>.
+#
+# Linking this code with other modules is making a combined work
+# based on this code.  Thus, the terms and conditions of the GNU
+# General Public License cover the whole combination.
+#
+# As a special exception, the copyright holders of this code give
+# you permission to link this code with independent modules to
+# produce an executable, regardless of the license terms of these
+# independent modules, and to copy and distribute the resulting
+# executable under terms of your choice, provided that you also
+# meet, for each linked independent module, the terms and conditions
+# of the license of that module.  An independent module is a module
+# which is not derived from or based on this code.  If you modify
+# this code, you may extend this exception to your version of the
+# library, but you are not obligated to do so.  If you do not wish
+# to do so, delete this exception statement from your version.
+#
+#
+# Usage:
+#  ./create-release-tarball.sh {SNAPSHOT|RELEASE} [DESIRED_VERSION] [HG_USER]
+#
+# Tags the latest commit, creates the stand-alone integration test jar,
+# and creates a release tarball from the tagged version. Bumps the
+# version once again for further in-branch development.
+# 
+# Results are placed in distribution/target/release-tarball
+set -ex
+
+mvn=mvn
+hg=hg
+
+function usage() {
+  echo "Usage: ./create-release-tarball.sh {SNAPSHOT|RELEASE} [DESIRED_VERSION] [HG_USER]" 1>&2
+  exit 1
+}
+
+if [ $# -lt 1 ] || [ $# -gt 3 ]; then
+  usage
+fi
+
+# The first parameter determines if this script should tag the HG tree
+# or not:
+#   SNAPSHOT == no tagging
+#   RELEASE  == tag tree
+is_snapshot=false
+is_release=false
+source_type=$1
+if [ "${source_type}_" == "SNAPSHOT_" ]; then
+  is_snapshot=true
+elif [ "${source_type}_" == "RELEASE_" ]; then
+  is_release=true
+else
+  echo "First parameter must be SNAPSHOT or RELEASE." 1>&2
+  usage
+fi
+unset source_type
+
+# We need maven and mercurial (sed, awk and md5sum too, but we assume it's there)
+if ! type ${mvn}; then
+  echo "Maven (mvn) is required to run this script. ${mvn} not found in PATH=${PATH}." 1>&2
+  exit 1
+fi
+if ! type ${hg}; then
+  echo "Mercurial (hg) is required to run this script. ${hg} not found in PATH=${PATH}." 1>&2
+  exit 1
+fi
+if [ "${is_snapshot}_" == "true_" ]; then
+  if ! hg strip --help > /dev/null 2>&1; then
+    echo "Creating snapshot release tarball requires the HG strip extension." 1>&2
+    exit 1
+  fi
+fi 
+
+new_version=""
+hg_user=""
+if [ $# -gt 1 ]; then
+  new_version="$2"
+fi
+if [ $# -eq 3 ]; then
+  hg_user="$3"
+fi
+tools_dir="$(dirname $0)"
+results_dir="distribution/target/release-tarball"
+
+# Detect current version
+current_version=$(${mvn} -B org.apache.maven.plugins:maven-help-plugin:evaluate -Dexpression=project.version | grep -v '\[' | sed 's/-SNAPSHOT//')
+# Set new version
+if [ -z "${new_version}" ]; then
+  new_version=$(echo "${current_version}" | sed 's/\./ /g' | awk '{ print $1, $2, 1+$3}' | sed 's/ /\./g')
+fi
+if [ -z "${hg_user}" ]; then
+  hg_user="create-release-tarball-script"
+fi
+
+# Get the current revision so as to be able to reproduce
+# the tarball without a tag being pushed.
+base_revision="$(hg id -i)"
+
+${tools_dir}/update-version -r ${current_version} ${new_version}
+
+# Verify build is still OK.
+make for-release
+
+mkdir -p "${results_dir}"
+standalone_itest_jar=integration-tests/standalone/target/thermostat-integration-tests-standalone-${new_version}.jar
+cp ${standalone_itest_jar} "${results_dir}"/
+
+hg commit -u "${hg_user}" -m "Bump version for Thermostat release ${new_version}"
+hg tag -u "${hg_user}" ${new_version}
+hg archive -t tgz ${results_dir}/thermostat-${new_version}.tar.gz -r ${new_version}
+
+# Only do this for release invocations
+if [ "${is_release}_" == "true_" ]; then
+  # Bump version again for further in-tree development
+  after_new_version=$(echo "${new_version}" | sed 's/\./ /g' | awk '{ print $1, $2, 1+$3}' | sed 's/ /\./g')
+  ${tools_dir}/update-version -d ${new_version} ${after_new_version}
+  hg commit -u "${hg_user}" -m "Bump version to ${after_new_version} for further in branch development"
+else
+  # Strip tagging changesets since they won't get pushed
+  # anyway. This depends on the strip extension.
+  hg strip $(hg id -i --rev "children(${base_revision})")
+fi
+
+echo "Creating checksums"
+pushd ${results_dir}
+  md5sum thermostat-${new_version}.tar.gz > thermostat-${new_version}.tar.gz.md5
+  md5sum thermostat-integration-tests-standalone-${new_version}.jar > thermostat-integration-tests-standalone-${new_version}.jar.md5
+popd
+
+# Provide a recipe for re-creating the same source tarball
+cat > "${results_dir}/create-sourcetarball-recipe.txt" <<EOF
+# In order re-create the source tarball do the following
+hg clone <thermostat-tree> thermostat
+pushd thermostat
+hg update ${base_revision}
+${tools_dir}/update-version -r ${current_version} ${new_version}
+hg commit -u "${hg_user}" -m "Bump version for Thermostat release ${new_version}"
+hg tag -u "${hg_user}" ${new_version}
+hg archive -t tgz thermostat-${new_version}.tar.gz -r ${new_version}
+popd
+EOF
+
+echo "All done. Results can be found in directory: ${results_dir}"