#!/bin/bash # GENERATED — component={{COMPONENT}} bundle={{BUNDLE_ID}} op=update # Re-applies workload manifests only. Preserves namespace, pvc, secret. set -euo pipefail BUNDLE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" LOG="${BUNDLE_DIR}/update.log" NAMESPACE="{{NAMESPACE}}" COMPONENT="{{COMPONENT}}" STEP="init" exec > >(tee -a "$LOG") 2>&1 _kubectl() { if command -v kubectl >/dev/null 2>&1; then command kubectl "$@" elif command -v k0s >/dev/null 2>&1; then k0s kubectl "$@" else echo "ERROR: no kubectl or k0s binary found on host" >&2 exit 127 fi } _fail() { local rc=$? echo "FAILED step=${STEP} line=${BASH_LINENO[0]} rc=${rc}" >&2 exit "${rc}" } trap _fail ERR echo "[update] component=${COMPONENT} bundle={{BUNDLE_ID}} namespace=${NAMESPACE} started=$(date -Iseconds)" STEP="precheck-namespace" _kubectl get namespace "${NAMESPACE}" >/dev/null STEP="apply-workload" for manifest in {{MANIFESTS_ORDER}}; do # Skip namespace and pvc — update must preserve durable slices case "${manifest}" in namespace.yaml|pvc.yaml) continue ;; esac STEP="apply-${manifest%.yaml}" echo "[update] applying ${manifest}" _kubectl apply -f "${BUNDLE_DIR}/${manifest}" done STEP="rollout" for kind in statefulset deployment; do for name in $(_kubectl get "${kind}" --namespace "${NAMESPACE}" --selector "app.kubernetes.io/name=${COMPONENT}" -o name 2>/dev/null || true); do STEP="rollout-${name//\//-}" _kubectl rollout status --namespace "${NAMESPACE}" "${name}" --timeout=240s done done STEP="done" echo "[update] OK finished=$(date -Iseconds)"