#!/usr/bin/env bash check_kubectl() { if ! command -v kubectl &>/dev/null; then echo "Error: kubectl is not installed or not in PATH" >&2 exit 1 fi log_info "kubectl found at $(command -v kubectl)" } VERBOSE=0 log_debug() { [[ $VERBOSE -ge 3 ]] && echo "[DEBUG] $*" || true; } log_verbose() { [[ $VERBOSE -ge 2 ]] && echo "[VERBOSE] $*" || true; } log_info() { [[ $VERBOSE -ge 1 ]] && echo "[INFO] $*" || true; } log_error() { echo "[ERROR] $*" >&2; } usage() { cat <&2 usage >&2 exit 1 ;; *) TARGET_VERSION="$1" shift ;; esac done log_debug "Script started with target version: ${TARGET_VERSION:-auto}" check_kubectl log_info "Checking current kubectl context" CURRENT_CONTEXT=$(kubectl config current-context 2>/dev/null) log_verbose "Current context: $CURRENT_CONTEXT" log_info "Checking for ArgoCD installation" if ! kubectl get ns argocd &>/dev/null; then log_error "ArgoCD namespace not found. This script only upgrades existing installations." exit 1 fi log_verbose "ArgoCD namespace found" log_info "Checking current ArgoCD version" CURRENT_VERSION=$(kubectl get deployment argocd-server -n argocd -o jsonpath='{.spec.template.spec.containers[0].image}' 2>/dev/null) if [[ -n "$CURRENT_VERSION" ]]; then CURRENT_VERSION=$(echo "$CURRENT_VERSION" | sed 's/.*argocd:v\?//' | tr -d ' \n') if [[ -n "$CURRENT_VERSION" ]]; then CURRENT_VERSION="${CURRENT_VERSION#v}" log_verbose "Current ArgoCD version: $CURRENT_VERSION" else log_error "Could not extract ArgoCD version from image: $CURRENT_VERSION" exit 1 fi fi if [[ -z "$TARGET_VERSION" ]]; then log_info "No target version specified, querying for latest version" log_verbose "Fetching latest release from GitHub" LATEST_VERSION=$(curl -s https://api.github.com/repos/argoproj/argo-cd/releases/latest | grep -oP '"tag_name":\s*"\K[^"]+' | sed 's/^v//') if [[ -n "$LATEST_VERSION" ]]; then log_verbose "Latest version available: $LATEST_VERSION" TARGET_VERSION="$LATEST_VERSION" else echo "Error: Could not fetch latest version" >&2 exit 1 fi fi log_info "Target version: $TARGET_VERSION" log_debug "Determining update path from $CURRENT_VERSION to $TARGET_VERSION" log_info "Applying ArgoCD manifests" log_verbose "Downloading manifest from https://raw.githubusercontent.com/argoproj/argo-cd/v${TARGET_VERSION}/manifests/install.yaml" curl -sLO "https://raw.githubusercontent.com/argoproj/argo-cd/v${TARGET_VERSION}/manifests/install.yaml" log_debug "Applying manifest with kubectl" if [[ "$DRY_RUN" == true ]]; then log_verbose "Dry-run mode: would apply manifest" kubectl apply -n argocd -f install.yaml --dry-run=client else kubectl apply -n argocd -f install.yaml fi log_verbose "Cleaning up downloaded manifest" rm -f install.yaml log_info "Update to ArgoCD $TARGET_VERSION initiated"