2121 outputs :
2222 RESOURCE_GROUP_NAME : ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }}
2323 WEBAPP_URL : ${{ steps.get_output.outputs.WEBAPP_URL }}
24+ SELECTED_AI_REGION : ${{ steps.deploy.outputs.selected_ai_region || env.VALID_REGION }}
2425 steps :
2526 - name : Checkout Code
2627 uses : actions/checkout@v3
@@ -126,9 +127,9 @@ jobs:
126127 IMAGE_TAG="latest"
127128 fi
128129
129- # Prefer quota-selected region if available
130130 EFFECTIVE_AI_REGION="${VALID_REGION:-eastus}"
131131 echo "Using AI Deployments Region: $EFFECTIVE_AI_REGION"
132+ echo "selected_ai_region=$EFFECTIVE_AI_REGION" >> $GITHUB_OUTPUT
132133
133134 az deployment group create \
134135 --name ${{ env.SOLUTION_PREFIX }}-deployment \
@@ -181,6 +182,7 @@ jobs:
181182 runs-on : ubuntu-latest
182183 env :
183184 RESOURCE_GROUP_NAME : ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
185+ AI_REGION : ${{ needs.deploy.outputs.SELECTED_AI_REGION }}
184186 steps :
185187 - name : Setup Azure CLI
186188 run : |
@@ -195,31 +197,22 @@ jobs:
195197 if : always()
196198 id : get_azure_resources
197199 run : |
198-
199200 set -e
200201 echo "Fetching Log Analytics workspace from resource group ${{ env.RESOURCE_GROUP_NAME }}..."
201-
202- # Run the az monitor log-analytics workspace list command to get the workspace name
203- log_analytics_workspace_name=$(az monitor.log-analytics.workspace list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --query "[0].name" -o tsv)
204-
205- if [ -z "$log_analytics_workspace_name" ]; then
206- echo "No Log Analytics workspace found in resource group ${{ env.RESOURCE_GROUP_NAME }}."
207- else
202+ log_analytics_workspace_name=$(az monitor log-analytics workspace list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --query "[0].name" -o tsv || true)
203+ if [ -n "$log_analytics_workspace_name" ]; then
208204 echo "LOG_ANALYTICS_WORKSPACE_NAME=${log_analytics_workspace_name}" >> $GITHUB_ENV
209- echo "Log Analytics workspace name : ${log_analytics_workspace_name}"
205+ echo "Log Analytics workspace name: ${log_analytics_workspace_name}"
206+ else
207+ echo "No Log Analytics workspace found."
210208 fi
211-
212209 echo "Fetching OpenAI resource from resource group ${{ env.RESOURCE_GROUP_NAME }}..."
213-
214- # Run the az resource list command to get the OpenAI resource name
215- openai_resource_name=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.CognitiveServices/accounts" --query "[0].name" -o tsv)
216-
217- if [ -z "$openai_resource_name" ]; then
218- echo "No OpenAI resource found in resource group ${{ env.RESOURCE_GROUP_NAME }}."
219- exit 1
220- else
210+ openai_resource_name=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.CognitiveServices/accounts" --query "[0].name" -o tsv || true)
211+ if [ -n "$openai_resource_name" ]; then
221212 echo "OPENAI_RESOURCE_NAME=${openai_resource_name}" >> $GITHUB_ENV
222- echo "OpenAI resource name : ${openai_resource_name}"
213+ echo "OpenAI resource name: ${openai_resource_name}"
214+ else
215+ echo "No OpenAI resource found."
223216 fi
224217
225218 - name : List KeyVaults and Store in Array
@@ -256,22 +249,10 @@ jobs:
256249 echo "KEYVAULTS=$keyvault_array" >> $GITHUB_ENV
257250 fi
258251
259- - name : Delete Bicep Deployment
252+ - name : Delete Bicep Deployment (defer RG deletion to end)
260253 if : always()
261254 run : |
262- set -e
263- echo "Checking if resource group exists..."
264- rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
265- if [ "$rg_exists" = "true" ]; then
266- echo "Resource group exist. Cleaning..."
267- az group delete \
268- --name ${{ env.RESOURCE_GROUP_NAME }} \
269- --yes \
270- --no-wait
271- echo "Resource group deleted... ${{ env.RESOURCE_GROUP_NAME }}"
272- else
273- echo "Resource group does not exists."
274- fi
255+ echo "Skipping early RG deletion to allow purges to run first."
275256
276257 - name : Purge log analytics workspace
277258 if : always()
@@ -353,48 +334,28 @@ jobs:
353334 - name : Purging the Resources
354335 if : always()
355336 run : |
356-
357337 set -e
358-
359338 echo "Azure OpenAI: ${{ env.OPENAI_RESOURCE_NAME }}"
360-
361- # Purge OpenAI Resource
362- echo "Purging the OpenAI Resource..."
363- if ! az resource delete --ids /subscriptions/${{ secrets.AZURE_SUBSCRIPTION_ID }}/providers/Microsoft.CognitiveServices/locations/${{ env.VALID_REGION || 'eastus' }}/resourceGroups/${{ env.RESOURCE_GROUP_NAME }}/deletedAccounts/${{ env.OPENAI_RESOURCE_NAME }} --verbose; then
364- echo "Failed to purge openai resource: ${{ env.OPENAI_RESOURCE_NAME }}"
365- else
366- echo "Purged the openai resource: ${{ env.OPENAI_RESOURCE_NAME }}"
339+ if [ -n "${{ env.OPENAI_RESOURCE_NAME }}" ]; then
340+ echo "Purging the OpenAI Resource (soft-delete) in region ${{ env.AI_REGION }}..."
341+ az resource delete --ids /subscriptions/${{ secrets.AZURE_SUBSCRIPTION_ID }}/providers/Microsoft.CognitiveServices/locations/${{ env.AI_REGION || 'eastus' }}/resourceGroups/${{ env.RESOURCE_GROUP_NAME }}/deletedAccounts/${{ env.OPENAI_RESOURCE_NAME }} --verbose || echo "OpenAI purge skipped or failed."
367342 fi
368-
369- # List of keyvaults
370343 KEYVAULTS="${{ env.KEYVAULTS }}"
371-
372- # Remove the surrounding square brackets, if they exist
373344 stripped_keyvaults=$(echo "$KEYVAULTS" | sed 's/\[\|\]//g')
374-
375- # Convert the comma-separated string into an array
376345 IFS=',' read -r -a keyvault_array <<< "$stripped_keyvaults"
377-
378- echo "Using KeyVaults Array..."
379346 for keyvault_name in "${keyvault_array[@]}"; do
380- echo "Processing KeyVault: $keyvault_name"
381- # Check if the KeyVault is soft-deleted
382- deleted_vaults=$(az keyvault list-deleted --query "[?name=='$keyvault_name']" -o json --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }})
383-
384- # If the KeyVault is found in the soft-deleted state, purge it
347+ kv_trim=$(echo "$keyvault_name" | sed 's/\"//g' | xargs)
348+ [ -z "$kv_trim" ] && continue
349+ echo "Processing KeyVault: $kv_trim"
350+ deleted_vaults=$(az keyvault list-deleted --query "[?name=='$kv_trim']" -o json --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }} || echo '[]')
385351 if [ "$(echo "$deleted_vaults" | jq length)" -gt 0 ]; then
386- echo "KeyVault '$keyvault_name' is soft-deleted. Proceeding to purge..."
387- # Purge the KeyVault
388- if az keyvault purge --name "$keyvault_name" --no-wait; then
389- echo "Successfully purged KeyVault '$keyvault_name'."
390- else
391- echo "Failed to purge KeyVault '$keyvault_name'."
392- fi
352+ echo "KeyVault '$kv_trim' soft-deleted. Purging..."
353+ az keyvault purge --name "$kv_trim" --no-wait || echo "Failed to purge KeyVault '$kv_trim'"
393354 else
394- echo "KeyVault '$keyvault_name' is not soft-deleted. No action taken ."
355+ echo "KeyVault '$kv_trim' not soft-deleted. Skipping ."
395356 fi
396357 done
397- echo "Resource purging completed successfully "
358+ echo "Resource purging completed"
398359
399360 - name : Send Notification on Failure
400361 if : failure() || needs.deploy.result == 'failure'
@@ -412,6 +373,18 @@ jobs:
412373 -H "Content-Type: application/json" \
413374 -d "$EMAIL_BODY" || echo "Failed to send notification"
414375
376+ - name : Final Resource Group Deletion
377+ if : always()
378+ run : |
379+ set -e
380+ rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
381+ if [ "$rg_exists" = true ]; then
382+ echo "Deleting resource group ${{ env.RESOURCE_GROUP_NAME }}..."
383+ az group delete --name ${{ env.RESOURCE_GROUP_NAME }} --yes --no-wait || echo "RG delete command issued."
384+ else
385+ echo "Resource group already gone."
386+ fi
387+
415388 - name : Logout from Azure
416389 if : always()
417390 run : |
0 commit comments