From 58eaa339792e99b9c7c8860644ac372f06fa1e54 Mon Sep 17 00:00:00 2001 From: Isaac Hollander McCreery Date: Thu, 5 Nov 2015 15:30:59 -0800 Subject: [PATCH 1/2] Enable push-official-version to deal with prereleases --- build/common.sh | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/build/common.sh b/build/common.sh index 6d3a8d5ed50..c107576b9ef 100755 --- a/build/common.sh +++ b/build/common.sh @@ -351,11 +351,14 @@ function kube::build::destroy_container() { # local -r version_major="${BASH_REMATCH[1]}" # local -r version_minor="${BASH_REMATCH[2]}" # local -r version_patch="${BASH_REMATCH[3]}" +# local -r version_extra="${BASH_REMATCH[4]}" +# local -r version_prerelease="${BASH_REMATCH[5]}" +# local -r version_prerelease_rev="${BASH_REMATCH[6]}" function kube::release::parse_and_validate_release_version() { - local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$" + local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-(beta|alpha)\\.(0|[1-9][0-9]*))?$" local -r version="${1-}" [[ "${version}" =~ ${version_regex} ]] || { - kube::log::error "Invalid release version: '${version}'" + kube::log::error "Invalid release version: '${version}', must match regex ${version_regex}" return 1 } } @@ -382,7 +385,7 @@ function kube::release::parse_and_validate_ci_version() { local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)-(beta|alpha)\\.(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*)\\+[-0-9a-z]*)?$" local -r version="${1-}" [[ "${version}" =~ ${version_regex} ]] || { - kube::log::error "Invalid ci version: '${version}'" + kube::log::error "Invalid ci version: '${version}', must match regex ${version_regex}" return 1 } } @@ -1148,6 +1151,10 @@ function kube::release::gcs::verify_release_files() { # publish_file: the GCS location to look in # Returns: # If new version is greater than the GCS version +# +# TODO(16529): This should all be outside of build an in release, and should be +# refactored to reduce code duplication. Also consider using strictly nested +# if and explicit handling of equals case. function kube::release::gcs::verify_release_gt() { local -r publish_file="${1-}" local -r new_version=${KUBE_GCS_PUBLISH_VERSION} @@ -1158,6 +1165,8 @@ function kube::release::gcs::verify_release_gt() { local -r version_major="${BASH_REMATCH[1]}" local -r version_minor="${BASH_REMATCH[2]}" local -r version_patch="${BASH_REMATCH[3]}" + local -r version_prerelease="${BASH_REMATCH[5]}" + local -r version_prerelease_rev="${BASH_REMATCH[6]}" local gcs_version if gcs_version="$(gsutil cat "${publish_file_dst}")"; then @@ -1169,6 +1178,8 @@ function kube::release::gcs::verify_release_gt() { local -r gcs_version_major="${BASH_REMATCH[1]}" local -r gcs_version_minor="${BASH_REMATCH[2]}" local -r gcs_version_patch="${BASH_REMATCH[3]}" + local -r gcs_version_prerelease="${BASH_REMATCH[5]}" + local -r gcs_version_prerelease_rev="${BASH_REMATCH[6]}" local greater=true if [[ "${version_major}" -lt "${gcs_version_major}" ]]; then @@ -1179,7 +1190,26 @@ function kube::release::gcs::verify_release_gt() { greater=false elif [[ "${version_minor}" -gt "${gcs_version_minor}" ]]; then : # fall out - elif [[ "${version_patch}" -le "${gcs_version_patch}" ]]; then + elif [[ "${version_patch}" -lt "${gcs_version_patch}" ]]; then + greater=false + elif [[ "${version_patch}" -gt "${gcs_version_patch}" ]]; then + : # fall out + # Use lexicographic (instead of integer) comparison because + # version_prerelease is a string, ("alpha" or "beta",) but first check if + # either is an official release (i.e. empty prerelease string). + # + # We have to do this because lexicographically "beta" > "alpha" > "", but + # we want official > beta > alpha. + elif [[ -n "${version_prerelease}" && -z "${gcs_version_prerelease}" ]]; then + greater=false + elif [[ -z "${version_prerelease}" && -n "${gcs_version_prerelease}" ]]; then + : # fall out + elif [[ "${version_prerelease}" < "${gcs_version_prerelease}" ]]; then + greater=false + elif [[ "${version_prerelease}" > "${gcs_version_prerelease}" ]]; then + : # fall out + # Finally resort to -le here, since we want strictly-greater-than. + elif [[ "${version_prerelease_rev}" -le "${gcs_version_prerelease_rev}" ]]; then greater=false fi @@ -1205,6 +1235,10 @@ function kube::release::gcs::verify_release_gt() { # publish_file: the GCS location to look in # Returns: # If new version is greater than the GCS version +# +# TODO(16529): This should all be outside of build an in release, and should be +# refactored to reduce code duplication. Also consider using strictly nested +# if and explicit handling of equals case. function kube::release::gcs::verify_ci_ge() { local -r publish_file="${1-}" local -r new_version=${KUBE_GCS_PUBLISH_VERSION} @@ -1256,10 +1290,6 @@ function kube::release::gcs::verify_ci_ge() { greater=false elif [[ "${version_prerelease_rev}" -gt "${gcs_version_prerelease_rev}" ]]; then : # fall out - elif [[ "${version_patch}" -lt "${gcs_version_patch}" ]]; then - greater=false - elif [[ "${version_patch}" -gt "${gcs_version_patch}" ]]; then - : # fall out # If either version_commits is empty, it will be considered less-than, as # expected, (e.g. 1.2.3-beta < 1.2.3-beta.1). elif [[ "${version_commits}" -lt "${gcs_version_commits}" ]]; then From 2fad9a1271d5793d89a3c9aca7619cefb1ea60cb Mon Sep 17 00:00:00 2001 From: Isaac Hollander McCreery Date: Wed, 18 Nov 2015 15:52:15 -0800 Subject: [PATCH 2/2] Use env variables instead of BASH_REMATCH for parse_and_validates --- build/common.sh | 99 +++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/build/common.sh b/build/common.sh index c107576b9ef..53637d347fc 100755 --- a/build/common.sh +++ b/build/common.sh @@ -346,14 +346,13 @@ function kube::build::destroy_container() { # version # Returns: # If version is a valid release version -# Sets: -# BASH_REMATCH, so you can do something like: -# local -r version_major="${BASH_REMATCH[1]}" -# local -r version_minor="${BASH_REMATCH[2]}" -# local -r version_patch="${BASH_REMATCH[3]}" -# local -r version_extra="${BASH_REMATCH[4]}" -# local -r version_prerelease="${BASH_REMATCH[5]}" -# local -r version_prerelease_rev="${BASH_REMATCH[6]}" +# Sets: (e.g. for '1.2.3-alpha.4') +# VERSION_MAJOR (e.g. '1') +# VERSION_MINOR (e.g. '2') +# VERSION_PATCH (e.g. '3') +# VERSION_EXTRA (e.g. '-alpha.4') +# VERSION_PRERELEASE (e.g. 'alpha') +# VERSION_PRERELEASE_REV (e.g. '4') function kube::release::parse_and_validate_release_version() { local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-(beta|alpha)\\.(0|[1-9][0-9]*))?$" local -r version="${1-}" @@ -361,6 +360,12 @@ function kube::release::parse_and_validate_release_version() { kube::log::error "Invalid release version: '${version}', must match regex ${version_regex}" return 1 } + VERSION_MAJOR="${BASH_REMATCH[1]}" + VERSION_MINOR="${BASH_REMATCH[2]}" + VERSION_PATCH="${BASH_REMATCH[3]}" + VERSION_EXTRA="${BASH_REMATCH[4]}" + VERSION_PRERELEASE="${BASH_REMATCH[5]}" + VERSION_PRERELEASE_REV="${BASH_REMATCH[6]}" } # Validate a ci version @@ -371,23 +376,29 @@ function kube::release::parse_and_validate_release_version() { # version # Returns: # If version is a valid ci version -# Sets: -# BASH_REMATCH, so you can do something like: -# local -r version_major="${BASH_REMATCH[1]}" -# local -r version_minor="${BASH_REMATCH[2]}" -# local -r version_patch="${BASH_REMATCH[3]}" -# local -r version_prerelease="${BASH_REMATCH[4]}" -# local -r version_prerelease_rev="${BASH_REMATCH[5]}" -# local -r version_build_info="${BASH_REMATCH[6]}" -# local -r version_commits="${BASH_REMATCH[7]}" +# Sets: (e.g. for '1.2.3-alpha.4.56+abcd789-dirty') +# VERSION_MAJOR (e.g. '1') +# VERSION_MINOR (e.g. '2') +# VERSION_PATCH (e.g. '3') +# VERSION_PRERELEASE (e.g. 'alpha') +# VERSION_PRERELEASE_REV (e.g. '4') +# VERSION_BUILD_INFO (e.g. '.56+abcd789-dirty') +# VERSION_COMMITS (e.g. '56') function kube::release::parse_and_validate_ci_version() { - # Accept things like "v1.2.3-alpha.0.456+abcd789-dirty" or "v1.2.3-beta.0.456" + # Accept things like "v1.2.3-alpha.4.56+abcd789-dirty" or "v1.2.3-beta.4.56" local -r version_regex="^v(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)-(beta|alpha)\\.(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*)\\+[-0-9a-z]*)?$" local -r version="${1-}" [[ "${version}" =~ ${version_regex} ]] || { kube::log::error "Invalid ci version: '${version}', must match regex ${version_regex}" return 1 } + VERSION_MAJOR="${BASH_REMATCH[1]}" + VERSION_MINOR="${BASH_REMATCH[2]}" + VERSION_PATCH="${BASH_REMATCH[3]}" + VERSION_PRERELEASE="${BASH_REMATCH[4]}" + VERSION_PRERELEASE_REV="${BASH_REMATCH[5]}" + VERSION_BUILD_INFO="${BASH_REMATCH[6]}" + VERSION_COMMITS="${BASH_REMATCH[7]}" } # --------------------------------------------------------------------------- @@ -1073,8 +1084,8 @@ function kube::release::gcs::publish_ci() { kube::release::gcs::verify_release_files || return 1 kube::release::parse_and_validate_ci_version "${KUBE_GCS_PUBLISH_VERSION}" || return 1 - local -r version_major="${BASH_REMATCH[1]}" - local -r version_minor="${BASH_REMATCH[2]}" + local -r version_major="${VERSION_MAJOR}" + local -r version_minor="${VERSION_MINOR}" local -r publish_files=(ci/latest.txt ci/latest-${version_major}.txt ci/latest-${version_major}.${version_minor}.txt) @@ -1103,8 +1114,8 @@ function kube::release::gcs::publish_official() { kube::release::gcs::verify_release_files || return 1 kube::release::parse_and_validate_release_version "${KUBE_GCS_PUBLISH_VERSION}" || return 1 - local -r version_major="${BASH_REMATCH[1]}" - local -r version_minor="${BASH_REMATCH[2]}" + local -r version_major="${VERSION_MAJOR}" + local -r version_minor="${VERSION_MINOR}" local publish_files if [[ "${release_kind}" == 'latest' ]]; then @@ -1162,11 +1173,11 @@ function kube::release::gcs::verify_release_gt() { kube::release::parse_and_validate_release_version "${new_version}" || return 1 - local -r version_major="${BASH_REMATCH[1]}" - local -r version_minor="${BASH_REMATCH[2]}" - local -r version_patch="${BASH_REMATCH[3]}" - local -r version_prerelease="${BASH_REMATCH[5]}" - local -r version_prerelease_rev="${BASH_REMATCH[6]}" + local -r version_major="${VERSION_MAJOR}" + local -r version_minor="${VERSION_MINOR}" + local -r version_patch="${VERSION_PATCH}" + local -r version_prerelease="${VERSION_PRERELEASE}" + local -r version_prerelease_rev="${VERSION_PRERELEASE_REV}" local gcs_version if gcs_version="$(gsutil cat "${publish_file_dst}")"; then @@ -1175,11 +1186,11 @@ function kube::release::gcs::verify_release_gt() { return 1 } - local -r gcs_version_major="${BASH_REMATCH[1]}" - local -r gcs_version_minor="${BASH_REMATCH[2]}" - local -r gcs_version_patch="${BASH_REMATCH[3]}" - local -r gcs_version_prerelease="${BASH_REMATCH[5]}" - local -r gcs_version_prerelease_rev="${BASH_REMATCH[6]}" + local -r gcs_version_major="${VERSION_MAJOR}" + local -r gcs_version_minor="${VERSION_MINOR}" + local -r gcs_version_patch="${VERSION_PATCH}" + local -r gcs_version_prerelease="${VERSION_PRERELEASE}" + local -r gcs_version_prerelease_rev="${VERSION_PRERELEASE_REV}" local greater=true if [[ "${version_major}" -lt "${gcs_version_major}" ]]; then @@ -1246,12 +1257,12 @@ function kube::release::gcs::verify_ci_ge() { kube::release::parse_and_validate_ci_version "${new_version}" || return 1 - local -r version_major="${BASH_REMATCH[1]}" - local -r version_minor="${BASH_REMATCH[2]}" - local -r version_patch="${BASH_REMATCH[3]}" - local -r version_prerelease="${BASH_REMATCH[4]}" - local -r version_prerelease_rev="${BASH_REMATCH[5]}" - local -r version_commits="${BASH_REMATCH[7]}" + local -r version_major="${VERSION_MAJOR}" + local -r version_minor="${VERSION_MINOR}" + local -r version_patch="${VERSION_PATCH}" + local -r version_prerelease="${VERSION_PRERELEASE}" + local -r version_prerelease_rev="${VERSION_PRERELEASE_REV}" + local -r version_commits="${VERSION_COMMITS}" local gcs_version if gcs_version="$(gsutil cat "${publish_file_dst}")"; then @@ -1260,12 +1271,12 @@ function kube::release::gcs::verify_ci_ge() { return 1 } - local -r gcs_version_major="${BASH_REMATCH[1]}" - local -r gcs_version_minor="${BASH_REMATCH[2]}" - local -r gcs_version_patch="${BASH_REMATCH[3]}" - local -r gcs_version_prerelease="${BASH_REMATCH[4]}" - local -r gcs_version_prerelease_rev="${BASH_REMATCH[5]}" - local -r gcs_version_commits="${BASH_REMATCH[7]}" + local -r gcs_version_major="${VERSION_MAJOR}" + local -r gcs_version_minor="${VERSION_MINOR}" + local -r gcs_version_patch="${VERSION_PATCH}" + local -r gcs_version_prerelease="${VERSION_PRERELEASE}" + local -r gcs_version_prerelease_rev="${VERSION_PRERELEASE_REV}" + local -r gcs_version_commits="${VERSION_COMMITS}" local greater=true if [[ "${version_major}" -lt "${gcs_version_major}" ]]; then