199 lines
5.3 KiB
Bash
Executable File
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
|