1111 workflow_dispatch :
1212
1313permissions :
14+ id-token : write
1415 contents : read
1516 packages : write
1617
@@ -49,11 +50,11 @@ jobs:
4950 needs : check-changes
5051 if : needs.check-changes.outputs.should_deploy == 'true' || github.event_name == 'workflow_dispatch' || github.event_name == 'schedule'
5152 runs-on : ubuntu-latest
53+ environment : production
5254 env :
5355 AZURE_CLIENT_ID : ${{ secrets.AZURE_CLIENT_ID }}
5456 AZURE_TENANT_ID : ${{ secrets.AZURE_TENANT_ID }}
5557 AZURE_SUBSCRIPTION_ID : ${{ secrets.AZURE_SUBSCRIPTION_ID }}
56- AZURE_CLIENT_SECRET : ${{ secrets.AZURE_CLIENT_SECRET }}
5758 PRINCIPAL_ID : ${{ secrets.PRINCIPAL_ID }}
5859 PRINCIPAL_NAME : ${{ secrets.PRINCIPAL_NAME }}
5960 PRINCIPAL_TYPE : ' ServicePrincipal'
@@ -73,12 +74,16 @@ jobs:
7374 - name : Install azd
7475 uses : Azure/setup-azd@v2
7576
77+ - name : Login to Azure
78+ uses : azure/login@v2
79+ with :
80+ client-id : ${{ secrets.AZURE_CLIENT_ID }}
81+ tenant-id : ${{ secrets.AZURE_TENANT_ID }}
82+ subscription-id : ${{ secrets.AZURE_SUBSCRIPTION_ID }}
83+
7684 - name : Run Quota Check
7785 id : quota-check
7886 run : |
79- export AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }}
80- export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}
81- export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}
8287 export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}"
8388 export GPT_MIN_CAPACITY="150"
8489 export TEXT_EMBEDDING_MIN_CAPACITY="30"
@@ -191,8 +196,9 @@ jobs:
191196 runCmd : |
192197 export optional_args="./code/tests"
193198
194- # Azure login first
195- az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID
199+ # Azure login via OIDC federated token
200+ OIDC_TOKEN=$(curl -s -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=api://AzureADTokenExchange" | jq -r '.value')
201+ az login --service-principal -u "$AZURE_CLIENT_ID" --tenant "$AZURE_TENANT_ID" --federated-token "$OIDC_TOKEN"
196202 az account set --subscription $AZURE_SUBSCRIPTION_ID
197203
198204 # Capture deployment output to a log file
@@ -214,9 +220,10 @@ jobs:
214220 echo "Frontend URL from logs: $(cat log_web_url.txt)"
215221 env : |
216222 AZURE_CLIENT_ID
217- AZURE_CLIENT_SECRET
218223 AZURE_TENANT_ID
219224 AZURE_SUBSCRIPTION_ID
225+ ACTIONS_ID_TOKEN_REQUEST_URL
226+ ACTIONS_ID_TOKEN_REQUEST_TOKEN
220227 AZURE_ENV_NAME
221228 AZURE_LOCATION
222229 AZURE_RESOURCE_GROUP
@@ -308,10 +315,6 @@ jobs:
308315 env :
309316 FRONTEND_WEBSITE_URL : ${{ env.FRONTEND_WEBSITE_URL }}
310317 ADMIN_WEBSITE_URL : ${{ env.ADMIN_WEBSITE_URL }}
311- AZURE_CLIENT_ID : ${{ secrets.AZURE_CLIENT_ID }}
312- AZURE_CLIENT_SECRET : ${{ secrets.AZURE_CLIENT_SECRET }}
313- AZURE_TENANT_ID : ${{ secrets.AZURE_TENANT_ID }}
314- AZURE_SUBSCRIPTION_ID : ${{ secrets.AZURE_SUBSCRIPTION_ID }}
315318
316319 - name : Export PostgreSQL Host Endpoint from Makefile
317320 run : |
@@ -348,19 +351,23 @@ jobs:
348351 python - <<EOF
349352 import os
350353 import psycopg2
351- from azure.identity import ClientSecretCredential
354+ from azure.identity import DefaultAzureCredential
352355
353- tenant_id = os.environ["AZURE_TENANT_ID"]
354- client_id = os.environ["AZURE_CLIENT_ID"]
355- client_secret = os.environ["AZURE_CLIENT_SECRET"]
356356 pg_host = os.environ.get("PG_HOST_DESTINATION", "localhost")
357357
358- # Acquire Azure AD access token for PostgreSQL
359- credential = ClientSecretCredential(tenant_id, client_id, client_secret )
358+ # Acquire Azure AD access token for PostgreSQL via OIDC (Azure CLI credential)
359+ credential = DefaultAzureCredential( )
360360 token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default").token
361361
362+ # Get the service principal display name for PostgreSQL user
363+ import subprocess
364+ sp_display_name = subprocess.run(
365+ ["az", "ad", "sp", "show", "--id", os.environ["AZURE_CLIENT_ID"], "--query", "displayName", "-o", "tsv"],
366+ capture_output=True, text=True
367+ ).stdout.strip()
368+
362369 db_params = {
363- "user": client_id , # Use service principal clientId
370+ "user": sp_display_name , # Use service principal display name
364371 "password": token, # Use AAD token instead of password
365372 "host": pg_host,
366373 "port": "5432",
@@ -382,10 +389,6 @@ jobs:
382389 except Exception as e:
383390 print(f"❌ Error during import: {e}")
384391 EOF
385- env :
386- AZURE_CLIENT_ID : ${{ secrets.AZURE_CLIENT_ID }}
387- AZURE_CLIENT_SECRET : ${{ secrets.AZURE_CLIENT_SECRET }}
388- AZURE_TENANT_ID : ${{ secrets.AZURE_TENANT_ID }}
389392
390393 - name : Final Status Check
391394 id : final-status
@@ -421,12 +424,12 @@ jobs:
421424 if : always() && needs.deploy.result != 'skipped'
422425 needs : [check-changes, deploy, e2e-test]
423426 runs-on : ubuntu-latest
427+ environment : production
424428
425429 env :
426430 AZURE_CLIENT_ID : ${{ secrets.AZURE_CLIENT_ID }}
427431 AZURE_TENANT_ID : ${{ secrets.AZURE_TENANT_ID }}
428432 AZURE_SUBSCRIPTION_ID : ${{ secrets.AZURE_SUBSCRIPTION_ID }}
429- AZURE_CLIENT_SECRET : ${{ secrets.AZURE_CLIENT_SECRET }}
430433 AZURE_ENV_NAME : ${{ needs.deploy.outputs.solution_suffix }} # Get from deploy job
431434 AZURE_LOCATION : ${{ vars.AZURE_LOCATION }}
432435 imageTag : ${{ needs.deploy.outputs.imageTag }}
@@ -442,12 +445,17 @@ jobs:
442445 push : never
443446 imageName : ghcr.io/azure-samples/chat-with-your-data-solution-accelerator
444447 imageTag : ${{ env.imageTag }}
445- runCmd : make destroy
448+ runCmd : |
449+ OIDC_TOKEN=$(curl -s -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=api://AzureADTokenExchange" | jq -r '.value')
450+ az login --service-principal -u "$AZURE_CLIENT_ID" --tenant "$AZURE_TENANT_ID" --federated-token "$OIDC_TOKEN"
451+ az account set --subscription $AZURE_SUBSCRIPTION_ID
452+ make destroy
446453 env : |
447454 AZURE_CLIENT_ID
448- AZURE_CLIENT_SECRET
449455 AZURE_TENANT_ID
450456 AZURE_SUBSCRIPTION_ID
457+ ACTIONS_ID_TOKEN_REQUEST_URL
458+ ACTIONS_ID_TOKEN_REQUEST_TOKEN
451459 AZURE_ENV_NAME
452460 AZURE_LOCATION
453461 AZURE_RESOURCE_GROUP
0 commit comments