@@ -35,11 +35,139 @@ spec:
3535 valueFrom :
3636 fieldRef :
3737 fieldPath : metadata.namespace
38- - name : VERSION
38+ - name : CHART_VERSION
3939 value : {{ .Chart.Version }}
40+ - name : ARGOCD_CHECK_VERSION
41+ value : {{ not (get .Values "argo-cd").enabled | quote }}
42+ - name : ARGOCD_LABELS
43+ value : " {{ range $k, $v := .Values.installer.argoCdVersionCheck.argoServerLabels }}{{ $k }}={{ $v }},{{ end }}"
44+ - name : ARGOCD_VERSION_PATH
45+ value : " /api/version"
46+ - name : REQUIRED_VERSION_CONSTRAINT
47+ value : " >=2.12 <3"
4048 command : ["sh", "-c"]
41- args :
42- - cf helm validate --values /job_tmp/values.yaml --namespace ${NAMESPACE} --version ${VERSION} --hook --log-level debug
49+ args :
50+ - | # shell
51+ # Function to find Argo CD service and export its name and port
52+ get_argocd_service_info() {
53+ local service_info
54+ local service_count
55+
56+ # Clean labels
57+ CLEAN_LABELS=$(echo "$ARGOCD_LABELS" | sed 's/,$//')
58+
59+ echo "Searching for Argo CD service in namespace '$NAMESPACE' with labels '$CLEAN_LABELS'"
60+ service_info=$(kubectl get svc -n "$NAMESPACE" -l "$CLEAN_LABELS" -o json)
61+ service_count=$(echo "$service_info" | jq '.items | length')
62+
63+ if [ "$service_count" -eq 0 ]; then
64+ echo "Error: No Argo CD service found matching labels '$CLEAN_LABELS' in namespace '$NAMESPACE'."
65+ exit 1
66+ elif [ "$service_count" -gt 1 ]; then
67+ echo "Warning: Found multiple services matching labels '$CLEAN_LABELS'. Using the first one found."
68+ fi
69+
70+ # Set global variables
71+ SERVICE_NAME=$(echo "$service_info" | jq -r '.items[0].metadata.name')
72+ SERVICE_PORT=$(echo "$service_info" | jq -r '.items[0].spec.ports[0].port')
73+
74+ if [ -z "$SERVICE_NAME" ] || [ "$SERVICE_NAME" = "null" ] || [ -z "$SERVICE_PORT" ] || [ "$SERVICE_PORT" = "null" ]; then
75+ echo "Error: Could not extract service name or port from the found service."
76+ exit 1
77+ fi
78+
79+ echo "Found Argo CD service '$SERVICE_NAME' on port '$SERVICE_PORT'"
80+ }
81+
82+ # Function to get and normalize the Argo CD root path
83+ get_argocd_root_path() {
84+ local root_path
85+
86+ echo "Fetching Argo CD root path from ConfigMap '$ARGOCD_CM_PARAMS_NAME' in namespace '$NAMESPACE'..."
87+ root_path=$(kubectl get configmap "$ARGOCD_CM_PARAMS_NAME" -n "$NAMESPACE" -o jsonpath='{.data.server\.rootpath}' 2>/dev/null || echo "")
88+
89+ if [ -n "$root_path" ] && [ "$root_path" != "/" ]; then
90+ root_path=$(echo "$root_path" | sed 's:/*$::') # Remove trailing slash
91+ [ "${root_path#\/}" = "$root_path" ] && root_path="/$root_path" # Add leading slash if missing
92+ elif [ "$root_path" = "/" ]; then
93+ root_path="" # Treat as empty for URL construction
94+ else
95+ echo "Warning: 'server.rootpath' not found in ConfigMap '$ARGOCD_CM_PARAMS_NAME' or ConfigMap not found. Assuming default root path '/'. "
96+ root_path="" # Default to empty string
97+ fi
98+
99+ # Set global variable
100+ ARGOCD_ROOT_PATH="$root_path"
101+ echo "Using Argo CD root path: '${ARGOCD_ROOT_PATH:-/}'"
102+ }
103+
104+ # Function to get the Argo CD version string via API
105+ get_argocd_version_string() {
106+ # Local variables for values obtained internally
107+ local api_full_path
108+ local target_url
109+ local curl_opts
110+ local version_json
111+ local curl_exit_code
112+
113+ # Call functions to get required info - they set global vars
114+ # We'll use the global vars directly after calling
115+ get_argocd_service_info
116+ get_argocd_root_path
117+
118+ # Construct Target URL using the globally set variables
119+ api_full_path=$(echo "${ARGOCD_ROOT_PATH}${ARGOCD_VERSION_PATH}" | sed 's://:/:g')
120+ target_url="http://${SERVICE_NAME}.${NAMESPACE}.svc.cluster.local:${SERVICE_PORT}${api_full_path}"
121+ echo "Checking Argo CD version via API: $target_url"
122+
123+ # Curl Execution
124+ curl_opts="-sS --fail --connect-timeout 10 -L -k" # Base options, follow redirects
125+ version_json=$(curl $curl_opts "$target_url")
126+ curl_exit_code=$?
127+
128+ if [ $curl_exit_code -ne 0 ]; then
129+ echo "Error: Failed to connect to Argo CD API at $target_url (curl exit code: $curl_exit_code)."
130+ exit 1
131+ fi
132+
133+ # Version Parsing - Set global variable
134+ VERSION_STRING=$(echo "$version_json" | jq -r '.Version')
135+ if [ -z "$VERSION_STRING" ] || [ "$VERSION_STRING" = "null" ]; then
136+ echo "Error: Could not parse '.Version' field from API response using jq."
137+ echo "Response JSON: $version_json"
138+ exit 1
139+ fi
140+ }
141+
142+ # Function to validate Argo CD version and perform semver check
143+ validate_argocd_version() {
144+ # Call function to get version string (sets VERSION_STRING)
145+ # This function now internally calls get_argocd_service_info and get_argocd_root_path
146+ get_argocd_version_string
147+
148+ # Clean potential 'v' prefix for semver tool
149+ CLEAN_VERSION_STRING=${VERSION_STRING#v}
150+
151+ echo "Found Argo CD version string: $VERSION_STRING (using $CLEAN_VERSION_STRING for check)"
152+ echo "Required version constraint: $REQUIRED_VERSION_CONSTRAINT"
153+
154+ # --- Semver Check (using semver CLI) ---
155+ echo "Performing semver check using 'semver-cli'..."
156+ if semver-cli satisfies "$CLEAN_VERSION_STRING" "$REQUIRED_VERSION_CONSTRAINT"; then
157+ echo "Argo CD version $VERSION_STRING satisfies range '$REQUIRED_VERSION_CONSTRAINT'."
158+ else
159+ echo "Error: Argo CD version $VERSION_STRING does not satisfy required range '$REQUIRED_VERSION_CONSTRAINT'."
160+ exit 1
161+ fi
162+ }
163+
164+ if [ "$ARGOCD_CHECK_VERSION" = "true" ]; then
165+ validate_argocd_version
166+ fi
167+
168+ # --- Helm Values Validation (cf cli) ---
169+ echo "Argo CD version check passed. Validating helm values using cf cli..."
170+ cf helm validate --values /job_tmp/values.yaml --namespace ${NAMESPACE} --version ${CHART_VERSION} --hook --log-level debug
43171 volumeMounts :
44172 - name : customized-values
45173 mountPath : " /job_tmp"
0 commit comments