| #!/usr/bin/env 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 exit_with_usage { |
| cat << EOF |
| release-build - Creates build distributions from a git commit hash or from HEAD. |
| SYNOPSIS |
| usage: release-build.sh [--release-prepare | --release-publish | --release-snapshot] |
| DESCRIPTION |
| Use maven infrastructure to create a project release package and publish |
| to staging release location (ToDo:release-location) |
| and maven staging release repository. |
| --release-prepare --releaseVersion="0.11.0" --developmentVersion="0.11.0-SNAPSHOT" [--releaseRc="rc1"] [--tag="v0.11.0"] [--gitCommitHash="a874b73"] |
| This form execute maven release:prepare and upload the release candidate distribution |
| to the staging release location. |
| --release-publish --gitCommitHash="a874b73" |
| Publish the maven artifacts of a release to the staging maven repository. |
| --release-snapshot [--gitCommitHash="a874b73"] |
| Publish the maven snapshot artifacts to snapshots maven repository |
| OPTIONS |
| --releaseVersion - Release identifier used when publishing |
| --developmentVersion - Release identifier used for next development cyce |
| --releaseRc - Release RC identifier used when publishing, default 'rc1' |
| --tag - Release Tag identifier used when taging the release, default 'v$releaseVersion' |
| --gitCommitHash - Release tag, branch name or commit to build from, default master HEAD |
| --dryRun - Dry run only, mostly used for testing. |
| A GPG passphrase is expected as an environment variable |
| GPG_PASSPHRASE - Passphrase for GPG key used to sign release |
| EXAMPLES |
| release-build.sh --release-prepare --releaseVersion="0.11.0" --developmentVersion="0.12.0-SNAPSHOT" |
| release-build.sh --release-prepare --releaseVersion="0.11.0" --developmentVersion="0.12.0-SNAPSHOT" --releaseRc="rc1" --tag="v0.11.0-rc1" |
| release-build.sh --release-prepare --releaseVersion="0.11.0" --developmentVersion="0.12.0-SNAPSHOT" --releaseRc="rc1" --tag="v0.11.0-rc1" --gitCommitHash="a874b73" --dryRun |
| # Create 0.12 RC2 builds from branch-0.12 |
| ./release-build.sh --release-prepare --releaseVersion="0.12.0" --developmentVersion="0.12.1-SNAPSHOT" --releaseRc="rc2" --tag="v0.12.0-rc2" --gitCommitHash="branch-0.12" |
| release-build.sh --release-publish --gitCommitHash="a874b73" |
| release-build.sh --release-publish --gitTag="v0.11.0-rc1" |
| release-build.sh --release-snapshot |
| release-build.sh --release-snapshot --gitCommitHash="a874b73" |
| EOF |
| exit 1 |
| } |
| |
| set -e |
| |
| if [ $# -eq 0 ]; then |
| exit_with_usage |
| fi |
| |
| |
| # Process each provided argument configuration |
| while [ "${1+defined}" ]; do |
| IFS="=" read -ra PARTS <<< "$1" |
| case "${PARTS[0]}" in |
| --release-prepare) |
| GOAL="release-prepare" |
| RELEASE_PREPARE=true |
| shift |
| ;; |
| --release-publish) |
| GOAL="release-publish" |
| RELEASE_PUBLISH=true |
| shift |
| ;; |
| --release-snapshot) |
| GOAL="release-snapshot" |
| RELEASE_SNAPSHOT=true |
| shift |
| ;; |
| --gitCommitHash) |
| GIT_REF="${PARTS[1]}" |
| shift |
| ;; |
| --gitTag) |
| GIT_TAG="${PARTS[1]}" |
| shift |
| ;; |
| --releaseVersion) |
| RELEASE_VERSION="${PARTS[1]}" |
| shift |
| ;; |
| --developmentVersion) |
| DEVELOPMENT_VERSION="${PARTS[1]}" |
| shift |
| ;; |
| --releaseRc) |
| RELEASE_RC="${PARTS[1]}" |
| shift |
| ;; |
| --tag) |
| RELEASE_TAG="${PARTS[1]}" |
| shift |
| ;; |
| --dryRun) |
| DRY_RUN="-DdryRun=true" |
| shift |
| ;; |
| |
| *help* | -h) |
| exit_with_usage |
| exit 0 |
| ;; |
| -*) |
| echo "Error: Unknown option: $1" >&2 |
| exit 1 |
| ;; |
| *) # No more options |
| break |
| ;; |
| esac |
| done |
| |
| if [[ -z "$GPG_PASSPHRASE" ]]; then |
| echo 'The environment variable GPG_PASSPHRASE is not set. Enter the passphrase to' |
| echo 'unlock the GPG signing key that will be used to sign the release!' |
| echo |
| stty -echo && printf "GPG passphrase: " && read GPG_PASSPHRASE && printf '\n' && stty echo |
| fi |
| |
| if [[ "$RELEASE_PREPARE" == "true" && -z "$RELEASE_VERSION" ]]; then |
| echo "ERROR: --releaseVersion must be passed as an argument to run this script" |
| exit_with_usage |
| fi |
| |
| if [[ "$RELEASE_PREPARE" == "true" && -z "$DEVELOPMENT_VERSION" ]]; then |
| echo "ERROR: --developmentVersion must be passed as an argument to run this script" |
| exit_with_usage |
| fi |
| |
| if [[ "$RELEASE_PUBLISH" == "true" ]]; then |
| if [[ "$GIT_REF" && "$GIT_TAG" ]]; then |
| echo "ERROR: Only one argumented permitted when publishing : --gitCommitHash or --gitTag" |
| exit_with_usage |
| fi |
| if [[ -z "$GIT_REF" && -z "$GIT_TAG" ]]; then |
| echo "ERROR: --gitCommitHash OR --gitTag must be passed as an argument to run this script" |
| exit_with_usage |
| fi |
| fi |
| |
| if [[ "$RELEASE_PUBLISH" == "true" && "$DRY_RUN" ]]; then |
| echo "ERROR: --dryRun not supported for --release-publish" |
| exit_with_usage |
| fi |
| |
| if [[ "$RELEASE_SNAPSHOT" == "true" && "$DRY_RUN" ]]; then |
| echo "ERROR: --dryRun not supported for --release-publish" |
| exit_with_usage |
| fi |
| |
| # Commit ref to checkout when building |
| GIT_REF=${GIT_REF:-master} |
| if [[ "$RELEASE_PUBLISH" == "true" && "$GIT_TAG" ]]; then |
| GIT_REF="tags/$GIT_TAG" |
| fi |
| |
| #(pwd) doesn't work for me due to having a space in the path |
| #BASE_DIR=$(pwd) |
| BASE_DIR="/c/virtual\ D/SystemDS/systemds" |
| RELEASE_WORK_DIR=$BASE_DIR/target/release2 |
| |
| MVN="mvn" |
| PUBLISH_PROFILES="-Pdistribution,rat" |
| |
| if [ -z "$RELEASE_RC" ]; then |
| RELEASE_RC="rc1" |
| fi |
| |
| if [ -z "$RELEASE_TAG" ]; then |
| RELEASE_TAG="v$RELEASE_VERSION-$RELEASE_RC" |
| fi |
| |
| #ToDo: release staging location |
| RELEASE_STAGING_LOCATION="${SYSTEMDS_ROOT}/temp" |
| |
| |
| echo " " |
| echo "-------------------------------------------------------------" |
| echo "------- Release preparation with the following parameters ---" |
| echo "-------------------------------------------------------------" |
| echo "Executing ==> $GOAL" |
| echo "Git reference ==> $GIT_REF" |
| echo "release version ==> $RELEASE_VERSION" |
| echo "development version ==> $DEVELOPMENT_VERSION" |
| echo "rc ==> $RELEASE_RC" |
| echo "tag ==> $RELEASE_TAG" |
| if [ "$DRY_RUN" ]; then |
| echo "dry run ? ==> true" |
| fi |
| echo " " |
| echo "Deploying to :" |
| echo $RELEASE_STAGING_LOCATION |
| echo " " |
| |
| function checkout_code { |
| # Checkout code |
| eval rm -rf $RELEASE_WORK_DIR |
| eval mkdir -p $RELEASE_WORK_DIR |
| eval cd $RELEASE_WORK_DIR |
| git clone https://github.com/apache/systemds.git |
| cd systemds |
| git checkout $GIT_REF |
| git_hash=`git rev-parse --short HEAD` |
| echo "Checked out SystemDS git hash $git_hash" |
| |
| git clean -d -f -x |
| #rm .gitignore |
| #rm -rf .git |
| |
| eval cd "$BASE_DIR" #return to base dir |
| } |
| |
| if [[ "$RELEASE_PREPARE" == "true" ]]; then |
| echo "Preparing release $RELEASE_VERSION" |
| # Checkout code |
| checkout_code |
| eval cd $RELEASE_WORK_DIR/systemds |
| #cd /c/virtual\ D/SystemDS/systemds/target/release/systemds |
| |
| # Build and prepare the release |
| # release:prepare only works on SNAPSHOT. Below command produces |
| # artifacts with -SNAPSHOT, and also commits the pom changes to the repo |
| $MVN $PUBLISH_PROFILES release:clean release:prepare $DRY_RUN \ |
| -Darguments="-Dgpg.passphrase=\"$GPG_PASSPHRASE\" \ |
| -DskipTests" \ |
| -DreleaseVersion="$RELEASE_VERSION" -DdevelopmentVersion="$DEVELOPMENT_VERSION" -Dtag="$RELEASE_TAG" |
| |
| # exit at this point to run followiing steps manually. |
| echo "WARNING: Set followinig enviornment variables and run rest of the steps for 'Release Prepare' " |
| echo |
| echo "MVN=$MVN" |
| echo "PUBLISH_PROFILES=\"$PUBLISH_PROFILES\"" |
| echo "DRY_RUN=$DRY_RUN" |
| echo "GPG_PASSPHRASE=$GPG_PASSPHRASE" |
| echo "RELEASE_VERSION=$RELEASE_VERSION" |
| echo "RELEASE_RC=$RELEASE_RC" |
| echo "DEVELOPMENT_VERSION=$DEVELOPMENT_VERSION" |
| echo "RELEASE_TAG=$RELEASE_TAG" |
| echo "RELEASE_WORK_DIR=$RELEASE_WORK_DIR" |
| echo "RELEASE_STAGING_LOCATION=$RELEASE_STAGING_LOCATION" |
| echo "BASE_DIR=$BASE_DIR" |
| |
| # As fix has been added below to update version information exit to update pom file is not needed. |
| # exit 5 |
| |
| # Update dev/release/target/release/systemds/pom.xml with similar to following contents which is for 0.13.0 RC1 |
| # Update <version>0.13.0</version> |
| # Update <tag>v0.13.0-rc1</tag> |
| #sed -i .bak "s|<version>$DEVELOPMENT_VERSION<\/version>|<version>$RELEASE_VERSION<\/version>|" $BASE_DIR/target/release/systemds/pom.xml |
| #sed -i .bak "s|<tag>HEAD<\/tag>|<tag>$RELEASE_TAG<\/tag>|" $BASE_DIR/target/release/systemds/pom.xml |
| |
| # Remove SNAPSHOT from the version in pom |
| sed -i "s/<version>$RELEASE_VERSION-SNAPSHOT<\/version>/<version>$RELEASE_VERSION<\/version>/" /c/virtual\ D/SystemDS/systemds/target/release2/systemds/pom.xml |
| eval cd $RELEASE_WORK_DIR/systemds |
| ## Rerunning mvn with clean and package goals, as release:prepare changes ordeer for some dependencies like unpack and shade. |
| $MVN $PUBLISH_PROFILES clean package $DRY_RUN \ |
| -Darguments="-Dgpg.passphrase=\"$GPG_PASSPHRASE\" \ |
| -DskipTests" \ |
| -DreleaseVersion="$RELEASE_VERSION" -DdevelopmentVersion="$DEVELOPMENT_VERSION" -Dtag="$RELEASE_TAG" \ |
| |
| # Pull the latest code (with committed pom changes) and deploy to the local target directory |
| checkout_code |
| # Remove SNAPSHOT from the version in pom |
| sed -i "s/<version>$RELEASE_VERSION-SNAPSHOT<\/version>/<version>$RELEASE_VERSION<\/version>/" /c/virtual\ D/SystemDS/systemds/target/release2/systemds/pom.xml |
| eval cd $RELEASE_WORK_DIR/systemds |
| GPG_OPTS="-Dgpg.keyname=$GPG_KEYID -Dgpg.passphrase=$GPG_PASSPHRASE" |
| # Deploy to /target folder for the next job to pick the artifacts up for there |
| CMD="$MVN $PUBLISH_PROFILES deploy \ |
| -DskiptTests \ |
| -DaltDeploymentRepository=altDepRepo::default::file:./target \ |
| ${GPG_OPTS}" |
| |
| echo "Executing: " "$CMD" |
| $CMD |
| |
| eval cd $RELEASE_WORK_DIR |
| # To upload the artifacts to the svn-staging (dist.apache.org), call |
| # the second script, svn_dev_upload.sh. |
| |
| # ToDo: release staging location |
| # if [ -z "$DRY_RUN" ]; then |
| # RELEASE_STAGING_LOCATION="https://dist.apache.org/repos/dist/dev/systemds/" |
| # svn co $RELEASE_STAGING_LOCATION svn-release-staging |
| # mkdir -p svn-release-staging/$RELEASE_VERSION-$RELEASE_RC |
| # cp $RELEASE_WORK_DIR/systemml/target/systemml-*-bin.* svn-release-staging/$RELEASE_VERSION-$RELEASE_RC/ |
| # cp $RELEASE_WORK_DIR/systemml/target/systemml-*-src.* svn-release-staging/$RELEASE_VERSION-$RELEASE_RC/ |
| # |
| # cd svn-release-staging/$RELEASE_VERSION-$RELEASE_RC/ |
| # rm -f *.asc |
| # for i in *.zip *.tgz *.tar.gz; do gpg --output $i.asc --detach-sig --armor $i; done |
| # rm -f *.sha512 |
| # for i in *.zip *.tgz *.tar.gz; do shasum -a 512 $i > $i.sha512; done |
| # |
| # cd .. #exit $RELEASE_VERSION-$RELEASE_RC/ |
| # |
| # svn add $RELEASE_VERSION-$RELEASE_RC/ |
| # svn ci -m"Apache SystemML $RELEASE_VERSION-$RELEASE_RC" |
| # fi |
| |
| |
| eval cd "$BASE_DIR" #exit target |
| |
| exit 0 |
| fi |
| |
| #ToDo: fix release deployment |
| if [[ "$RELEASE_PUBLISH" == "true" ]]; then |
| echo "Preparing release $RELEASE_VERSION" |
| # Checkout code |
| checkout_code |
| cd $RELEASE_WORK_DIR/systemds |
| |
| #Deploy scala 2.10 |
| # mvn -DaltDeploymentRepository=apache.releases.https::default::https://repository.apache.org/service/local/staging/deploy/maven2 clean package gpg:sign install:install deploy:deploy -DskiptTests -Darguments="-DskipTests -Dgpg.passphrase=\"$GPG_PASSPHRASE\"" -Dgpg.passphrase="$GPG_PASSPHRASE" $PUBLISH_PROFILES |
| |
| mvn -DaltDeploymentRepository=$SYSTEMDS_ROOT/temp clean package gpg:sign install:install deploy:deploy -DskiptTests -Darguments="-DskipTests -Dgpg.passphrase=\"$GPG_PASSPHRASE\"" -Dgpg.passphrase="$GPG_PASSPHRASE" $PUBLISH_PROFILES |
| |
| cd "$BASE_DIR" #exit target |
| |
| exit 0 |
| fi |
| |
| #ToDo: fix snapshot deployment |
| #if [[ "$RELEASE_SNAPSHOT" == "true" ]]; then |
| # # Checkout code |
| # checkout_code |
| # cd $RELEASE_WORK_DIR/systemds |
| # |
| # CURRENT_VERSION=$($MVN help:evaluate -Dexpression=project.version \ |
| # | grep -v INFO | grep -v WARNING | grep -v Download) |
| # |
| # # Publish Bahir Snapshots to Maven snapshot repo |
| # echo "Deploying SystemDS SNAPSHOT at '$GIT_REF' ($git_hash)" |
| # echo "Publish version is $CURRENT_VERSION" |
| # if [[ ! $CURRENT_VERSION == *"SNAPSHOT"* ]]; then |
| # echo "ERROR: Snapshots must have a version containing SNAPSHOT" |
| # echo "ERROR: You gave version '$CURRENT_VERSION'" |
| # exit 1 |
| # fi |
| # |
| # #Deploy scala 2.10 |
| # $MVN -DaltDeploymentRepository=apache.snapshots.https::default::https://repository.apache.org/content/repositories/snapshots clean package gpg:sign install:install deploy:deploy -DskiptTests -Darguments="-DskipTests -Dgpg.passphrase=\"$GPG_PASSPHRASE\"" -Dgpg.passphrase="$GPG_PASSPHRASE" $PUBLISH_PROFILES |
| # |
| # cd "$BASE_DIR" #exit target |
| # exit 0 |
| #fi |
| |
| |
| cd "$BASE_DIR" #return to base dir |
| echo "ERROR: wrong execution goals" |
| exit_with_usage |