|
| 1 | +#!/usr/bin/env bash |
| 2 | +set -euo pipefail |
| 3 | + |
| 4 | +# @cspell: ignore argjson slurpfile endgroup |
| 5 | + |
| 6 | +APP_NAME='' |
| 7 | +RESOURCE_GROUP='' |
| 8 | +SLOT='' |
| 9 | +SETTINGS_FILE='' |
| 10 | + |
| 11 | +while [[ $# -gt 0 ]]; do |
| 12 | + case "$1" in |
| 13 | + --name) |
| 14 | + APP_NAME="$2" |
| 15 | + shift 2 |
| 16 | + ;; |
| 17 | + --resource-group) |
| 18 | + RESOURCE_GROUP="$2" |
| 19 | + shift 2 |
| 20 | + ;; |
| 21 | + --slot) |
| 22 | + SLOT="$2" |
| 23 | + shift 2 |
| 24 | + ;; |
| 25 | + --settings-file) |
| 26 | + SETTINGS_FILE="$2" |
| 27 | + shift 2 |
| 28 | + ;; |
| 29 | + *) |
| 30 | + echo "Unknown argument: $1" |
| 31 | + exit 1 |
| 32 | + ;; |
| 33 | + esac |
| 34 | +done |
| 35 | + |
| 36 | +if [[ -z "$APP_NAME" || -z "$RESOURCE_GROUP" || -z "$SETTINGS_FILE" ]]; then |
| 37 | + echo 'Usage: appsettings-apply-if-changed.sh --name <app> --resource-group <rg> [--slot <slot>] --settings-file <json>' |
| 38 | + exit 1 |
| 39 | +fi |
| 40 | + |
| 41 | +if [[ ! -f "$SETTINGS_FILE" ]]; then |
| 42 | + echo "::error::Settings file not found: $SETTINGS_FILE" |
| 43 | + exit 1 |
| 44 | +fi |
| 45 | + |
| 46 | +echo '::group::Diagnostics: desired settings' |
| 47 | +echo "Diagnostics: desired settings file path: $SETTINGS_FILE" |
| 48 | +echo 'Diagnostics: desired settings payload:' |
| 49 | +cat "$SETTINGS_FILE" |
| 50 | +echo '::endgroup::' |
| 51 | + |
| 52 | +SLOT_ARGS=() |
| 53 | +if [[ -n "$SLOT" ]]; then |
| 54 | + SLOT_ARGS+=(--slot "$SLOT") |
| 55 | +fi |
| 56 | + |
| 57 | +CURRENT_SETTINGS=$(az webapp config appsettings list \ |
| 58 | + --name "$APP_NAME" \ |
| 59 | + --resource-group "$RESOURCE_GROUP" \ |
| 60 | + "${SLOT_ARGS[@]}" \ |
| 61 | + --output json) |
| 62 | + |
| 63 | +echo "::group::Diagnostics: current app settings for $APP_NAME${SLOT:+ slot $SLOT}" |
| 64 | +echo "Diagnostics: current app settings for $APP_NAME${SLOT:+ slot $SLOT}:" |
| 65 | +echo "$CURRENT_SETTINGS" |
| 66 | +echo '::endgroup::' |
| 67 | + |
| 68 | +CHANGED_SETTINGS_FILE=$(mktemp) |
| 69 | + |
| 70 | +jq -n \ |
| 71 | + --slurpfile desired "$SETTINGS_FILE" \ |
| 72 | + --argjson current "$CURRENT_SETTINGS" \ |
| 73 | + ' |
| 74 | + ($current |
| 75 | + | map(select(type == "object")) |
| 76 | + | map(select((.name | type) == "string" and (.name | length) > 0)) |
| 77 | + | map({key: .name, value: .value}) |
| 78 | + | from_entries) as $current_map |
| 79 | + | ((($desired[0] // []) |
| 80 | + | if type == "array" then . else [] end) |
| 81 | + | map(select(type == "object")) |
| 82 | + | map(select((.name | type) == "string" and (.name | length) > 0))) |
| 83 | + | map(select(($current_map[.name] // "__MISSING__") != .value)) |
| 84 | + ' > "$CHANGED_SETTINGS_FILE" |
| 85 | + |
| 86 | +CHANGED_COUNT=$(jq 'length' "$CHANGED_SETTINGS_FILE") |
| 87 | +if [[ "$CHANGED_COUNT" -eq 0 ]]; then |
| 88 | + echo "No app settings changes detected for $APP_NAME${SLOT:+ slot $SLOT}. Skipping apply." |
| 89 | + rm -f "$CHANGED_SETTINGS_FILE" |
| 90 | + exit 0 |
| 91 | +fi |
| 92 | + |
| 93 | +echo "Applying $CHANGED_COUNT changed app setting(s) for $APP_NAME${SLOT:+ slot $SLOT}." |
| 94 | +echo "::group::Diagnostics: changed app settings for $APP_NAME${SLOT:+ slot $SLOT}" |
| 95 | +echo 'Diagnostics: changed settings payload:' |
| 96 | +cat "$CHANGED_SETTINGS_FILE" |
| 97 | +echo '::endgroup::' |
| 98 | +az webapp config appsettings set \ |
| 99 | + --name "$APP_NAME" \ |
| 100 | + --resource-group "$RESOURCE_GROUP" \ |
| 101 | + "${SLOT_ARGS[@]}" \ |
| 102 | + --settings @"$CHANGED_SETTINGS_FILE" |
| 103 | + |
| 104 | +rm -f "$CHANGED_SETTINGS_FILE" |
0 commit comments