1+ name : CI-Validate Deployment-Multi-Agent-Custom-Automation-Engine-Solution-Accelerator
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ schedule :
8+ - cron : ' 0 6,18 * * *' # Runs at 6:00 AM and 6:00 PM GMT
9+
10+ jobs :
11+ deploy :
12+ runs-on : ubuntu-latest
13+ steps :
14+ - name : Checkout Code
15+ uses : actions/checkout@v3
16+
17+ - name : Setup Azure CLI
18+ run : |
19+ curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
20+ az --version # Verify installation
21+
22+ - name : Login to Azure
23+ run : |
24+ az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
25+
26+ - name : Install Bicep CLI
27+ run : az bicep install
28+
29+ - name : Generate Resource Group Name
30+ id : generate_rg_name
31+ run : |
32+ echo "Generating a unique resource group name..."
33+ TIMESTAMP=$(date +%Y%m%d%H%M%S)
34+ COMMON_PART="ci-biab"
35+ UNIQUE_RG_NAME="${COMMON_PART}${TIMESTAMP}"
36+ echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV
37+ echo "Generated Resource_GROUP_PREFIX: ${UNIQUE_RG_NAME}"
38+
39+
40+ - name : Check and Create Resource Group
41+ id : check_create_rg
42+ run : |
43+ set -e
44+ echo "Checking if resource group exists..."
45+ rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
46+ if [ "$rg_exists" = "false" ]; then
47+ echo "Resource group does not exist. Creating..."
48+ az group create --name ${{ env.RESOURCE_GROUP_NAME }} --location eastus || { echo "Error creating resource group"; exit 1; }
49+ else
50+ echo "Resource group already exists."
51+ fi
52+
53+
54+ - name : Deploy Bicep Template
55+ id : deploy
56+ run : |
57+ set -e
58+ az deployment group create \
59+ --resource-group ${{ env.RESOURCE_GROUP_NAME }} \
60+ --template-file deploy/macae.bicep \
61+ --parameters azureOpenAILocation=eastus cosmosLocation=eastus2
62+
63+
64+ - name : Send Notification on Failure
65+ if : failure()
66+ run : |
67+ RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
68+
69+ # Construct the email body
70+ EMAIL_BODY=$(cat <<EOF
71+ {
72+ " body " : " <p>Dear Team,</p><p>We would like to inform you that the Multi-Agent-Custom-Automation-Engine-Solution-Accelerator Automation process has encountered an issue and has failed to complete successfully.</p><p><strong>Build URL:</strong> ${RUN_URL}<br> ${OUTPUT}</p><p>Please investigate the matter at your earliest convenience.</p><p>Best regards,<br>Your Automation Team</p>"
73+ }
74+ EOF
75+ )
76+
77+ # Send the notification
78+ curl -X POST "${{ secrets.LOGIC_APP_URL }}" \
79+ -H "Content-Type : application/json" \
80+ -d "$EMAIL_BODY" || echo "Failed to send notification"
81+
82+
83+ - name : Get OpenAI, App Service and Container Registry Resource from Resource Group
84+ id : get_openai_resource
85+ run : |
86+
87+
88+ set -e
89+ echo "Fetching OpenAI resource from resource group ${{ env.RESOURCE_GROUP_NAME }}..."
90+
91+ # Run the az resource list command to get the OpenAI resource name
92+ openai_resource_name=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.CognitiveServices/accounts" --query "[0].name" -o tsv)
93+
94+ if [ -z "$openai_resource_name" ]; then
95+ echo "No OpenAI resource found in resource group ${{ env.RESOURCE_GROUP_NAME }}."
96+ exit 1
97+ else
98+ echo "OPENAI_RESOURCE_NAME=${openai_resource_name}" >> $GITHUB_ENV
99+ echo "OpenAI resource name: ${openai_resource_name}"
100+ fi
101+
102+ echo "Fetching Azure App Service resource from resource group ${{ env.RESOURCE_GROUP_NAME }}..."
103+
104+ # Run the az resource list command to get the App Service resource name
105+ app_service_name=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --resource-type "Microsoft.Web/sites" --query "[0].name" -o tsv)
106+
107+ if [ -z "$app_service_name" ]; then
108+ echo "No Azure App Service resource found in resource group ${{ env.RESOURCE_GROUP_NAME }}."
109+ exit 1
110+ else
111+ echo "APP_SERVICE_NAME=${app_service_name}" >> $GITHUB_ENV
112+ echo "Azure App Service resource name: ${app_service_name}"
113+ fi
114+
115+ echo "Fetching container registry resource from resource group ${{ env.RESOURCE_GROUP_NAME }}..."
116+
117+ # Fetch Azure Container Registry name
118+ acr_name=$(az acr list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --query "[0].name" -o tsv)
119+
120+ if [ -z "$acr_name" ]; then
121+ echo "No Azure Container Registry found in resource group ${{ env.RESOURCE_GROUP_NAME }}."
122+ exit 1
123+ else
124+ echo "ACR_NAME=${acr_name}" >> $GITHUB_ENV
125+ echo "Azure Container Registry name: ${acr_name}"
126+ fi
127+
128+
129+ - name : Build the image and update the container app
130+ id : build-and-update
131+ run : |
132+
133+ set -e
134+ # Define variables for acr and container app names
135+ acr_name="${{ env.ACR_NAME }}"
136+ echo "ACR name: {$acr_name}"
137+ backend_container_app_name="macae-backend"
138+ backend_build_image_tag="backend:latest"
139+
140+ echo "Building the container image..."
141+ # Build the image
142+ az acr build -r ${acr_name} -t ${backend_build_image_tag} ./src/backend
143+ echo "Backend image build completed successfully."
144+
145+ frontend_container_app_name="${{ env.APP_SERVICE_NAME }}"
146+ frontend_build_image_tag="frontend:latest"
147+
148+ echo "Building the container image..."
149+ # Build the image
150+ az acr build -r ${acr_name} -t ${frontend_build_image_tag} ./src/frontend
151+ echo "Frontend image build completed successfully."
152+
153+ # Add the new container to the website
154+ az webapp config container set --resource-group ${{ env.RESOURCE_GROUP_NAME }} --name ${frontend_container_app_name} --container-image-name ${acr_name}.azurecr.io/frontend:latest --container-registry-url https://${acr_name}.azurecr.io
155+
156+
157+ - name : Delete Bicep Deployment
158+ if : success()
159+ run : |
160+ set -e
161+ echo "Checking if resource group exists..."
162+ rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
163+ if [ "$rg_exists" = "true" ]; then
164+ echo "Resource group exist. Cleaning..."
165+ az group delete \
166+ --name ${{ env.RESOURCE_GROUP_NAME }} \
167+ --yes \
168+ --no-wait
169+ echo "Resource group deleted... ${{ env.RESOURCE_GROUP_NAME }}"
170+ else
171+ echo "Resource group does not exists."
172+ fi
173+
174+
175+ - name : Wait for resource deletion to complete
176+ run : |
177+
178+
179+ # Add resources to the array
180+ resources_to_check=("${{ env.OPENAI_RESOURCE_NAME }}")
181+
182+ echo "List of resources to check: ${resources_to_check[@]}"
183+
184+ # Maximum number of retries
185+ max_retries=3
186+
187+ # Retry intervals in seconds (30, 60, 120)
188+ retry_intervals=(30 60 120)
189+
190+ # Retry mechanism to check resources
191+ retries=0
192+ while true; do
193+ resource_found=false
194+
195+ # Get the list of resources in YAML format again on each retry
196+ resource_list=$(az resource list --resource-group ${{ env.RESOURCE_GROUP_NAME }} --output yaml)
197+
198+ # Iterate through the resources to check
199+ for resource in "${resources_to_check[@]}"; do
200+ echo "Checking resource: $resource"
201+ if echo "$resource_list" | grep -q "name: $resource"; then
202+ echo "Resource '$resource' exists in the resource group."
203+ resource_found=true
204+ else
205+ echo "Resource '$resource' does not exist in the resource group."
206+ fi
207+ done
208+
209+ # If any resource exists, retry
210+ if [ "$resource_found" = true ]; then
211+ retries=$((retries + 1))
212+ if [ "$retries" -gt "$max_retries" ]; then
213+ echo "Maximum retry attempts reached. Exiting."
214+ break
215+ else
216+ # Wait for the appropriate interval for the current retry
217+ echo "Waiting for ${retry_intervals[$retries-1]} seconds before retrying..."
218+ sleep ${retry_intervals[$retries-1]}
219+ fi
220+ else
221+ echo "No resources found. Exiting."
222+ break
223+ fi
224+ done
225+
226+
227+ - name : Purging the Resources
228+ if : success()
229+ run : |
230+
231+ set -e
232+ echo "Azure OpenAI: ${{ env.OPENAI_RESOURCE_NAME }}"
233+
234+ # Purge OpenAI Resource
235+ echo "Purging the OpenAI Resource..."
236+ if ! az resource delete --ids /subscriptions/${{ secrets.AZURE_SUBSCRIPTION_ID }}/providers/Microsoft.CognitiveServices/locations/eastus/resourceGroups/${{ env.RESOURCE_GROUP_NAME }}/deletedAccounts/${{ env.OPENAI_RESOURCE_NAME }} --verbose; then
237+ echo "Failed to purge openai resource: ${{ env.OPENAI_RESOURCE_NAME }}"
238+ else
239+ echo "Purged the openai resource: ${{ env.OPENAI_RESOURCE_NAME }}"
240+ fi
241+
242+ echo "Resource purging completed successfully"
0 commit comments