From 16c05d16e25723b8c741bf34fd997ae872377702 Mon Sep 17 00:00:00 2001
From: paulfantom <pawel@krupa.net.pl>
Date: Fri, 5 Mar 2021 10:36:58 +0100
Subject: [PATCH] jsonnet,scripts: better version updater

---
 jsonnet/kube-prometheus/versions.json |  1 +
 scripts/generate-versions.sh          | 42 ++++++++++++++++++++++-----
 2 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/jsonnet/kube-prometheus/versions.json b/jsonnet/kube-prometheus/versions.json
index 71b77d08..db5f2a94 100644
--- a/jsonnet/kube-prometheus/versions.json
+++ b/jsonnet/kube-prometheus/versions.json
@@ -2,6 +2,7 @@
   "alertmanager": "0.21.0",
   "blackboxExporter": "0.18.0",
   "grafana": "7.4.3",
+  "kubeStateMetrics": "1.9.8",
   "nodeExporter": "1.1.1",
   "prometheus": "2.25.0",
   "prometheusAdapter": "0.8.3",
diff --git a/scripts/generate-versions.sh b/scripts/generate-versions.sh
index 4db472a1..3eb01bae 100755
--- a/scripts/generate-versions.sh
+++ b/scripts/generate-versions.sh
@@ -2,11 +2,38 @@
 
 set -euo pipefail
 
+# Get component version from GitHub API
 get_latest_version() {
   echo >&2 "Checking release version for ${1}"
   curl --retry 5 --silent --fail -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/${1}/releases/latest" | jq '.tag_name' | tr -d '"v'
 }
 
+# Get component version from version file
+get_current_version() {
+  echo >&2 "Reading currently used version of ${1}"
+  jq -r ".${1}" "$VERSION_FILE"
+}
+
+# Get version from online source and filter out unstable releases. In case of unstable release use what is set in version file
+get_version() {
+  component="${1}"
+  v="$(get_latest_version "${component}")"
+  
+  # Advanced AI heurestics to filter out common patterns suggesting new version is not stable /s
+  if [[ "$v" == *"alpha"* ]] || [[ "$v" == *"beta"* ]] || [[ "$v" == *"rc"* ]] || [[ "$v" == *"helm"* ]]; then
+     component="$(convert_to_camel_case "$(echo "${component}" | sed 's/^.*\///')")"
+     v="$(get_current_version "${component}")"
+  fi
+  echo "$v"
+}
+
+convert_to_camel_case() {
+  echo "${1}" | sed -E 's/[ _-]([a-z])/\U\1/gi;s/^([A-Z])/\l\1/'
+}
+
+# File is used to read current versions
+VERSION_FILE="jsonnet/kube-prometheus/versions.json"
+
 # token can be passed as `GITHUB_TOKEN` variable or passed as first argument
 GITHUB_TOKEN=${GITHUB_TOKEN:-${1}}
 
@@ -17,12 +44,13 @@ fi
 
 cat <<-EOF
 {
-  "alertmanager": "$(get_latest_version "prometheus/alertmanager")",
-  "blackboxExporter": "$(get_latest_version "prometheus/blackbox_exporter")",
-  "grafana": "$(get_latest_version "grafana/grafana")",
-  "nodeExporter": "$(get_latest_version "prometheus/node_exporter")",
-  "prometheus": "$(get_latest_version "prometheus/prometheus")",
-  "prometheusAdapter": "$(get_latest_version "kubernetes-sigs/prometheus-adapter")",
-  "prometheusOperator": "$(get_latest_version "prometheus-operator/prometheus-operator")"
+  "alertmanager": "$(get_version "prometheus/alertmanager")",
+  "blackboxExporter": "$(get_version "prometheus/blackbox_exporter")",
+  "grafana": "$(get_version "grafana/grafana")",
+  "kubeStateMetrics": "$(get_version "kubernetes/kube-state-metrics")",
+  "nodeExporter": "$(get_version "prometheus/node_exporter")",
+  "prometheus": "$(get_version "prometheus/prometheus")",
+  "prometheusAdapter": "$(get_version "kubernetes-sigs/prometheus-adapter")",
+  "prometheusOperator": "$(get_version "prometheus-operator/prometheus-operator")"
 }
 EOF
-- 
GitLab