Skip to content

Commit 0bf1920

Browse files
Merge pull request #4 from microsoft/main
p
2 parents d6afd6f + d9c17ea commit 0bf1920

File tree

13 files changed

+2737
-1443
lines changed

13 files changed

+2737
-1443
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
on:
2+
push:
3+
branches:
4+
- main
5+
6+
permissions:
7+
contents: write
8+
pull-requests: write
9+
10+
name: create-release
11+
12+
jobs:
13+
create-release:
14+
runs-on: ubuntu-latest
15+
steps:
16+
- name: Checkout
17+
uses: actions/checkout@v4
18+
with:
19+
ref: ${{ github.event.workflow_run.head_sha }}
20+
21+
- uses: codfish/semantic-release-action@v3
22+
id: semantic
23+
with:
24+
tag-format: 'v${version}'
25+
additional-packages: |
26+
['conventional-changelog-conventionalcommits@7']
27+
plugins: |
28+
[
29+
[
30+
"@semantic-release/commit-analyzer",
31+
{
32+
"preset": "conventionalcommits"
33+
}
34+
],
35+
[
36+
"@semantic-release/release-notes-generator",
37+
{
38+
"preset": "conventionalcommits",
39+
"presetConfig": {
40+
"types": [
41+
{ type: 'feat', section: 'Features', hidden: false },
42+
{ type: 'fix', section: 'Bug Fixes', hidden: false },
43+
{ type: 'perf', section: 'Performance Improvements', hidden: false },
44+
{ type: 'revert', section: 'Reverts', hidden: false },
45+
{ type: 'docs', section: 'Other Updates', hidden: false },
46+
{ type: 'style', section: 'Other Updates', hidden: false },
47+
{ type: 'chore', section: 'Other Updates', hidden: false },
48+
{ type: 'refactor', section: 'Other Updates', hidden: false },
49+
{ type: 'test', section: 'Other Updates', hidden: false },
50+
{ type: 'build', section: 'Other Updates', hidden: false },
51+
{ type: 'ci', section: 'Other Updates', hidden: false }
52+
]
53+
}
54+
}
55+
],
56+
'@semantic-release/github'
57+
]
58+
env:
59+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
60+
- run: echo ${{ steps.semantic.outputs.release-version }}
61+
62+
- run: echo "$OUTPUTS"
63+
env:
64+
OUTPUTS: ${{ toJson(steps.semantic.outputs) }}

.github/workflows/deploy.yml

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
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"

.github/workflows/sync-branches.yml

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)