#!/usr/bin/env bash ##### # Wrapper around "helm upgrade" that is able to rollback a failed release before retrying ##### RELEASE=$1 CHART=$2 shift 2 NAMESPACE_ARG= TIMEOUT_ARG= HELM_ARGS= while :; do case $1 in --help) helm upgrade --help exit ;; --namespace) NAMESPACE_ARG="$1 $2" shift ;; --timeout) TIMEOUT_ARG="$1 $2" shift ;; ?*) HELM_ARGS="$HELM_ARGS $1" ;; *) break esac shift done set -eo pipefail if helm-exists $RELEASE $NAMESPACE_ARG; then status="$(helm status $RELEASE $NAMESPACE_ARG --output json | jq -r '.info.status')" if [ "$status" = "pending-install" ]; then echo "Deleting failed release..." helm delete $RELEASE $NAMESPACE_ARG --wait $TIMEOUT_ARG elif [ "$status" = "pending-upgrade" ]; then echo "Rolling back failed upgrade..." helm rollback $RELEASE $NAMESPACE_ARG --cleanup-on-fail --wait --wait-for-jobs $TIMEOUT_ARG elif [ "$status" = "pending-rollback" ]; then echo "Completing pending rollback..." helm rollback $RELEASE $NAMESPACE_ARG --cleanup-on-fail --wait --wait-for-jobs $TIMEOUT_ARG fi fi exec helm upgrade $RELEASE $CHART $NAMESPACE_ARG $TIMEOUT_ARG $HELM_ARGS