blob: ba7b8972b1d73de7cebf7276270acea0b23c714e [file] [log] [blame]
#!/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.
#
#-------------------------------------------------------------
################################################################################
## File: release-build.sh
## Desc: Create Release artifacts
################################################################################
SELF=$(cd $(dirname $0) && pwd)
. "$SELF/release-utils.sh"
exit_with_usage() {
cat << EOF
usage: release-build.sh <package|docs>
Create build deliverables from a commit
Top level targets are
- package: create binary packages and commit them
to staging repo.
- docs: Build docs and commit them to staging repo
- publish-release: Build maven artifacts and publish to Maven Release Repo
- publish-staging: Publish to staging repository
GIT_REF - Release tag or commit to build from
PACKAGE_VERSION - Release identifier in top level package directory (eg. 2.1.2-rc1)
BUILD_VERSION - (optional) Version being built (eg. 2.1.2)
ASF_USERNAME - Username of ASF committer
ASF_PASSWORD - Password of ASF committer account
GPG_KEY - GPG key used to sign release artifacts
GPG_PASSPHRASE - Passphrase for GPG key
EOF
exit 1
}
if [ $# -eq 0 ]; then
echo "usage: release-build.sh <docs|publish-release>"
fi
error() {
echo "$*"
exit 1
}
if [ $# -eq 0 ]; then
exit_with_usage
fi
if [[ $@ == *"help"* ]]; then
exit_with_usage
fi
# Build docs (production)
if [[ "$1" == "docs" ]]; then
cd systemds
echo "Building SystemDS docs"
cd docs
bundle install
PRODUCTION=1 RELEASE_VERSION="$RELEASE_VERSION" bundle exec jekyll build
fi
GPG_OPTS="-Dgpg.keyname=${GPG_KEY} -Dgpg.passphrase=${GPG_PASSPHRASE}"
cat <<EOF >../tmp-settings.xml
<settings><servers><server>
<id>apache.snapshots.https</id><username>${ASF_USERNAME}</username>
<password>${ASF_PASSWORD}</password>
</server>
<server>
<id>apache.releases.https</id><username>${ASF_USERNAME}</username>
<password>${ASF_PASSWORD}</password>
</server>
</servers>
</settings>
EOF
if [[ "$1" == "publish-snapshot" ]]; then
CMD="mvn --settings ../tmp-settings.xml deploy -DskipTests -Dmaven.deploy.skip=${dry_run} \
-Daether.checksums.algorithms=SHA-512 \
${GPG_OPTS}"
# -DaltSnapshotDeploymentRepository=github::default::https://maven.pkg.github.com/j143/systemds \
printf "\n #### Executing command: #### \n"
printf "\n $(bold $(greencolor $CMD)) \n\n"
$CMD
fi
if [[ "$1" == "publish-staging" ]]; then
mvn versions:set -DnewVersion=${PACKAGE_VERSION}
CMD="mvn --settings ../tmp-settings.xml clean -Pdistribution deploy \
-DskiptTests -Dmaven.deploy.skip=${dry_run} \
-Daether.checksums.algorithms=SHA-512 \
${GPG_OPTS}"
printf "\n #### Executing command: #### \n"
printf "\n $(bold $(greencolor $CMD)) \n\n"
$CMD
fi
# if [[ -z "$GPG_KEY" ]]; then
# echo "The environment variable $GPG_KEY is not set."
# fi
# GPG="gpg -u $GPG_KEY --no-tty --batch --pinentry-mode loopback"
# Publishing to Sonatype repo, details:
NEXUS_ROOT=https://repository.apache.org/service/local/staging
NEXUS_PROFILE=1486a6e8f50cdf
# Apache SVN Repo, details:
RELEASE_STAGING_LOCATION="https://dist.apache.org/repos/dist/dev/systemds"
DEST_DIR_NAME="$PACKAGE_VERSION"
# NOTE:
# 1. Build files will be saved to this folder.
# This folder will be used by `publish-release`
#
# 2. this directory is passed via `file` protocol with
# file:///${path} (3 slashes, specifies empty name)
# refer: https://en.wikipedia.org/wiki/File_URI_scheme#How_many_slashes.3F
mkdir temp
tmp_repo=$(mktemp -d temp/systemds-repo-tmp-XXXXX)
if [[ "$1" == "publish-release" ]]; then
# cd systemds
# Publishing spark to Maven Central Repo
printf "\nRelease version is ${PACKAGE_VERSION} \n"
mvn versions:set -DnewVersion=${RELEASE_VERSION}
# if ! is_dry_run; then
printf "Creating a Nexus staging repository \n"
promote_request="<promoteRequest><data><description>Apache SystemDS</description></data></promoteRequest>"
out=$(curl -X POST -d "$promote_request" -u $ASF_USERNAME:$ASF_PASSWORD \
-H "Content-Type:application/xml" -v \
$NEXUS_ROOT/profiles/$NEXUS_PROFILE/start)
staged_repository_id=$(echo $out | sed -e "s/.*\(orgapachesystemds-[0-9]\{4\}\).*/\1/")
# fi
cat <<EOF >../tmp-settings-nexus.xml
<settings>
<activeProfiles>
<activeProfile>local-temp</activeProfile>
</activeProfiles>
<profiles>
<profile>
<id>local-temp</id>
<repositories>
<repository>
<id>local-temp</id>
<url>file:///$PWD/${tmp_repo}</url>
</repository>
</repositories>
</profile>
</profiles>
</settings>
EOF
mvn --settings ../tmp-settings-nexus.xml -Pdistribution deploy \
-DaltDeploymentRepository=local-temp::default::file:///$PWD/${tmp_repo} \
-Daether.checksums.algorithms='SHA-512,SHA-1,MD5'
pushd "${tmp_repo}/org/apache/systemds"
# if ! is_dry_run; then
# upload files to nexus repo
nexus_upload_id=$NEXUS_ROOT/deployByRepositoryId/$staged_repository_id
printf "\nUpload files to $nexus_upload_id \n"
for file in $(find . -type f)
do
# strip leading ./
file_short=$(echo $file | sed -e "s/\.\///")
dest_url="$nexus_upload_id/org/apache/systemds/$file_short"
printf "\nUploading $file_short \n"
curl -u $ASF_USERNAME:$ASF_PASSWORD --upload-file $file_short $dest_url
done
# Promote the staging repository
promote_request="<promoteRequest><data><stagedRepositoryId>$staged_repository_id</stagedRepositoryId></data></promoteRequest>"
out=$(curl -X POST -d "$promote_request" -u $ASF_USERNAME:$ASF_PASSWORD \
-H "Content-Type:application/xml" -v \
$NEXUS_ROOT/profiles/$NEXUS_PROFILE/finish)
printf "Closed Nexus staging repository: $staged_repository_id"
printf "\nAfter release vote passes make sure to hit release button.\n"
# else
# printf "Files will uploaded to Nexus Repo at this step."
# fi
printf "\n ============== "
printf "\n Upload artifacts to dist.apache.org \n"
svn co --depth=empty $RELEASE_STAGING_LOCATION svn-systemds
if ! is_dry_run; then
stage_dir="svn-systemds/${PACKAGE_VERSION}"
mkdir -p $stage_dir
else
stage_dir=$(mktemp -d svn-systemds/${DEST_DIR_NAME}-temp-XXXX)
fi
printf "\nCopy the release tarballs to svn repo \n"
ls *
# Remove extra files generated
# Keep only .zip, .tgz, and javadoc
find systemds -type f | grep -v -e \.zip -e \.tgz -e javadoc | xargs rm
eval cp systemds/${RELEASE_VERSION}/systemds-* "${stage_dir}"
svn add "${stage_dir}"
eval cd svn-systemds
svn ci --username "$ASF_USERNAME" --password "$ASF_PASSWORD" -m"Apache SystemDS $SYSTEMDS_PACKAGE_VERSION" --no-auth-cache
eval cd ..
rm -rf svn-systemds
popd
# NOTE: Do not delete any generated release artifacts
# rm -rf "${tmp_repo}"
eval cd ..
exit 0
fi