#!/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. # # Make a tmp dir into which we put files cleaned-up on exit. TMPDIR=$(mktemp -d) trap "rm -rf $TMPDIR" EXIT set -e # Use the adjacent do-release-docker.sh instead, if you can. # Otherwise, this runs core of the release creation. # Will ask you questions on what to build and for logins # and passwords to use building. export PROJECT="${PROJECT:-hbase}" SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=SCRIPTDIR/release-util.sh . "$SELF/release-util.sh" while getopts "b:fs:" opt; do case $opt in b) export GIT_BRANCH=$OPTARG ;; f) export DRY_RUN=0 ;; # "force", ie actually publish this release (otherwise defaults to dry run) s) RELEASE_STEP="$OPTARG" ;; ?) error "Invalid option: $OPTARG" ;; esac done shift $((OPTIND-1)) if (( $# > 0 )); then error "Arguments can only be provided with option flags, invalid args: $*" fi function gpg_agent_help { cat < "${gpg_test_file}" if ! "${GPG}" "${GPG_ARGS[@]}" --detach --armor --sign "${gpg_test_file}" ; then gpg_agent_help fi # In --batch mode we have to be explicit about what we are verifying if ! "${GPG}" "${GPG_ARGS[@]}" --verify "${gpg_test_file}.asc" "${gpg_test_file}" ; then gpg_agent_help fi fi GPG_TTY="$(tty)" export GPG_TTY if [[ -z "$RELEASE_STEP" ]]; then # If doing all stages, leave out 'publish-snapshot' RELEASE_STEP="tag_publish-dist_publish-release" # and use shared maven local repo for efficiency export REPO="${REPO:-$(pwd)/$(mktemp -d hbase-repo-XXXXX)}" fi function should_build { local WHAT=$1 if [[ -z "$RELEASE_STEP" ]]; then return 0 elif [[ "$RELEASE_STEP" == *"$WHAT"* ]]; then return 0 else return 1 fi } if should_build "tag" && [ "$SKIP_TAG" = 0 ]; then if [ -z "${YETUS_HOME}" ] && [ "${RUNNING_IN_DOCKER}" != "1" ]; then declare local_yetus="/opt/apache-yetus/0.12.0/" if [ "$(get_host_os)" = "DARWIN" ]; then local_yetus="/usr/local/Cellar/yetus/0.12.0/" fi YETUS_HOME="$(read_config "YETUS_HOME not defined. Absolute path to local install of Apache Yetus" "${local_yetus}")" export YETUS_HOME fi run_silent "Creating release tag $RELEASE_TAG..." "tag.log" \ "$SELF/release-build.sh" tag if is_dry_run; then export TAG_SAME_DRY_RUN="true"; fi else echo "Skipping tag creation for $RELEASE_TAG." fi if should_build "publish-dist"; then run_silent "Publishing distribution packages (tarballs)" "publish-dist.log" \ "$SELF/release-build.sh" publish-dist else echo "Skipping publish-dist step." fi if should_build "publish-snapshot"; then run_silent "Publishing snapshot" "publish-snapshot.log" \ "$SELF/release-build.sh" publish-snapshot elif should_build "publish-release"; then run_silent "Publishing release" "publish-release.log" \ "$SELF/release-build.sh" publish-release else echo "Skipping publish-release step." fi