#!/usr/bin/env bash set -euo pipefail CREATE_LOCAL_GCROOT=false while [[ "$#" -gt 0 ]]; do case "$1" in --help) echo "Use --create-local-gcroot to create local GC root" exit 0 ;; --create-local-gcroot) CREATE_LOCAL_GCROOT=true shift ;; *) echo "Unknown option: $1" exit 1 ;; esac done first_server="${SERVERS%% *}" previous_manifest=$( envsubst <<EOF | ssh -T "root@$first_server.dmz" if [[ -f "$GCROOTDIR/$NAME.yml" ]]; then cat "$GCROOTDIR/$NAME.yml" fi EOF ) set +e if [ -z "$previous_manifest" ]; then echo No previous manifest found! else $DYFF between <(echo "$previous_manifest") "$MANIFEST" \ --exclude-regexp metadata.labels.kubenix/hash \ --exclude-regexp labels.kubenix/hash \ --set-exit-code fi set -e read -r -p "Continue? " _ echo Uploading closure... for server in $SERVERS; do echo Uploading closure to "$server"... nix copy --to "ssh://root@$server.dmz" "$MANIFEST" done echo Applying Kubernetes manifest... export KUBECTL_APPLYSET=true vals eval -fail-on-missing-key-in-map <"$MANIFEST" | kubectl apply -f - \ --prune \ --applyset applyset-"$NAME" \ --namespace "$NAMESPACE" echo Creating GC roots for server in $SERVERS; do ssh "root@$server.dmz" "mkdir -p $GCROOTDIR && ln -sf $MANIFEST $GCROOTDIR/${NAME}.yml" done if $CREATE_LOCAL_GCROOT; then mkdir -p ./.manifests ln -sf "$MANIFEST" "./.manifests/${NAME}.yml" fi