1+ #! /bin/bash
2+ set -euo pipefail
3+
4+ SCRIPT_DIR=$( cd -- " $( dirname -- " ${BASH_SOURCE[0]} " ) " & > /dev/null && pwd )
5+ REPO_ROOT=$( cd -- " ${SCRIPT_DIR} /.." & > /dev/null && pwd )
6+ DATA_FILE=" ${REPO_ROOT} /data.yaml"
7+ NUM_RELEASES_TO_KEEP=5
8+
9+ check_command () {
10+ if ! command -v " $1 " & > /dev/null; then
11+ echo " ❌ Error: Required command '$1 ' not found. Please install it to continue." >&2
12+ exit 1
13+ fi
14+ }
15+
16+ check_command " yq"
17+ check_command " jq"
18+ check_command " curl"
19+ check_command " sort"
20+
21+ if [ -z " $1 " ]; then
22+ echo " Usage: $0 <new_version>"
23+ echo " Example: $0 v2.17.0"
24+ exit 1
25+ fi
26+
27+ if [ ! -f " ${DATA_FILE} " ]; then
28+ echo " Error: Data file not found at ${DATA_FILE} " >&2
29+ exit 1
30+ fi
31+
32+ NEW_VERSION_WITH_V=$1
33+ CLEAN_NEW_VERSION=${NEW_VERSION_WITH_V# v}
34+
35+ echo " Starting update process for version ${NEW_VERSION_WITH_V} ..."
36+
37+ echo " Fetching latest Kubernetes version..."
38+ LATEST_K8S_FULL_VERSION=$( curl --silent --fail " https://api.github.com/repos/kubernetes/kubernetes/releases/latest" | jq -r ' .tag_name' )
39+
40+ if [ -z " $LATEST_K8S_FULL_VERSION " ] || [ " $LATEST_K8S_FULL_VERSION " == " null" ]; then
41+ echo " Error: Failed to fetch the latest Kubernetes version from GitHub." >&2
42+ exit 1
43+ fi
44+
45+ LATEST_K8S_VERSION=$( echo " ${LATEST_K8S_FULL_VERSION} " | sed ' s/^v//' | cut -d. -f1,2)
46+ echo " Latest stable Kubernetes version (N): ${LATEST_K8S_VERSION} "
47+
48+ K8S_MAJOR=$( echo " ${LATEST_K8S_VERSION} " | cut -d. -f1)
49+ K8S_MINOR=$( echo " ${LATEST_K8S_VERSION} " | cut -d. -f2)
50+ PREV_K8S_MINOR=$(( K8 S_MINOR - 1 ))
51+ K8S_VERSION_FOR_NEW_RELEASE=" ${K8S_MAJOR} .${PREV_K8S_MINOR} "
52+ echo " New release ${NEW_VERSION_WITH_V} will be mapped to Kubernetes (N-1): ${K8S_VERSION_FOR_NEW_RELEASE} "
53+
54+
55+ EXISTING_EXACT_MATCH=$( yq eval " .compat[] | select(.version == \" ${NEW_VERSION_WITH_V} \" and .kubernetes == \" ${K8S_VERSION_FOR_NEW_RELEASE} \" )" " ${DATA_FILE} " )
56+
57+ if [ -n " ${EXISTING_EXACT_MATCH} " ]; then
58+ echo " Entry for ${NEW_VERSION_WITH_V} with Kubernetes ${K8S_VERSION_FOR_NEW_RELEASE} already exists. No changes needed."
59+ exit 0
60+ fi
61+
62+ EXISTING_KSM_VERSION_ENTRY=$( yq eval " .compat[] | select(.version == \" ${NEW_VERSION_WITH_V} \" )" " ${DATA_FILE} " )
63+
64+ if [ -n " ${EXISTING_KSM_VERSION_ENTRY} " ]; then
65+ echo " Version ${NEW_VERSION_WITH_V} found with a different K8s mapping. Updating..."
66+ # Update the kubernetes version for the existing entry
67+ yq eval " (.compat[] | select(.version == \" ${NEW_VERSION_WITH_V} \" )).kubernetes = \" ${K8S_VERSION_FOR_NEW_RELEASE} \" " -i " ${DATA_FILE} "
68+ # Also update the top-level version key and the main branch k8s version to keep everything current
69+ yq eval " .version = \" ${CLEAN_NEW_VERSION} \" " -i " ${DATA_FILE} "
70+ yq eval " (.compat[] | select(.version == \" main\" )).kubernetes = \" ${LATEST_K8S_VERSION} \" " -i " ${DATA_FILE} "
71+ echo " Successfully updated existing entry for ${NEW_VERSION_WITH_V} ."
72+ echo " --- Final ${DATA_FILE} content ---"
73+ cat " ${DATA_FILE} "
74+ exit 0
75+ fi
76+
77+ echo " Adding new version ${NEW_VERSION_WITH_V} and pruning old releases..."
78+
79+ TEMP_FILE=$( mktemp)
80+ trap ' rm -f ${TEMP_FILE}' EXIT
81+
82+ cat > " ${TEMP_FILE} " << EOF
83+ # The purpose of this config is to keep all versions in a single file and make them machine accessible
84+
85+ # Marks the latest release
86+ version: "${CLEAN_NEW_VERSION} "
87+
88+ # List at max ${NUM_RELEASES_TO_KEEP} releases here + the main branch
89+ compat:
90+ EOF
91+
92+ {
93+ yq eval ' .compat[] | select(.version != "main") | [.version, .kubernetes] | join("|")' " ${DATA_FILE} " 2> /dev/null || true
94+ echo " ${NEW_VERSION_WITH_V} |${K8S_VERSION_FOR_NEW_RELEASE} "
95+ } | sort -t' |' -k1,1 -Vr | head -n " ${NUM_RELEASES_TO_KEEP} " | sort -t' |' -k1,1 -V | while IFS=' |' read -r version k8s_ver; do
96+ echo " - version: \" ${version} \" " >> " ${TEMP_FILE} "
97+ echo " kubernetes: \" ${k8s_ver} \" " >> " ${TEMP_FILE} "
98+ done
99+
100+ cat >> " ${TEMP_FILE} " << EOF
101+ - version: "main"
102+ kubernetes: "${K8S_VERSION_FOR_NEW_RELEASE} "
103+ EOF
104+
105+ mv " ${TEMP_FILE} " " ${DATA_FILE} "
106+
107+ echo " Successfully updated and pruned ${DATA_FILE} ."
108+ echo " New release (${NEW_VERSION_WITH_V} ) is mapped to Kubernetes: ${K8S_VERSION_FOR_NEW_RELEASE} "
109+ echo " Main branch is mapped to Kubernetes: ${LATEST_K8S_VERSION} "
110+ echo " --- Final ${DATA_FILE} content ---"
111+ cat " ${DATA_FILE} "
0 commit comments