Skip to content

Commit 2bf4441

Browse files
Migrated GitHub Actions authentication from client secrets to OIDC
1 parent 8968421 commit 2bf4441

File tree

10 files changed

+79
-65
lines changed

10 files changed

+79
-65
lines changed

.github/workflows/CI.yml

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ on:
1616
schedule:
1717
- cron: "0 10,22 * * *" # Runs at 10:00 AM and 10:00 PM GMT
1818
permissions:
19+
id-token: write
1920
contents: read
2021
actions: read
2122
env:
@@ -25,6 +26,7 @@ env:
2526
jobs:
2627
deploy:
2728
runs-on: ubuntu-latest
29+
environment: production
2830
outputs:
2931
RESOURCE_GROUP_NAME: ${{ steps.get_webapp_url.outputs.RESOURCE_GROUP_NAME }}
3032
KUBERNETES_RESOURCE_GROUP_NAME: ${{ steps.get_webapp_url.outputs.KUBERNETES_RESOURCE_GROUP_NAME }}
@@ -78,6 +80,14 @@ jobs:
7880
with:
7981
driver: docker
8082

83+
- name: Login to Azure
84+
uses: azure/login@v2
85+
with:
86+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
87+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
88+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
89+
enable-AzPSSession: true
90+
8191
- name: Run Quota Check
8292
id: quota-check
8393
shell: pwsh
@@ -105,9 +115,6 @@ jobs:
105115
}
106116
env:
107117
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
108-
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
109-
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
110-
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
111118
GPT_MIN_CAPACITY: ${{ env.GPT_CAPACITY }}
112119
TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_CAPACITY }}
113120
AZURE_REGIONS: "${{ vars.AZURE_REGIONS }}"
@@ -158,11 +165,6 @@ jobs:
158165
echo "RESOURCE_GROUP_NAME=${UNIQUE_RG_NAME}" >> $GITHUB_ENV
159166
echo "Generated RESOURCE_GROUP_NAME: ${UNIQUE_RG_NAME}"
160167
161-
- name: Login to Azure
162-
run: |
163-
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
164-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
165-
166168
- name: Check and Create Resource Group
167169
id: check_create_rg
168170
run: |
@@ -252,11 +254,8 @@ jobs:
252254
Write-Host "Resource Group Name is ${{ env.RESOURCE_GROUP_NAME }}"
253255
Write-Host "Kubernetes resource group is ${{ env.AZURE_AKS_NAME }}"
254256
env:
255-
# From GitHub secrets (for login)
257+
# From GitHub secrets
256258
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
257-
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
258-
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
259-
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
260259

261260
# From deployment outputs step (these come from $GITHUB_ENV)
262261
RESOURCE_GROUP_NAME: ${{ env.RESOURCE_GROUP_NAME }}
@@ -292,10 +291,9 @@ jobs:
292291
if az account show &> /dev/null; then
293292
echo "Azure CLI is authenticated."
294293
else
295-
echo "Azure CLI is not authenticated. Logging in..."
296-
az login --service-principal --username ${{ secrets.AZURE_CLIENT_ID }} --password ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
294+
echo "Azure CLI is not authenticated. Please check the OIDC login step."
295+
exit 1
297296
fi
298-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
299297
300298
# Get the Web App URL and save it to GITHUB_OUTPUT
301299
echo "Retrieving Web App URL..."
@@ -393,6 +391,7 @@ jobs:
393391
if: always()
394392
needs: [deploy, e2e-test]
395393
runs-on: ubuntu-latest
394+
environment: production
396395
env:
397396
RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
398397
KUBERNETES_RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.KUBERNETES_RESOURCE_GROUP_NAME }}
@@ -402,10 +401,11 @@ jobs:
402401

403402
steps:
404403
- name: Login to Azure
405-
shell: bash
406-
run: |
407-
az login --service-principal --username ${{ secrets.AZURE_CLIENT_ID }} --password ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
408-
az account set --subscription "${{ secrets.AZURE_SUBSCRIPTION_ID }}"
404+
uses: azure/login@v2
405+
with:
406+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
407+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
408+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
409409

410410
- name: Delete Resource Groups
411411
if: env.RESOURCE_GROUP_NAME != ''

.github/workflows/deploy-orchestrator.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ jobs:
7777
secrets: inherit
7878

