This is an automated email from the ASF dual-hosted git repository. diqiu50 pushed a commit to branch feature/10448-non-interactive-release in repository https://gitbox.apache.org/repos/asf/gravitino.git
commit d4a270a8d93a0592c7781e726911e69aac9d3f84 Author: diqiu50 <[email protected]> AuthorDate: Wed Mar 18 11:52:43 2026 +0800 [MINOR] fix(release): resolve shell script issues for non-interactive mode - Add :) case in getopts for missing option arguments - Replace error() call before release-util.sh is sourced with inline echo+exit - Add security warning in help text for -p/-t flags - Consolidate all variable exports after getopts: RUNNING_IN_DOCKER, DRY_RUN, FORCE, RC_COUNT, RELEASE_STEP, GIT_BRANCH, RELEASE_VERSION, ASF_PASSWORD, GPG_PASSPHRASE - Use ${PYPI_API_TOKEN:-} to avoid unbound variable error under set -u - Use ${GPG_PASSPHRASE:-} and ${JAVA_HOME:-} in docker path - Fix RC_COUNT=0 check to treat 0 as missing (not valid) - Fix run_silent to use if/! pattern so set -e does not swallow error output - Fix NRC_COUNT wiring: use auto-detected value as default, only override when -r is explicitly provided - Use ${VAR:-} pattern for ASF_USERNAME, GIT_NAME, ASF_PASSWORD, GPG_PASSPHRASE in get_release_info --- dev/release/do-release.sh | 27 +++++++++++++-------------- dev/release/release-util.sh | 19 +++++++++---------- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/dev/release/do-release.sh b/dev/release/do-release.sh index d58b3eca90..3a152bd240 100755 --- a/dev/release/do-release.sh +++ b/dev/release/do-release.sh @@ -22,8 +22,6 @@ set -euo pipefail # Referred from Apache Spark's release script # dev/create-release/do-release.sh -RUNNING_IN_DOCKER=${RUNNING_IN_DOCKER:-0} - SELF=$(cd "$(dirname "$0")" && pwd) while getopts ":b:s:p:t:r:nyh" opt; do @@ -42,20 +40,26 @@ while getopts ":b:s:p:t:r:nyh" opt; do echo " -s <step> Release step to execute: tag, build, docs, publish, finalize" echo " -r <num> Release candidate number (e.g., 6 for rc6)" echo " -n Dry run mode" - echo " -p <pass> GPG passphrase" - echo " -t <pass> ASF password" + echo " -p <pass> GPG passphrase (insecure; prefer GPG_PASSPHRASE env var)" + echo " -t <pass> ASF password (insecure; prefer ASF_PASSWORD env var)" echo " -y Force continue without confirmation" echo " -h Show this help message" exit 0 ;; - \?) error "Invalid option: $OPTARG" ;; + :) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;; + \?) echo "Invalid option: -$OPTARG" >&2; exit 1 ;; esac done +export RUNNING_IN_DOCKER=${RUNNING_IN_DOCKER:-0} export DRY_RUN=${DRY_RUN:-0} export FORCE=${FORCE:-0} export RC_COUNT=${RC_COUNT:-0} export RELEASE_STEP=${RELEASE_STEP:-} +export GIT_BRANCH=${GIT_BRANCH:-} +export RELEASE_VERSION=${RELEASE_VERSION:-} +export ASF_PASSWORD=${ASF_PASSWORD:-} +export GPG_PASSPHRASE=${GPG_PASSPHRASE:-} echo "DRY_RUN=$DRY_RUN FORCE=$FORCE RC_COUNT=$RC_COUNT RELEASE_STEP=$RELEASE_STEP" @@ -75,7 +79,7 @@ fi . "$SELF/release-util.sh" if ! is_dry_run; then - if [[ -z "$PYPI_API_TOKEN" ]]; then + if [[ -z "${PYPI_API_TOKEN:-}" ]]; then echo 'The environment variable PYPI_API_TOKEN is not set. Exiting.' exit 1 fi @@ -83,10 +87,10 @@ fi if [ "$RUNNING_IN_DOCKER" = "1" ]; then # Inside docker, need to import the GPG key stored in the current directory. - echo $GPG_PASSPHRASE | $GPG --passphrase-fd 0 --import "$SELF/gpg.key" + echo "${GPG_PASSPHRASE:-}" | $GPG --passphrase-fd 0 --import "$SELF/gpg.key" # We may need to adjust the path since JAVA_HOME may be overridden by the driver script. - if [ -n "$JAVA_HOME" ]; then + if [ -n "${JAVA_HOME:-}" ]; then export PATH="$JAVA_HOME/bin:$PATH" else # JAVA_HOME for the openjdk package. @@ -94,12 +98,7 @@ if [ "$RUNNING_IN_DOCKER" = "1" ]; then fi else # Outside docker, need to ask for information about the release if required vars are missing. - # Set default values to avoid unbound variable errors with set -u - RELEASE_VERSION=${RELEASE_VERSION:-} - GIT_BRANCH=${GIT_BRANCH:-} - RC_COUNT=${RC_COUNT:-0} - - if [ -z "$GIT_BRANCH" ] || [ -z "$RELEASE_VERSION" ] || [ -z "$RC_COUNT" ]; then + if [ -z "$GIT_BRANCH" ] || [ -z "$RELEASE_VERSION" ] || [ "${RC_COUNT:-0}" -eq 0 ]; then get_release_info fi fi diff --git a/dev/release/release-util.sh b/dev/release/release-util.sh index 37988d3da5..28ea6513f6 100755 --- a/dev/release/release-util.sh +++ b/dev/release/release-util.sh @@ -72,10 +72,8 @@ function run_silent { echo "Command: $@" echo "Log file: $LOG_FILE" - "$@" 1>"$LOG_FILE" 2>&1 - - local EC=$? - if [ $EC != 0 ]; then + if ! "$@" 1>"$LOG_FILE" 2>&1; then + local EC=$? echo "Command FAILED. Check full logs for details." tail "$LOG_FILE" exit $EC @@ -146,10 +144,11 @@ function get_release_info { export NEXT_VERSION export RELEASE_VERSION=$(read_config "Release" "$RELEASE_VERSION" RELEASE_VERSION) - if [ "$FORCE" = "1" ]; then + # If -r was explicitly provided (non-zero), override the auto-detected NRC_COUNT + if [ "${RC_COUNT:-0}" -gt 0 ]; then NRC_COUNT=$RC_COUNT fi - RC_COUNT=$(read_config "RC #" "$RC_COUNT" NRC_COUNT) + RC_COUNT=$(read_config "RC #" "$NRC_COUNT" NRC_COUNT) export RC_COUNT # Check if the RC already exists, and if re-creating the RC, skip tag creation. @@ -182,11 +181,11 @@ function get_release_info { export GRAVITINO_PACKAGE_VERSION="$RELEASE_TAG" # Gather some user information. - if [ -z "$ASF_USERNAME" ]; then + if [ -z "${ASF_USERNAME:-}" ]; then export ASF_USERNAME=$(read_config "ASF user" "$LOGNAME" ASF_USERNAME) fi - if [ -z "$GIT_NAME" ]; then + if [ -z "${GIT_NAME:-}" ]; then GIT_NAME=$(git config user.name || echo "") export GIT_NAME=$(read_config "Full name" "$GIT_NAME" GIT_NAME) fi @@ -220,14 +219,14 @@ EOF fi if ! is_dry_run; then - if [ -z "$ASF_PASSWORD" ]; then + if [ -z "${ASF_PASSWORD:-}" ]; then stty -echo && printf "ASF password: " && read ASF_PASSWORD && printf '\n' && stty echo fi else ASF_PASSWORD="***INVALID***" fi - if [ -z "$GPG_PASSPHRASE" ]; then + if [ -z "${GPG_PASSPHRASE:-}" ]; then stty -echo && printf "GPG passphrase: " && read GPG_PASSPHRASE && printf '\n' && stty echo fi
