rabbitmq/versions.sh

199 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
declare -A alpineVersions=(
[3.13]='3.22'
[4.0]='3.22'
[4.1]='3.22'
[4.2]='3.22'
)
declare -A ubuntuVersions=(
[3.13]='24.04'
[4.0]='24.04'
[4.1]='24.04'
[4.2]='24.04'
)
# https://www.rabbitmq.com/which-erlang.html ("Maximum supported Erlang/OTP")
declare -A otpMajors=(
[3.13]='26'
[4.0]='27'
[4.1]='27'
[4.2]='27'
)
# https://www.openssl.org/policies/releasestrat.html
# https://www.openssl.org/source/
declare -A opensslMajors=(
[3.13]='3.1'
[4.0]='3.3'
[4.1]='3.3'
[4.2]='3.3'
)
cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
versions=( "$@" )
if [ ${#versions[@]} -eq 0 ]; then
versions=( "${!otpMajors[@]}" )
# try RC releases after doing the non-RCs so we can check whether they're newer (and thus whether we should care)
versions+=( "${versions[@]/%/-rc}" )
json='{}'
else
json="$(< versions.json)"
fi
versions=( "${versions[@]%/}" )
for version in "${versions[@]}"; do
export version
rcVersion="${version%-rc}"
rcGrepV='-v'
if [ "$rcVersion" != "$version" ]; then
rcGrepV=
fi
rcGrepV+=' -E'
rcGrepExpr='beta|milestone|rc'
githubTags=( $(
git ls-remote --tags https://github.com/rabbitmq/rabbitmq-server.git \
"refs/tags/v${rcVersion}"{'','.*','-*','^*'} \
| cut -d'/' -f3- \
| cut -d'^' -f1 \
| { grep $rcGrepV -- "$rcGrepExpr" || :; } \
| sort -urV
) )
fullVersion=
githubTag=
for possibleTag in "${githubTags[@]}"; do
fullVersion="$(
{
# thanks GitHub...
wget -qO- "https://github.com/rabbitmq/rabbitmq-server/releases/expanded_assets/$possibleTag" \
|| wget -qO- "https://github.com/rabbitmq/rabbitmq-server/releases/tag/$possibleTag"
} | grep -oE "/rabbitmq-server-generic-unix-${rcVersion}([.-].+)?[.]tar[.]xz" \
| head -1 \
| sed -r "s/^.*(${rcVersion}.*)[.]tar[.]xz/\1/" \
|| :
)"
if [ -n "$fullVersion" ]; then
githubTag="$possibleTag"
break
fi
done
if [ -z "$fullVersion" ] || [ -z "$githubTag" ]; then
echo >&2 "warning: failed to get full version for '$version'; skipping"
continue
fi
export fullVersion
# if this is a "-rc" release, let's make sure the release it contains isn't already GA (and thus something we should not publish anymore)
export rcVersion
if [ "$rcVersion" != "$version" ] && rcFullVersion="$(jq <<<"$json" -r '.[env.rcVersion].version // ""')" && [ -n "$rcFullVersion" ]; then
latestVersion="$({ echo "$fullVersion"; echo "$rcFullVersion"; } | sort -V | tail -1)"
if [[ "$fullVersion" == "$rcFullVersion"* ]] || [ "$latestVersion" = "$rcFullVersion" ]; then
# "x.y.z-rc1" == x.y.z*
echo >&2 "warning: skipping/removing '$version' ('$rcVersion' is at '$rcFullVersion' which is newer than '$fullVersion')"
continue
fi
fi
otpMajor="${otpMajors[$rcVersion]}"
otpVersions=( $(
git ls-remote --tags https://github.com/erlang/otp.git \
"refs/tags/OTP-$otpMajor.*"\
| cut -d'/' -f3- \
| cut -d'^' -f1 \
| cut -d- -f2- \
| sort -urV
) )
otpVersion=
for possibleVersion in "${otpVersions[@]}"; do
if otpSourceSha256="$(
wget -qO- "https://github.com/erlang/otp/releases/download/OTP-$possibleVersion/SHA256.txt" \
| awk -v v="$possibleVersion" '$2 == "otp_src_" v ".tar.gz" { print $1 }'
)"; then
otpVersion="$possibleVersion"
break
fi
done
if [ -z "$otpVersion" ]; then
echo >&2 "warning: failed to get Erlang/OTP version for '$version' ($fullVersion); skipping"
continue
fi
export otpVersion otpSourceSha256
opensslMajor="${opensslMajors[$rcVersion]}"
# grab versions from upstream and ignore any alpha/beta releases
opensslVersions=( $(
git ls-remote --tags https://github.com/openssl/openssl.git \
"refs/tags/openssl-$opensslMajor.*"\
| cut -d'/' -f3- \
| cut -d'^' -f1 \
| cut -d- -f2- \
| grep -vE -- '-[A-Za-z]+' \
| sort -urV
) )
opensslVersion=
for possibleVersion in "${opensslVersions[@]}"; do
if opensslSourceSha256="$(wget -qO- "https://github.com/openssl/openssl/releases/download/openssl-$possibleVersion/openssl-$possibleVersion.tar.gz.sha256")"; then
opensslVersion="$possibleVersion"
break
fi
done
if [ -z "$opensslVersion" ]; then
echo >&2 "warning: failed to get OpenSSL version for '$version' ($fullVersion); skipping"
continue
fi
export opensslVersion opensslSourceSha256
# OpenSSL 3.0.5's sha256 file starts with a single space 😬
opensslSourceSha256="${opensslSourceSha256# }"
# OpenSSL 3.1.8+ and 3.3.3+ now include the filename
opensslSourceSha256="${opensslSourceSha256%% *}"
alpineVersion="${alpineVersions[$rcVersion]}"
export alpineVersion
ubuntuVersion="${ubuntuVersions[$rcVersion]}"
export ubuntuVersion
echo "$version: $fullVersion (otp $otpVersion, openssl $opensslVersion, alpine, $alpineVersion, ubuntu $ubuntuVersion)"
json="$(
jq <<<"$json" -c '
.[env.version] = {
version: env.fullVersion,
openssl: {
version: env.opensslVersion,
sha256: env.opensslSourceSha256,
},
otp: {
version: env.otpVersion,
sha256: env.otpSourceSha256,
},
alpine: {
version: env.alpineVersion
},
ubuntu: {
version: env.ubuntuVersion
},
}
'
)"
# make sure RCs and releases have corresponding pairs
json="$(jq <<<"$json" -c '
.[
env.rcVersion
+ if env.version == env.rcVersion then
"-rc"
else "" end
] //= null
')"
done
jq <<<"$json" -S . > versions.json