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