constellation/.github/actions/gcpccm_vers_to_build/findvers.sh
2024-06-19 16:26:02 +02:00

86 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
function info() {
echo "$@" 1>&2
}
function error() {
echo "::err::$*"
exit 1
}
allCCMVersions=$(git tag | grep ccm || test $? = 1)
if [[ -z ${allCCMVersions} ]]; then
error "No CCM tags found in git"
fi
allMajorVersions=()
for ver in ${allCCMVersions}; do
major=${ver#ccm/v} # remove "ccm/v" prefix
major=${major%%.*} # remove everything after the first dot
if [[ ${major} -eq 0 ]]; then
continue # skip major version 0
fi
# Check if this major version is already in the list.
for existingMajor in "${allMajorVersions[@]}"; do
if [[ ${existingMajor} -eq ${major} ]]; then
continue 2
fi
done
info "Found major version ${major}"
allMajorVersions+=("${major}")
done
if [[ ${#allMajorVersions[@]} -eq 0 ]]; then
error "No major versions found in CCM tags"
fi
existingContainerVersions=$(crane ls "ghcr.io/edgelesssys/cloud-provider-gcp")
if [[ -z ${existingContainerVersions} ]]; then
info "No existing container versions found"
fi
versionsToBuild=()
for major in "${allMajorVersions[@]}"; do
# Get the latest released version with this major version.
latest=$(echo "${allCCMVersions[@]}" | grep "${major}" | sort -V | tail -n 1)
latest=${latest#ccm/} # remove "ccm/" prefix, keep v
if [[ -z ${latest} ]]; then
error "Could not determine latest version with major ${major}"
fi
info "Latest ${major} version is ${latest}"
# Find the latest version with this major version.
majorVerRegexp="v${major}.[0-9]+.[0-9]+"
allExistingWithMajor=$(grep -E "${majorVerRegexp}" <<< "${existingContainerVersions}" || test $? = 1)
latestExistingWithMinor=$(echo "${allExistingWithMajor}" | sort -V | tail -n 1)
# If there is no existing version with this major version, build the latest released version.
if [[ -z ${latestExistingWithMinor} ]]; then
info "No existing version with major ${major}, adding ${latest} to versionsToBuild"
versionsToBuild+=("${latest}")
continue
fi
info "Latest existing version with major ${major} is ${latestExistingWithMinor}"
newerVer=$(echo -e "${latest}\n${latestExistingWithMinor}" | sort -V | tail -n 1)
if [[ ${newerVer} == "${latestExistingWithMinor}" ]]; then
info "Existing version ${latestExistingWithMinor} is up to date, skipping"
continue
fi
info "Newer version ${latest} is available, existing version is ${latestExistingWithMinor}."
info "Adding ${latest} to versionsToBuild"
versionsToBuild+=("${latest}")
done
# Print one elem per line | quote elems | create array | remove empty elems and print compact.
printf '%s\n' "${versionsToBuild[@]}" | jq -R | jq -s | jq -c 'map(select(length > 0))'