@@ -104,98 +104,65 @@ jobs:
104104 # 3 · Prune stale resources (AKS-aware, error-safe)
105105 # ###############################################################
106106 - name : Prune stale state entries
107- env : { TF_IN_AUTOMATION: true }
108- run : |
109- set -euo pipefail
110- STATE="$TF_DIR/terraform.tfstate"
111- RG="rg-aks-memgraph-${{ env.ENVIRONMENT }}"
112- AKS="aks-memgraph-${{ env.ENVIRONMENT }}"
113-
114- # No state yet → nothing to prune
115- if [ ! -f "$STATE" ]; then
116- echo "🛈 No state file; skipping prune"
117- exit 0
118- fi
119-
120- # Empty state → nothing to prune
121- ADDR_LIST=$(terraform -chdir="$TF_DIR" state list 2>/dev/null || true)
122- if [ -z "$ADDR_LIST" ]; then
123- echo "🛈 Empty state; skipping prune"
124- exit 0
125- fi
126-
127- while IFS= read -r ADDR; do
128- [ -z "$ADDR" ] && continue
129-
130- echo "🔍 Checking resource: $ADDR"
131-
132- # Special handling for resource group - always keep
133- if [[ "$ADDR" == "azurerm_resource_group.this" ]]; then
107+ env : { TF_IN_AUTOMATION: true }
108+ run : |
109+ set -euo pipefail
110+ STATE="$TF_DIR/terraform.tfstate"
111+ RG="rg-aks-memgraph-${{ env.ENVIRONMENT }}"
112+ AKS="aks-memgraph-${{ env.ENVIRONMENT }}"
113+
114+ # Verify that the state file exists
115+ if [ ! -f "$STATE" ]; then
116+ echo "🛈 No state file; skipping prune"
117+ exit 0
118+ fi
119+
120+ # Attempt to list Terraform state
121+ ADDR_LIST=$(terraform -chdir="$TF_DIR" state list 2>/dev/null || true)
122+ if [ $? -ne 0 ]; then
123+ echo "⚠️ Error listing Terraform state. Skipping prune."
124+ exit 0
125+ fi
126+
127+ if [ -z "$ADDR_LIST" ]; then
128+ echo "🛈 Empty state; skipping prune"
129+ exit 0
130+ fi
131+
132+ while IFS= read -r ADDR; do
133+ [ -z "$ADDR" ] && continue
134+
135+ echo "🔍 Checking resource: $ADDR"
136+
137+ # Handle specific resource types
138+ case "$ADDR" in
139+ azurerm_resource_group.this)
134140 echo "✅ Keeping resource group in state"
135- continue
136- fi
137-
138- # Special handling for AKS cluster
139- if [[ "$ADDR" == "azurerm_kubernetes_cluster.this" ]]; then
141+ ;;
142+ azurerm_kubernetes_cluster.this)
140143 if ! az aks show --resource-group "$RG" --name "$AKS" &>/dev/null; then
141- echo "⚠️ Removing stale AKS entry from state"
142- terraform -chdir="$TF_DIR" state rm "$ADDR"
144+ echo "⚠️ Removing stale AKS entry from state"
145+ terraform -chdir="$TF_DIR" state rm "$ADDR" || true
143146 else
144147 echo "✅ AKS cluster exists in Azure"
145148 fi
146- continue
147- fi
149+ ;;
150+ *)
151+ RESOURCE_OUTPUT=$(terraform -chdir="$TF_DIR" state show -no-color "$ADDR" 2>/dev/null || echo "")
152+ ID=$(echo "$RESOURCE_OUTPUT" | grep '^id' | awk -F ' = ' '{print $2}' | sed 's/"//g')
148153
149- # Extract the resource ID more robustly
150- RESOURCE_OUTPUT=$(terraform -chdir="$TF_DIR" state show -no-color "$ADDR" 2>/dev/null || echo "")
151-
152- # Skip if we can't get state output
153- if [ -z "$RESOURCE_OUTPUT" ]; then
154- echo "⚠️ Cannot retrieve state for $ADDR - removing"
155- terraform -chdir="$TF_DIR" state rm "$ADDR" || true
156- continue
157- fi
158-
159- # Extract ID and strip quotes
160- ID=$(echo "$RESOURCE_OUTPUT" | grep '^id' | awk -F ' = ' '{print $2}' | sed 's/"//g')
161-
162- if [ -z "$ID" ]; then
163- echo "⚠️ No resource ID found for $ADDR - removing"
164- terraform -chdir="$TF_DIR" state rm "$ADDR" || true
165- continue
166- fi
167-
168- # Check if resource exists using appropriate Azure CLI command
169- if [[ "$ADDR" == azurerm_kubernetes_cluster* ]] || [[ "$ADDR" == azurerm_resource_group* ]]; then
170- # These types were already handled above
171- continue
172- elif [[ "$ADDR" == azurerm_virtual_network* ]]; then
173- VNET_NAME=$(echo "$RESOURCE_OUTPUT" | grep 'name.*=' | head -1 | awk -F ' = ' '{print $2}' | sed 's/"//g')
174- if ! az network vnet show --resource-group "$RG" --name "$VNET_NAME" &>/dev/null; then
175- echo "⚠️ Azure VNET missing → $ADDR — removing"
154+ if [ -z "$ID" ]; then
155+ echo "⚠️ No resource ID found for $ADDR - removing"
176156 terraform -chdir="$TF_DIR" state rm "$ADDR" || true
177- else
178- echo "✅ Resource exists: $ADDR"
179- fi
180- elif [[ "$ADDR" == azurerm_subnet* ]]; then
181- SUBNET_NAME=$(echo "$RESOURCE_OUTPUT" | grep 'name.*=' | head -1 | awk -F ' = ' '{print $2}' | sed 's/"//g')
182- VNET_NAME=$(echo "$ID" | awk -F'/' '{print $9}')
183- if ! az network vnet subnet show --resource-group "$RG" --vnet-name "$VNET_NAME" --name "$SUBNET_NAME" &>/dev/null; then
184- echo "⚠️ Azure Subnet missing → $ADDR — removing"
157+ elif ! az resource show --ids "$ID" --query id -o tsv &>/dev/null; then
158+ echo "⚠️ Azure object missing → $ADDR — removing"
185159 terraform -chdir="$TF_DIR" state rm "$ADDR" || true
186160 else
187161 echo "✅ Resource exists: $ADDR"
188162 fi
189- else
190- # Generic resource check - try to use resource show but handle failures gracefully
191- if ! az resource show --ids "$ID" --query id -o tsv &>/dev/null; then
192- echo "⚠️ Azure object missing → $ADDR — removing"
193- terraform -chdir="$TF_DIR" state rm "$ADDR" || true
194- else
195- echo "✅ Resource exists: $ADDR"
196- fi
197- fi
198- done <<< "$ADDR_LIST"
163+ ;;
164+ esac
165+ done <<< "$ADDR_LIST"
199166
200167 # ###############################################################
201168 # 4 · Terraform apply
0 commit comments