-
Notifications
You must be signed in to change notification settings - Fork 0
198 lines (174 loc) · 8.27 KB
/
Copy pathazure-api-deploy.yml
File metadata and controls
198 lines (174 loc) · 8.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
name: Azure API Deploy
on:
push:
branches:
- main
workflow_dispatch:
inputs:
deploy_mode:
description: "Use app for code-only deployment; use infra after AppHost infrastructure changes."
required: true
default: app
type: choice
options:
- app
- infra
concurrency:
group: azure-api-deploy-${{ github.ref }}
cancel-in-progress: false
jobs:
deploy:
name: Validate and Deploy API
runs-on: ubuntu-latest
environment: production
permissions:
contents: read
id-token: write
env:
AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
AZURE_RESOURCE_GROUP: ${{ vars.AZURE_RESOURCE_GROUP }}
AZURE_WEBAPP_NAME: ${{ vars.AZURE_WEBAPP_NAME }}
AZURE_APP_SERVICE_DASHBOARD_URI: ${{ vars.AZURE_APP_SERVICE_DASHBOARD_URI }}
AZURE_CONTAINER_REGISTRY_ENDPOINT: ${{ vars.AZURE_CONTAINER_REGISTRY_ENDPOINT }}
API_IDENTITY_CLIENTID: ${{ vars.API_IDENTITY_CLIENTID }}
API_IDENTITY_ID: ${{ vars.API_IDENTITY_ID }}
CATALOG_SQL_SQLSERVERFQDN: ${{ vars.CATALOG_SQL_SQLSERVERFQDN }}
ELSA_PACKAGE_CATALOG_AZURE_APP_SERVICE_DASHBOARD_URI: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_APP_SERVICE_DASHBOARD_URI }}
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_ENDPOINT: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_ENDPOINT }}
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID }}
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID }}
ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_ID: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_ID }}
ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_PRINCIPAL_ID: ${{ vars.ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_PRINCIPAL_ID }}
ELSA_PACKAGE_CATALOG_PLANID: ${{ vars.ELSA_PACKAGE_CATALOG_PLANID }}
ADMIN_API_KEY: ${{ secrets.ADMIN_API_KEY }}
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: "10.0.x"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "22"
cache: npm
cache-dependency-path: src/Elsa.Catalog.AdminUi/package-lock.json
- name: Install azd
uses: Azure/setup-azd@v2
- name: Validate deployment configuration
shell: bash
run: |
set -euo pipefail
required=(
AZURE_CLIENT_ID
AZURE_TENANT_ID
AZURE_SUBSCRIPTION_ID
AZURE_ENV_NAME
AZURE_LOCATION
AZURE_RESOURCE_GROUP
AZURE_WEBAPP_NAME
AZURE_APP_SERVICE_DASHBOARD_URI
AZURE_CONTAINER_REGISTRY_ENDPOINT
API_IDENTITY_CLIENTID
API_IDENTITY_ID
CATALOG_SQL_SQLSERVERFQDN
ELSA_PACKAGE_CATALOG_AZURE_APP_SERVICE_DASHBOARD_URI
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_ENDPOINT
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID
ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID
ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_ID
ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_PRINCIPAL_ID
ELSA_PACKAGE_CATALOG_PLANID
ADMIN_API_KEY
)
for name in "${required[@]}"; do
if [ -z "${!name:-}" ]; then
echo "$name is not configured."
exit 1
fi
done
- name: Restore
run: dotnet restore Elsa.PackageCatalog.sln
- name: Build AppHost
run: dotnet build src/Elsa.Catalog.AppHost/Elsa.Catalog.AppHost.csproj --configuration Release --no-restore
- name: Test API
run: dotnet test tests/Elsa.Catalog.Api.Tests/Elsa.Catalog.Api.Tests.csproj --configuration Release --no-restore --verbosity normal
- name: Build and test admin dashboard
working-directory: src/Elsa.Catalog.AdminUi
run: |
npm ci
npm test
npm run build
- name: Log in with Azure federated credentials
shell: bash
run: |
azd auth login \
--client-id "$AZURE_CLIENT_ID" \
--tenant-id "$AZURE_TENANT_ID" \
--federated-credential-provider github
- name: Log in Azure CLI
uses: azure/login@v2
with:
client-id: ${{ env.AZURE_CLIENT_ID }}
tenant-id: ${{ env.AZURE_TENANT_ID }}
subscription-id: ${{ env.AZURE_SUBSCRIPTION_ID }}
- name: Configure azd environment
shell: bash
run: |
set -euo pipefail
azd env new "$AZURE_ENV_NAME" \
--location "$AZURE_LOCATION" \
--subscription "$AZURE_SUBSCRIPTION_ID" \
--no-prompt
azd env config set infra.parameters.adminApiKey "$ADMIN_API_KEY"
azd env set AZURE_APP_SERVICE_DASHBOARD_URI "$AZURE_APP_SERVICE_DASHBOARD_URI"
azd env set AZURE_CONTAINER_REGISTRY_ENDPOINT "$AZURE_CONTAINER_REGISTRY_ENDPOINT"
azd env set API_IDENTITY_CLIENTID "$API_IDENTITY_CLIENTID"
azd env set API_IDENTITY_ID "$API_IDENTITY_ID"
azd env set CATALOG_SQL_SQLSERVERFQDN "$CATALOG_SQL_SQLSERVERFQDN"
azd env set ELSA_PACKAGE_CATALOG_AZURE_APP_SERVICE_DASHBOARD_URI "$ELSA_PACKAGE_CATALOG_AZURE_APP_SERVICE_DASHBOARD_URI"
azd env set ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_ENDPOINT "$ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_ENDPOINT"
azd env set ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID "$ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID"
azd env set ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID "$ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_ID"
azd env set ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_ID "$ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_ID"
azd env set ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_PRINCIPAL_ID "$ELSA_PACKAGE_CATALOG_AZURE_WEBSITE_CONTRIBUTOR_MANAGED_IDENTITY_PRINCIPAL_ID"
azd env set ELSA_PACKAGE_CATALOG_PLANID "$ELSA_PACKAGE_CATALOG_PLANID"
azd env set APPLICATION_BUILD_NUMBER "$GITHUB_RUN_NUMBER"
- name: Deploy API app
shell: bash
run: |
set -euo pipefail
if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ "${{ inputs.deploy_mode }}" = "infra" ]; then
azd up --no-prompt
else
image="$AZURE_CONTAINER_REGISTRY_ENDPOINT/elsa-package-catalog/api-elsa-package-catalog:${GITHUB_SHA}"
acr_name="${AZURE_CONTAINER_REGISTRY_ENDPOINT%%.azurecr.io}"
az acr login --name "$acr_name"
docker build --file src/Elsa.Catalog.Api/Dockerfile --tag "$image" .
docker push "$image"
az webapp config appsettings set \
--resource-group "$AZURE_RESOURCE_GROUP" \
--name "$AZURE_WEBAPP_NAME" \
--settings AZURE_TOKEN_CREDENTIALS=prod Application__BuildNumber="$GITHUB_RUN_NUMBER" \
--output none
az webapp sitecontainers update \
--resource-group "$AZURE_RESOURCE_GROUP" \
--name "$AZURE_WEBAPP_NAME" \
--container-name main \
--image "$image" \
--target-port 8080 \
--is-main true \
--user-assigned-identity "$ELSA_PACKAGE_CATALOG_AZURE_CONTAINER_REGISTRY_MANAGED_IDENTITY_CLIENT_ID" \
--output none
az webapp restart \
--resource-group "$AZURE_RESOURCE_GROUP" \
--name "$AZURE_WEBAPP_NAME" \
--output none
fi