#!/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. # # # Creates a HBase release candidate. The script will update versions, tag the branch, # build HBase binary packages and documentation, and upload maven artifacts to a staging # repository. There is also a dry run mode where only local builds are performed, and # nothing is uploaded to the ASF repos. # # Run with "-h" for options. For example, running below will do all # steps above using the 'rm' dir under Downloads as workspace: # # $ ./do-release-docker.sh -d ~/Downloads/rm # # The scripts in this directory came originally from spark [1]. They were then # modified to suite the hbase context. These scripts supercedes the old # ../make_rc.sh script for making release candidates because what is here is more # comprehensive doing more steps of the RM process as well as running in a # container so the RM build environment can be a constant. # # It: # * Tags release # * Sets version to the release version # * Sets version to next SNAPSHOT version. # * Builds, signs, and hashes all artifacts. # * Pushes release tgzs to the dev dir in a apache dist. # * Pushes to repository.apache.org staging. # # The entry point is here, in the do-release-docker.sh script. # # 1. https://github.com/apache/spark/tree/master/dev/create-release # set -e # Set this to build other hbase repos: e.g. PROJECT=hbase-operator-tools export PROJECT="${PROJECT:-hbase}" SELF="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=SCRIPTDIR/release-util.sh . "$SELF/release-util.sh" ORIG_PWD="$(pwd)" function usage { local NAME NAME="$(basename "${BASH_SOURCE[0]}")" cat < 0 )); then error "Arguments can only be provided with option flags, invalid args: $*" fi if [ -z "$WORKDIR" ] || [ ! -d "$WORKDIR" ]; then error "Work directory (-d) must be defined and exist. Run with -h for help." fi if [ -d "$WORKDIR/output" ]; then read -r -p "Output directory already exists. Overwrite and continue? [y/n] " ANSWER if [ "$ANSWER" != "y" ]; then error "Exiting." fi fi cd "$WORKDIR" rm -rf "$WORKDIR/output" mkdir "$WORKDIR/output" get_release_info # Place all RM scripts and necessary data in a local directory that must be defined in the command # line. This directory is mounted into the image. Its WORKDIR, the arg passed with -d. for f in "$SELF"/*; do if [ -f "$f" ]; then cp "$f" "$WORKDIR" fi done GPG_KEY_FILE="$WORKDIR/gpg.key" fcreate_secure "$GPG_KEY_FILE" $GPG --passphrase "$GPG_PASSPHRASE" --export-secret-key --armor "$GPG_KEY" > "$GPG_KEY_FILE" run_silent "Building hbase-rm image with tag $IMGTAG..." "docker-build.log" \ docker build -t "hbase-rm:$IMGTAG" --build-arg UID=$UID "$SELF/hbase-rm" # Write the release information to a file with environment variables to be used when running the # image. ENVFILE="$WORKDIR/env.list" fcreate_secure "$ENVFILE" function cleanup { rm -f "$ENVFILE" rm -f "$GPG_KEY_FILE" } trap cleanup EXIT cat > "$ENVFILE" <> "$ENVFILE" JAVA_VOL=(--volume "$JAVA:/opt/hbase-java") fi #TODO some debug output would be good here GIT_REPO_MOUNT=() if [ -n "${GIT_REPO}" ]; then case "${GIT_REPO}" in # skip the easy to identify remote protocols ssh://*|git://*|http://*|https://*|ftp://*|ftps://*) ;; # for sure local /*) GIT_REPO_MOUNT=(--mount "type=bind,src=${GIT_REPO},dst=/opt/hbase-repo,consistency=delegated") echo "HOST_GIT_REPO=${GIT_REPO}" >> "${ENVFILE}" GIT_REPO="/opt/hbase-repo" ;; # on the host but normally git wouldn't use the local optimization file://*) echo "[INFO] converted file:// git repo to a local path, which changes git to assume --local." GIT_REPO_MOUNT=(--mount "type=bind,src=${GIT_REPO#file://},dst=/opt/hbase-repo,consistency=delegated") echo "HOST_GIT_REPO=${GIT_REPO}" >> "${ENVFILE}" GIT_REPO="/opt/hbase-repo" ;; # have to decide if it's a local path or the "scp-ish" remote *) declare colon_remove_prefix; declare slash_remove_prefix; declare local_path; colon_remove_prefix="${GIT_REPO#*:}" slash_remove_prefix="${GIT_REPO#*/}" if [ "${GIT_REPO}" = "${colon_remove_prefix}" ]; then # if there was no colon at all, we assume this must be a local path local_path="no colon at all" elif [ "${GIT_REPO}" != "${slash_remove_prefix}" ]; then # if there was a colon and there is no slash, then we assume it must be scp-style host # and a relative path if [ "${#colon_remove_prefix}" -lt "${#slash_remove_prefix}" ]; then # Given the substrings made by removing everything up to the first colon and slash # we can determine which comes first based on the longer substring length. # if the slash is first, then we assume the colon is part of a path name and if the colon # is first then it is the seperator between a scp-style host name and the path. local_path="slash happened before a colon" fi fi if [ -n "${local_path}" ]; then # convert to an absolute path GIT_REPO="$(cd "$(dirname "${ORIG_PWD}/${GIT_REPO}")"; pwd)/$(basename "${ORIG_PWD}/${GIT_REPO}")" GIT_REPO_MOUNT=(--mount "type=bind,src=${GIT_REPO},dst=/opt/hbase-repo,consistency=delegated") echo "HOST_GIT_REPO=${GIT_REPO}" >> "${ENVFILE}" GIT_REPO="/opt/hbase-repo" fi ;; esac echo "GIT_REPO=${GIT_REPO}" >> "${ENVFILE}" fi echo "Building $RELEASE_TAG; output will be at $WORKDIR/output" # Where possible we specifcy "consistency=delegated" when we do not need host access during the # build run. On Mac OS X specifically this gets us a big perf improvement. cmd=(docker run -ti \ --env-file "$ENVFILE" \ --mount "type=bind,src=${WORKDIR},dst=/opt/hbase-rm,consistency=delegated" \ "${JAVA_VOL[@]}" \ "${GIT_REPO_MOUNT[@]}" \ "hbase-rm:$IMGTAG") echo "${cmd[*]}" "${cmd[@]}"