7979
send-notification:
80-
if: "!cancelled()"
80+
# if: "!cancelled()"
81+
if: false # Temporarily disable notification job
8182
needs: [deploy, e2e-test]
8283
uses: ./.github/workflows/job-send-notification.yml
8384
with:
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ on:
6868
default: ''
6969
type: string
7070

71+
permissions:
72+
id-token: write
73+
contents: read
74+
actions: read
75+
7176
jobs:
7277
validate-inputs:
7378
name: Validate Input Parameters

.github/workflows/job-cleanup-deployment.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ on:
4040
jobs:
4141
cleanup-deployment:
4242
runs-on: ubuntu-latest
43+
environment: production
4344
continue-on-error: true
4445
env:
4546
RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}
@@ -150,10 +151,11 @@ jobs:
150151
az --version
151152
152153
- name: Login to Azure
153-
shell: bash
154-
run: |
155-
az login --service-principal --username ${{ secrets.AZURE_CLIENT_ID }} --password ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
156-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
154+
uses: azure/login@v2
155+
with:
156+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
157+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
158+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
157159

158160
- name: Delete Resource Group (Optimized Cleanup)
159161
id: delete_rg

.github/workflows/job-deploy-linux.yml

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ on:
3636
jobs:
3737
deploy-linux:
3838
runs-on: ubuntu-latest
39+
environment: production
3940
env:
4041
AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}
4142
outputs:
@@ -221,10 +222,15 @@ jobs:
221222
uses: Azure/setup-azd@v2
222223

223224
- name: Login to Azure
225+
uses: azure/login@v2
226+
with:
227+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
228+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
229+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
230+
231+
- name: Login to azd
224232
run: |
225-
az login --service-principal --username ${{ secrets.AZURE_CLIENT_ID }} --password ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
226-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
227-
azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }}
233+
azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --federated-credential-provider "github" --tenant-id ${{ secrets.AZURE_TENANT_ID }}
228234
229235
230236
- name: Deploy using azd up
@@ -299,15 +305,20 @@ jobs:
299305
echo "AKS node resource group: $krg_name"
300306
fi
301307
fi
308+
309+
- name: Login to Azure to refresh credentials for subsequent steps
310+
uses: azure/login@v2
311+
with:
312+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
313+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
314+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
315+
enable-AzPSSession: true
302316

303317
- name: Run Deployment Script with Input
304318
shell: pwsh
305319
env:
306-
# From GitHub secrets (for login)
320+
# From GitHub secrets
307321
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
308-
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
309-
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
310-
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
311322

312323
# From workflow inputs and deployment outputs
313324
RESOURCE_GROUP_NAME: ${{ inputs.RESOURCE_GROUP_NAME }}

.github/workflows/job-deploy.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ jobs:
8585
name: Azure Setup
8686
if: inputs.trigger_type != 'workflow_dispatch' || inputs.existing_webapp_url == '' || inputs.existing_webapp_url == null
8787
runs-on: ubuntu-latest
88+
environment: production
8889
outputs:
8990
RESOURCE_GROUP_NAME: ${{ steps.check_create_rg.outputs.RESOURCE_GROUP_NAME }}
9091
ENV_NAME: ${{ steps.generate_env_name.outputs.ENV_NAME }}
@@ -244,10 +245,12 @@ jobs:
244245
uses: actions/checkout@v4
245246

246247
- name: Login to Azure
247-
shell: bash
248-
run: |
249-
az login --service-principal --username ${{ secrets.AZURE_CLIENT_ID }} --password ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
250-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
248+
uses: azure/login@v2
249+
with:
250+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
251+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
252+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
253+
enable-AzPSSession: true
251254

252255
- name: Run Quota Check
253256
id: quota-check
@@ -275,9 +278,6 @@ jobs:
275278
}
276279
env:
277280
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
278-
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
279-
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
280-
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
281281
GPT_MIN_CAPACITY: ${{ env.GPT_MIN_CAPACITY }}
282282
TEXT_EMBEDDING_MIN_CAPACITY: ${{ env.TEXT_EMBEDDING_MIN_CAPACITY }}
283283
AZURE_REGIONS: "${{ vars.AZURE_REGIONS }}"

