| #!/bin/bash |
| |
| echo "" |
| echo "-----------------------------------------------" |
| echo " Verify Environment" |
| |
| requiredExecutable() { |
| hash $1 2>/dev/null |
| if [ $? != 0 ] ; then |
| echo "ERROR: $1 not found. Install $1" |
| exit -1 |
| fi |
| } |
| |
| requiredExecutable "git" |
| requiredExecutable "xmllint" |
| requiredExecutable "sed" |
| requiredExecutable "gpg" |
| requiredExecutable "egrep" |
| requiredExecutable "mvn" |
| |
| proceedyn() { |
| while true; do |
| read -p "$1 " yn |
| case ${yn:-$2} in |
| [Yy]* ) return 0;; |
| [Nn]* ) return 1;; |
| * ) echo "Please answer yes or no.";; |
| esac |
| done |
| } |
| |
| echo "" |
| echo "-----------------------------------------------" |
| echo " Collect Information About Release" |
| |
| function gitFindRemoteByUrl() { |
| URL="$1" |
| for GREMOTE in $(git remote); do |
| git ls-remote --get-url $GREMOTE | grep "$URL" 2>&1 > /dev/null |
| if [ $? -eq 0 ] ; then |
| echo $GREMOTE |
| fi |
| done |
| return 0 |
| } |
| |
| GIT_REMOTE_URL="git.eclipse.org/gitroot/jetty/org.eclipse.jetty.project.git" |
| GIT_REMOTE_ID=$(gitFindRemoteByUrl "$GIT_REMOTE_URL") |
| GIT_BRANCH_ID=$(git symbolic-ref -q --short HEAD || git describe --tags --exact-match) |
| |
| if [ -z "$GIT_REMOTE_ID" ] ; then |
| echo "ERROR: Unable to determine git remote id for $GIT_REMOTE_URL" |
| echo "Are you running this build from a properly cloned git local repository?" |
| exit -1 |
| fi |
| |
| # Ensure that git user is in their gpg key list |
| GIT_USER_EMAIL=`git config --get user.email` |
| |
| #gpg -q --list-keys "$GIT_USER_EMAIL" 2>&1 > /dev/null |
| #if [ $? != 0 ] ; then |
| # echo "ERROR: git user.email of $GIT_USER_EMAIL is not present in your gpg --list-keys" |
| # echo "Go ahead and make one $ gpg --gen-key" |
| # exit -1 |
| #fi |
| |
| VER_CURRENT=`sed -e "s/xmlns/ignore/" pom.xml | xmllint --xpath "/project/version/text()" -` |
| read -e -p "Release Version ? " VER_RELEASE |
| read -e -p "Next Dev Version ? " VER_NEXT |
| # VER_RELEASE=9.3.5.v20151012 |
| # VER_NEXT=9.3.6-SNAPSHOT |
| TAG_NAME="jetty-$VER_RELEASE" |
| |
| # Ensure tag doesn't exist (yet) |
| git rev-parse --quiet --verify "$TAG_NAME" 2>&1 > /dev/null |
| if [ $? -eq 0 ] ; then |
| echo "" |
| echo "ERROR: Git Tag $TAG_NAME already exists" |
| echo "" |
| git show -s "$TAG_NAME" |
| exit -1 |
| fi |
| |
| ALT_DEPLOY_DIR=$HOME/.m2/alt-deploy |
| if [ ! -d "$ALT_DEPLOY_DIR" ] ; then |
| mkdir -p "$ALT_DEPLOY_DIR" |
| fi |
| |
| # DEPLOY_OPTS="-Dmaven.test.failure.ignore=true" |
| DEPLOY_OPTS="-Dtest=None" |
| # DEPLOY_OPTS="$DEPLOY_OPTS -DaltDeploymentRepository=intarget::default::file://$ALT_DEPLOY_DIR/" |
| |
| echo "" |
| echo "-----------------------------------------------" |
| echo " Release Plan Review" |
| echo "" |
| echo "Git Remote ID : $GIT_REMOTE_ID" |
| echo "Git Branch ID : $GIT_BRANCH_ID" |
| echo "Git user.email : $GIT_USER_EMAIL" |
| echo "Current Version : $VER_CURRENT" |
| echo "Release Version : $VER_RELEASE" |
| echo "Next Dev Version : $VER_NEXT" |
| echo "Tag name : $TAG_NAME" |
| echo "Maven Deploy Opts: $DEPLOY_OPTS" |
| |
| reportMavenTestFailures() { |
| failFiles=$(egrep -lr --include="*.txt" -E "^Tests .* FAILURE" .) |
| oldIFS="$IFS" |
| IFS=' |
| ' |
| IFS=${IFS:0:1} |
| failarray=( $failFiles ) |
| IFS="$oldIFS" |
| |
| for index in ${!failarray[@]}; do |
| echo ${failarray[index]} |
| cat ${failarray[index]} |
| done |
| |
| if [ ${#failarray[@]} -gt 0 ] ; then |
| echo "There are ${#failarray[@]} Test Cases with failures" |
| else |
| echo "There are no testcases with failures" |
| fi |
| } |
| |
| echo "" |
| if proceedyn "Are you sure you want to release using above? (y/N)" n; then |
| echo "" |
| if proceedyn "Update VERSION.txt for $VER_RELEASE? (Y/n)" y; then |
| mvn -N -Pupdate-version |
| cp VERSION.txt VERSION.txt.backup |
| cat VERSION.txt.backup | sed -e "s/$VER_CURRENT/$VER_RELEASE/" > VERSION.txt |
| rm VERSION.txt.backup |
| fi |
| |
| # This is equivalent to 'mvn release:prepare' |
| if proceedyn "Update project.versions for $VER_RELEASE? (Y/n)" y; then |
| mvn org.codehaus.mojo:versions-maven-plugin:2.1:set \ |
| -DoldVersion="$VER_CURRENT" \ |
| -DnewVersion="$VER_RELEASE" |
| fi |
| if proceedyn "Commit $VER_RELEASE updates? (Y/n)" y; then |
| git commit -a -m "Updating to version $VER_RELEASE" |
| fi |
| if proceedyn "Create Tag $TAG_NAME? (Y/n)" y; then |
| echo "TODO: Sign tags with GIT_USER_EMAIL=$GIT_USER_EMAIL" |
| git tag -m "Creating tag $TAG_NAME" $TAG_NAME |
| fi |
| |
| # This is equivalent to 'mvn release:perform' |
| if proceedyn "Build/Deploy from tag $TAG_NAME? (Y/n)" y; then |
| git checkout $TAG_NAME |
| mvn clean package source:jar javadoc:jar gpg:sign deploy \ |
| -Peclipse-release $DEPLOY_OPTS |
| reportMavenTestFailures |
| git checkout $GIT_BRANCH_ID |
| fi |
| if proceedyn "Update working directory for $VER_NEXT? (Y/n)" y; then |
| echo "Update VERSION.txt for $VER_NEXT" |
| cp VERSION.txt VERSION.txt.backup |
| echo "jetty-$VER_NEXT" > VERSION.txt |
| echo "" >> VERSION.txt |
| cat VERSION.txt.backup >> VERSION.txt |
| echo "Update project.versions for $VER_NEXT" |
| mvn org.codehaus.mojo:versions-maven-plugin:2.1:set \ |
| -DoldVersion="$VER_RELEASE" \ |
| -DnewVersion="$VER_NEXT" |
| echo "Commit $VER_NEXT" |
| if proceedyn "Commit updates in working directory for $VER_NEXT? (Y/n)" y; then |
| git commit -a -m "Updating to version $VER_NEXT" |
| fi |
| fi |
| if proceedyn "Push git commits to remote $GIT_REMOTE_ID? (Y/n)" y; then |
| git push $GIT_REMOTE_ID $GIT_BRANCH_ID |
| git push $GIT_REMOTE_ID --tags |
| fi |
| else |
| echo "Not performing release" |
| fi |
| |
| |