#!/usr/bin/env bash set -euo pipefail # init_registry.sh # Purpose: # - Deploy ArgoCD into Kubernetes (replaces in-cluster Docker registry) SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # Load environment and config via prole_cfg.sh # shellcheck disable=SC1090 source "$SCRIPT_DIR/prole_cfg.sh" if [[ -z "${PROLE_SERVICE:-}" ]]; then echo "ERROR: PROLE_SERVICE is not defined. Provide PROLE_HOME/env.sh or ~/.prole/env.sh" >&2 exit 1 fi ACTION="" NAMESPACE_OVERRIDE="" if [[ -d "$SCRIPT_DIR/../k8s/argocd" ]]; then ARGOCD_MANIFEST_DIR="$SCRIPT_DIR/../k8s/argocd" elif [[ -n "${PROLE_HOME:-}" && -d "$PROLE_HOME/k8s/argocd" ]]; then ARGOCD_MANIFEST_DIR="$PROLE_HOME/k8s/argocd" else ARGOCD_MANIFEST_DIR="$SCRIPT_DIR/../k8s/argocd" fi ARGOCD_MANIFEST_FILE=${ARGOCD_MANIFEST_FILE:-"$ARGOCD_MANIFEST_DIR/install.yaml"} usage() { cat < Deploys ArgoCD into the target namespace (common services layer). Note: The local Docker registry (port 5000) is managed separately. EOF } while [[ $# -gt 0 ]]; do case "$1" in -m|--mode) shift prole_set_mode "${1:-}" ;; -m=*|--mode=*) prole_set_mode "${1#*=}" ;; -n|--namespace) shift if [[ -z "${1:-}" ]]; then echo "ERROR: -n/--namespace requires a value" >&2 exit 2 fi NAMESPACE_OVERRIDE="$1" ;; -n=*|--namespace=*) NAMESPACE_OVERRIDE="${1#*=}" ;; start|stop|status|restart|initialize|update|reload) ACTION="$1" ;; -h|--help) usage exit 0 ;; *) if [[ -z "$ACTION" && "$1" != -* ]]; then ACTION="$1" else echo "Unknown argument: $1" >&2 usage exit 2 fi ;; esac shift done if [[ -n "$NAMESPACE_OVERRIDE" ]]; then ARGOCD_NAMESPACE="$NAMESPACE_OVERRIDE" elif [[ -n "${ARGOCD_NAMESPACE:-}" ]]; then ARGOCD_NAMESPACE="$ARGOCD_NAMESPACE" elif [[ -n "${SERVICE_NAMESPACE:-}" ]]; then ARGOCD_NAMESPACE="$SERVICE_NAMESPACE" elif [[ -n "${NAMESPACE:-}" ]]; then ARGOCD_NAMESPACE="$NAMESPACE" else ARGOCD_NAMESPACE="default" fi export ARGOCD_NAMESPACE export NAMESPACE="$ARGOCD_NAMESPACE" ARGOCD_LABEL_SELECTOR=${ARGOCD_LABEL_SELECTOR:-"app.kubernetes.io/part-of=argocd"} ARGOCD_SERVER_SERVICE=${ARGOCD_SERVER_SERVICE:-argocd-server} ARGOCD_PORT_FORWARD_LOCAL=${ARGOCD_PORT_FORWARD_LOCAL:-8081} ARGOCD_PORT_FORWARD_REMOTE=${ARGOCD_PORT_FORWARD_REMOTE:-80} ensure_tools() { command -v kubectl >/dev/null || { echo "Missing required tool: kubectl" >&2; exit 1; } } ensure_namespace() { if ! kubectl get namespace "$ARGOCD_NAMESPACE" >/dev/null 2>&1; then echo "Creating namespace '$ARGOCD_NAMESPACE' ..." kubectl create namespace "$ARGOCD_NAMESPACE" >/dev/null 2>&1 || true fi } render_manifest() { if [[ ! -f "$ARGOCD_MANIFEST_FILE" ]]; then echo "ERROR: ArgoCD manifest not found: $ARGOCD_MANIFEST_FILE" >&2 exit 1 fi sed "s|\\${ARGOCD_NAMESPACE}|$ARGOCD_NAMESPACE|g" "$ARGOCD_MANIFEST_FILE" } apply_k8s() { echo "Applying ArgoCD manifest to namespace '$ARGOCD_NAMESPACE' ..." render_manifest | kubectl apply --server-side --force-conflicts --field-manager=prole-installer --validate=false -n "$ARGOCD_NAMESPACE" -f - kubectl rollout status deploy/argocd-server -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status deploy/argocd-repo-server -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status deploy/argocd-dex-server -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status deploy/argocd-applicationset-controller -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status deploy/argocd-notifications-controller -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status deploy/argocd-redis -n "$ARGOCD_NAMESPACE" --timeout=180s || true kubectl rollout status statefulset/argocd-application-controller -n "$ARGOCD_NAMESPACE" --timeout=180s || true } delete_k8s() { echo "Removing ArgoCD resources from namespace '$ARGOCD_NAMESPACE' ..." render_manifest | kubectl delete -n "$ARGOCD_NAMESPACE" -f - --ignore-not-found } status_k8s() { kubectl -n "$ARGOCD_NAMESPACE" get deploy,statefulset,svc -l "$ARGOCD_LABEL_SELECTOR" 2>/dev/null || true kubectl -n "$ARGOCD_NAMESPACE" get pods -l "$ARGOCD_LABEL_SELECTOR" 2>/dev/null || true } case "${ACTION:-}" in start|initialize|update|reload|restart) ensure_tools ensure_namespace apply_k8s prole_register_port_forward "argocd" "$ARGOCD_NAMESPACE" "svc/${ARGOCD_SERVER_SERVICE}" \ "$ARGOCD_PORT_FORWARD_LOCAL" "$ARGOCD_PORT_FORWARD_REMOTE" "0.0.0.0" "TCP" "ArgoCD" ;; stop) ensure_tools delete_k8s ;; status) ensure_tools status_k8s ;; *) usage >&2 exit 1 ;; esac