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 " go"
17+ check_command " gojq"
18+ check_command " sort"
19+
20+ if [ -z " $1 " ]; then
21+ echo " Usage: $0 <new_version>"
22+ echo " Example: $0 v2.17.0"
23+ exit 1
24+ fi
25+
26+ if [ ! -f " ${DATA_FILE} " ]; then
27+ echo " Error: Data file not found at ${DATA_FILE} " >&2
28+ exit 1
29+ fi
30+
31+ NEW_VERSION_WITH_V=$1
32+ CLEAN_NEW_VERSION=${NEW_VERSION_WITH_V# v}
33+
34+ echo " Starting update process for version ${NEW_VERSION_WITH_V} ..."
35+
36+ echo " Checking k8s.io/client-go version from go.mod..."
37+ GO_MOD_FILE=" ${REPO_ROOT} /go.mod"
38+
39+ if [ ! -f " ${GO_MOD_FILE} " ]; then
40+ echo " Error: go.mod file not found at ${GO_MOD_FILE} " >&2
41+ exit 1
42+ fi
43+
44+ CLIENT_GO_FULL_VERSION=$( go list -m -f ' {{.Version}}' k8s.io/client-go)
45+
46+ if [ -z " $CLIENT_GO_FULL_VERSION " ]; then
47+ echo " Error: Could not find k8s.io/client-go version in go.mod." >&2
48+ exit 1
49+ fi
50+
51+ K8S_MINOR=$( echo " ${CLIENT_GO_FULL_VERSION} " | cut -d. -f2)
52+
53+ K8S_VERSION_FOR_NEW_RELEASE=" 1.${K8S_MINOR} "
54+ echo " New release ${NEW_VERSION_WITH_V} will be mapped to Kubernetes (N-1): ${K8S_VERSION_FOR_NEW_RELEASE} "
55+
56+
57+ JSON_DATA=$( cat " ${DATA_FILE} " | gojq -r --yaml-input ' .' )
58+
59+ EXISTING_EXACT_MATCH=$( echo " ${JSON_DATA} " | gojq -r --arg version " ${NEW_VERSION_WITH_V} " --arg k8s " ${K8S_VERSION_FOR_NEW_RELEASE} " ' .compat[] | select(.version == $version and .kubernetes == $k8s) | .version // empty' )
60+
61+ if [ -n " ${EXISTING_EXACT_MATCH} " ]; then
62+ echo " Entry for ${NEW_VERSION_WITH_V} with Kubernetes ${K8S_VERSION_FOR_NEW_RELEASE} already exists. No changes needed."
63+ exit 0
64+ fi
65+
66+ EXISTING_KSM_VERSION_ENTRY=$( echo " ${JSON_DATA} " | gojq -r --arg version " ${NEW_VERSION_WITH_V} " ' .compat[] | select(.version == $version) | .version // empty' )
67+
68+ if [ -n " ${EXISTING_KSM_VERSION_ENTRY} " ]; then
69+ echo " Version ${NEW_VERSION_WITH_V} found with a different K8s mapping. Updating..."
70+ cat > " ${DATA_FILE} " << EOF
71+ # The purpose of this config is to keep all versions in a single place.
72+ #
73+ # Marks the latest release
74+ version: "${CLEAN_NEW_VERSION} "
75+
76+ # List at max 5 releases here + the main branch
77+ compat:
78+ EOF
79+
80+
81+ echo " ${JSON_DATA} " | gojq -r --arg version " ${NEW_VERSION_WITH_V} " --arg k8s " ${K8S_VERSION_FOR_NEW_RELEASE} " '
82+ .compat[] | select(.version != $version) | " - kubernetes: \"" + .kubernetes + "\"\n version: " + .version
83+ ' >> " ${DATA_FILE} "
84+
85+ echo " - kubernetes: \" ${K8S_VERSION_FOR_NEW_RELEASE} \" " >> " ${DATA_FILE} "
86+ echo " version: ${NEW_VERSION_WITH_V} " >> " ${DATA_FILE} "
87+
88+ echo " Successfully updated existing entry for ${NEW_VERSION_WITH_V} ."
89+ echo " --- Final ${DATA_FILE} content ---"
90+ cat " ${DATA_FILE} "
91+ exit 0
92+ fi
93+
94+ echo " Adding new version ${NEW_VERSION_WITH_V} and pruning old releases..."
95+
96+ VERSIONS_LIST=$( echo " ${JSON_DATA} " | gojq -r ' .compat[] | select(.version != "main") | "\(.version)|\(.kubernetes)"' 2> /dev/null || true)
97+ FULL_VERSIONS_LIST=$( printf " %s\n%s|%s" " ${VERSIONS_LIST} " " ${NEW_VERSION_WITH_V} " " ${K8S_VERSION_FOR_NEW_RELEASE} " )
98+
99+ SORTED_VERSIONS=$( echo " ${FULL_VERSIONS_LIST} " | grep -v ' ^$' | sort -t' |' -k1,1 -Vr | head -n " ${NUM_RELEASES_TO_KEEP} " | sort -t' |' -k1,1 -V)
100+
101+ cat > " ${DATA_FILE} " << EOF
102+ # The purpose of this config is to keep all versions in a single place.
103+
104+ # Marks the latest release
105+ version: "${CLEAN_NEW_VERSION} "
106+
107+ # List at max 5 releases here + the main branch
108+ compat:
109+ EOF
110+
111+ while IFS=' |' read -r version k8s_ver; do
112+ if [ -n " ${version} " ]; then
113+ echo " - version: \" ${version} \" " >> " ${DATA_FILE} "
114+ echo " kubernetes: \" ${k8s_ver} \" " >> " ${DATA_FILE} "
115+ fi
116+ done <<< " ${SORTED_VERSIONS}"
117+
118+ echo " - version: \" main\" " >> " ${DATA_FILE} "
119+ echo " kubernetes: \" ${K8S_VERSION_FOR_NEW_RELEASE} \" " >> " ${DATA_FILE} "
120+
121+ echo " Successfully updated and pruned ${DATA_FILE} ."
122+ echo " New release (${NEW_VERSION_WITH_V} ) is mapped to Kubernetes: ${K8S_VERSION_FOR_NEW_RELEASE} "
123+ echo " Main branch is mapped to Kubernetes: ${K8S_VERSION_FOR_NEW_RELEASE} "
124+ echo " --- Final ${DATA_FILE} content ---"
125+ cat " ${DATA_FILE} "
0 commit comments