Skip to content

Commit 6fc3829

Browse files
committed
Add GitHub Actions workflow for deploying Contoso Hotel App to Azure
1 parent a9e2ea4 commit 6fc3829

File tree

1 file changed

+179
-0
lines changed

1 file changed

+179
-0
lines changed
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
name: Deploy Contoso Hotel App
2+
3+
on:
4+
workflow_dispatch:
5+
6+
jobs:
7+
build-and-deploy:
8+
runs-on: ubuntu-latest
9+
10+
env:
11+
AZURE_REGION: "swedencentral"
12+
RESOURCE_GROUP: "rg-techexcelai"
13+
ACR_NAME: "fwtechexcelai"
14+
CONTAINER_ENV: "fwcontosohotel"
15+
FRONTEND_IMAGE: "contosohotel-frontend"
16+
BACKEND_IMAGE: "contosohotel-backend"
17+
PROMPTFLOW_IMAGE: "contosohotel-promptflow"
18+
FRONTEND_PORT: 8000
19+
BACKEND_PORT: 8000
20+
PROMPTFLOW_PORT: 8080
21+
POSTGRES_PORT: 5432
22+
POSTGRES_SERVER_NAME: "contosohotel-postgres"
23+
POSTGRES_DB_NAME: "pycontosohotel"
24+
POSTGRES_ADMIN_USER: "contosoadmin"
25+
POSTGRES_ADMIN_PASSWORD: ${{ secrets.POSTGRES_ADMIN_PASSWORD }}
26+
AZURE_SEARCH_SERVICE_NAME: "contososrch$(date +%s)"
27+
AZURE_SEARCH_INDEX_NAME: "brochures-vector"
28+
STORAGE_ACCOUNT_NAME: "contosostorage$(date +%s)"
29+
STORAGE_CONTAINER_NAME: "brochures"
30+
AZURE_OPENAI_SERVICE_NAME: "fwtechexcelai-openai"
31+
AZURE_OPENAI_DEPLOYMENT_NAME_EMBEDDING: "ada-embedding"
32+
AZURE_OPENAI_DEPLOYMENT_NAME_GPT4: "gpt4"
33+
34+
steps:
35+
- name: Checkout code
36+
uses: actions/checkout@v3
37+
38+
- name: Login to Azure using OIDC
39+
uses: azure/login@v2
40+
with:
41+
client-id: ${{ secrets.AZURE_TECH_EXCEL_AI_CLIENT_ID }}
42+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
43+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
44+
45+
- name: Create Resource Group
46+
run: az group create --name $RESOURCE_GROUP --location $AZURE_REGION
47+
48+
- name: Create Azure Container Registry
49+
run: |
50+
az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic --location $AZURE_REGION
51+
az acr login --name $ACR_NAME
52+
53+
- name: Build and push front-end image
54+
run: |
55+
cd ModernizedContosoHotel/FrontEnd
56+
docker build -t $ACR_NAME.azurecr.io/$FRONTEND_IMAGE:v1.0.0 .
57+
docker push $ACR_NAME.azurecr.io/$FRONTEND_IMAGE:v1.0.0
58+
59+
- name: Build and push back-end image
60+
run: |
61+
cd ModernizedContosoHotel/BackEnd
62+
docker build -t $ACR_NAME.azurecr.io/$BACKEND_IMAGE:v1.0.0 .
63+
docker push $ACR_NAME.azurecr.io/$BACKEND_IMAGE:v1.0.0
64+
65+
- name: Build and push promptflow image
66+
run: |
67+
cd TechExcel-Modernize-applications-to-be-AI-ready/Assets/docker-dist
68+
docker build -t $ACR_NAME.azurecr.io/$PROMPTFLOW_IMAGE:v1.0.0 .
69+
docker push $ACR_NAME.azurecr.io/$PROMPTFLOW_IMAGE:v1.0.0
70+
71+
- name: Create PostgreSQL server
72+
run: |
73+
az postgres flexible-server create \
74+
--resource-group $RESOURCE_GROUP \
75+
--name $POSTGRES_SERVER_NAME \
76+
--admin-user $POSTGRES_ADMIN_USER \
77+
--admin-password $POSTGRES_ADMIN_PASSWORD \
78+
--location $AZURE_REGION \
79+
--sku-name Standard_B1ms \
80+
--storage-size 32 \
81+
--version 13
82+
83+
- name: Configure PostgreSQL firewall rules
84+
run: |
85+
az postgres flexible-server firewall-rule create \
86+
--resource-group $RESOURCE_GROUP \
87+
--name $POSTGRES_SERVER_NAME \
88+
--rule-name AllowAllAzureIPs \
89+
--start-ip-address 0.0.0.0 \
90+
--end-ip-address 255.255.255.255
91+
92+
- name: Create PostgreSQL database
93+
run: |
94+
az postgres flexible-server db create \
95+
--resource-group $RESOURCE_GROUP \
96+
--server-name $POSTGRES_SERVER_NAME \
97+
--database-name $POSTGRES_DB_NAME
98+
99+
- name: Get PostgreSQL connection string
100+
id: get-postgres-connection-string
101+
run: |
102+
POSTGRES_CONNECTION_STRING=$(az postgres flexible-server show-connection-string \
103+
--server-name $POSTGRES_SERVER_NAME \
104+
--database-name $POSTGRES_DB_NAME \
105+
--admin-user $POSTGRES_ADMIN_USER \
106+
--admin-password $POSTGRES_ADMIN_PASSWORD \
107+
--output tsv)
108+
echo "POSTGRES_CONNECTION_STRING=$POSTGRES_CONNECTION_STRING" >> $GITHUB_ENV
109+
110+
- name: Create Azure Storage Account
111+
run: |
112+
az storage account create --name $STORAGE_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --location $AZURE_REGION --sku Standard_LRS
113+
az storage container create --name $STORAGE_CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME
114+
115+
- name: Upload PDF files to Azure Storage
116+
run: |
117+
az storage blob upload-batch --account-name $STORAGE_ACCOUNT_NAME --destination $STORAGE_CONTAINER_NAME --source "TechExcel-Modernize-applications-to-be-AI-ready/Assets/PDFs" --pattern "*.pdf"
118+
119+
- name: Create Azure OpenAI Service
120+
run: |
121+
az cognitiveservices account create --name $AZURE_OPENAI_SERVICE_NAME \
122+
--resource-group $RESOURCE_GROUP --kind OpenAI --sku S0 --location $AZURE_REGION
123+
AZURE_OPENAI_ENDPOINT=$(az cognitiveservices account show --name $AZURE_OPENAI_SERVICE_NAME --resource-group $RESOURCE_GROUP --query endpoint --output tsv)
124+
echo "AZURE_OPENAI_ENDPOINT=$AZURE_OPENAI_ENDPOINT" >> $GITHUB_ENV
125+
126+
- name: Deploy ADA Embedding Model
127+
run: |
128+
az openai deployment create --resource-group $RESOURCE_GROUP \
129+
--service-name $AZURE_OPENAI_SERVICE_NAME --name $AZURE_OPENAI_DEPLOYMENT_NAME_EMBEDDING \
130+
--model ada --model-version text-embedding-ada-002
131+
132+
- name: Deploy GPT-4 Model
133+
run: |
134+
az openai deployment create --resource-group $RESOURCE_GROUP \
135+
--service-name $AZURE_OPENAI_SERVICE_NAME --name $AZURE_OPENAI_DEPLOYMENT_NAME_GPT4 \
136+
--model gpt-4 --model-version gpt-4
137+
138+
- name: Create Azure AI Search Service
139+
run: |
140+
az search service create --name $AZURE_SEARCH_SERVICE_NAME --resource-group $RESOURCE_GROUP --sku Basic --location $AZURE_REGION --identity-type SystemAssigned
141+
142+
- name: Create Azure AI Search Index
143+
run: |
144+
az search index create --service-name $AZURE_SEARCH_SERVICE_NAME --name $AZURE_SEARCH_INDEX_NAME --fields "[
145+
{ 'name': 'content', 'type': 'Edm.String', 'searchable': true },
146+
{ 'name': 'metadata_storage_path', 'type': 'Edm.String', 'key': true, 'filterable': true, 'sortable': true }
147+
]"
148+
149+
- name: Create Azure AI Search Indexer
150+
run: |
151+
az search indexer create --service-name $AZURE_SEARCH_SERVICE_NAME --name "pdf-indexer" --data-source "{
152+
'name': 'pdfs',
153+
'type': 'azureblob',
154+
'credentials': { 'connectionString': 'DefaultEndpointsProtocol=https;AccountName=$STORAGE_ACCOUNT_NAME;AccountKey=$(az storage account keys list --resource-group $RESOURCE_GROUP --account-name $STORAGE_ACCOUNT_NAME --query [0].value --output tsv);EndpointSuffix=core.windows.net' },
155+
'container': { 'name': '$STORAGE_CONTAINER_NAME' }
156+
}" --target-index $AZURE_SEARCH_INDEX_NAME
157+
158+
- name: Deploy front-end container
159+
run: |
160+
az containerapp create --name frontend --resource-group $RESOURCE_GROUP --environment $CONTAINER_ENV --image $ACR_NAME.azurecr.io/$FRONTEND_IMAGE:v1.0.0 --target-port $FRONTEND_PORT --ingress external --env-vars API_BASEURL=$BACKEND_URL
161+
162+
- name: Deploy back-end container
163+
run: |
164+
az containerapp create --name backend --resource-group $RESOURCE_GROUP --environment $CONTAINER_ENV --image $ACR_NAME.azurecr.io/$BACKEND_IMAGE:v1.0.0 --target-port $BACKEND_PORT --ingress external --env-vars POSTGRES_CONNECTION_STRING=$POSTGRES_CONNECTION_STRING
165+
166+
- name: Deploy promptflow container
167+
run: |
168+
az containerapp create --name promptflow --resource-group $RESOURCE_GROUP \
169+
--environment $CONTAINER_ENV --image $ACR_NAME.azurecr.io/$PROMPTFLOW_IMAGE:v1.0.0 \
170+
--target-port $PROMPTFLOW_PORT --ingress external \
171+
--env-vars AZURE_OPENAI_ENDPOINT=$AZURE_OPENAI_ENDPOINT \
172+
AZURE_OPENAI_API_KEY=$AZURE_OPENAI_API_KEY \
173+
AZURE_AI_SEARCH_ENDPOINT=$AZURE_AI_SEARCH_ENDPOINT \
174+
AZURE_AI_SEARCH_API_KEY=$AZURE_AI_SEARCH_API_KEY \
175+
PGHOST=$POSTGRES_SERVER_NAME \
176+
PGPORT=$POSTGRES_PORT \
177+
PGUSER=$POSTGRES_ADMIN_USER \
178+
PGDATABASE=$POSTGRES_DB_NAME \
179+
PGPASSWORD=$POSTGRES_ADMIN_PASSWORD

0 commit comments

Comments
 (0)