.github/workflows/test-automation-v2.yml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ env:
2828
jobs:
2929
test:
3030
runs-on: ubuntu-latest
31+
environment: production
3132
outputs:
3233
TEST_SUCCESS: ${{ steps.test1.outcome == 'success' || steps.test2.outcome == 'success' || steps.test3.outcome == 'success' }}
3334
TEST_REPORT_URL: ${{ steps.upload_report.outputs.artifact-url }}
@@ -41,13 +42,11 @@ jobs:
4142
python-version: '3.13'
4243

4344
- name: Login to Azure
44-
env:
45-
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
46-
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
47-
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
48-
run: |
49-
az login --service-principal --username "$AZURE_CLIENT_ID" --password "$AZURE_CLIENT_SECRET" --tenant "$AZURE_TENANT_ID"
50-
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
45+
uses: azure/login@v2
46+
with:
47+
client-id: ${{ secrets.AZURE_CLIENT_ID }}
48+
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
49+
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
5150

5251
- name: Install dependencies
5352
run: |

.github/workflows/test-automation.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ on:
1515
env:
1616
url: ${{ inputs.DKM_URL }}
1717
accelerator_name: "DKM"
18-
permissions:
19-
contents: read
20-
actions: read
2118
jobs:
2219
test:
2320
runs-on: ubuntu-latest

Deployment/checkquota.ps1

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,20 @@ Write-Output "📍 Processed Regions: $($REGIONS -join ', ')"
88
$SUBSCRIPTION_ID = $env:AZURE_SUBSCRIPTION_ID
99
$GPT_MIN_CAPACITY = $env:GPT_MIN_CAPACITY
1010
$TEXT_EMBEDDING_MIN_CAPACITY = $env:TEXT_EMBEDDING_MIN_CAPACITY
11-
$AZURE_CLIENT_ID = $env:AZURE_CLIENT_ID
12-
$AZURE_TENANT_ID = $env:AZURE_TENANT_ID
13-
$AZURE_CLIENT_SECRET = $env:AZURE_CLIENT_SECRET
14-
15-
# Authenticate using Service Principal
16-
Write-Host "Authentication using Service Principal..."
1711
# Ensure Azure PowerShell module is installed and imported
1812
Install-Module -Name Az -AllowClobber -Force -Scope CurrentUser
1913
Import-Module Az
2014

21-
# Create a PSCredential object for authentication
22-
$creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $AZURE_CLIENT_ID, (ConvertTo-SecureString $AZURE_CLIENT_SECRET -AsPlainText -Force)
23-
24-
# Attempt to connect using Service Principal
15+
# Verify existing Azure session (authentication is handled by the caller workflow via OIDC)
2516
try {
26-
Connect-AzAccount -ServicePrincipal -TenantId $AZURE_TENANT_ID -Credential $creds
17+
$context = Get-AzContext
18+
if (-not $context) {
19+
Write-Host "❌ Error: No active Azure session found. Ensure the caller workflow authenticates via azure/login@v2 with enable-AzPSSession: true."
20+
exit 1
21+
}
22+
Write-Host "✅ Using existing Azure session: $($context.Account.Id)"
2723
} catch {
28-
Write-Host "❌ Error: Failed to authenticate using Service Principal. $_"
24+
Write-Host "❌ Error: Failed to verify Azure session. $_"
2925
exit 1
3026
}
3127

Deployment/resourcedeployment.ps1

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,14 @@ function LoginAzure([string]$tenantId, [string]$subscriptionID) {
120120
}
121121
}
122122
if ($env:CI -eq "true"){
123-
az login --service-principal `
124-
--username $env:AZURE_CLIENT_ID `
125-
--password $env:AZURE_CLIENT_SECRET `
126-
--tenant $env:AZURE_TENANT_ID `
127-
Write-Host "CI deployment mode"
123+
# Authentication is handled by the caller workflow via OIDC (azure/login@v2)
124+
$account = az account show 2>&1
125+
if ($LASTEXITCODE -ne 0) {
126+
Write-Host "❌ Error: No active Azure CLI session found. Ensure the caller workflow authenticates via azure/login@v2." -ForegroundColor Red
127+
failureBanner
128+
exit 1
129+
}
130+
Write-Host "CI deployment mode - using existing OIDC session"
128131
}
129132
else{
130133
az login --tenant $tenantId

0 commit comments

Comments
 (0)