Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
182 changes: 78 additions & 104 deletions .github/workflows/deploy-v2-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ env:
CLEANUP_RESOURCES: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.cleanup_resources || true) || true }}
RUN_E2E_TESTS: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.run_e2e_tests || 'GoldenPath-Testing') || 'GoldenPath-Testing' }}
BUILD_DOCKER_IMAGE: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.build_docker_image || false) || false }}
AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}

jobs:
docker-build:
Expand Down Expand Up @@ -281,16 +282,17 @@ jobs:
run: |
# Azure CLI is pre-installed on Windows GitHub runners
az --version # Verify installation
- name: Try setup-azd action

- name: Setup Azure Developer CLI
uses: Azure/setup-azd@v2

- name: Login to Azure
id: login-azure
shell: bash
run: |
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}
azd auth login --client-id ${{ secrets.AZURE_CLIENT_ID }} --client-secret ${{ secrets.AZURE_CLIENT_SECRET }} --tenant-id ${{ secrets.AZURE_TENANT_ID }}

- name: Run Quota Check
id: quota-check
shell: bash
Expand Down Expand Up @@ -467,114 +469,111 @@ jobs:

- name: Deploy using azd up and extract values (${{ github.event.inputs.waf_enabled == 'true' && 'WAF' || 'Non-WAF' }}+${{ (github.event.inputs.EXP == 'true' || github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID != '' || github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID != '') && 'EXP' || 'Non-EXP' }})
id: get_output
shell: bash
shell: pwsh
run: |
set -e
echo "Starting azd deployment..."
echo "WAF Enabled: ${{ env.WAF_ENABLED }}"
echo "EXP: ${{ env.EXP }}"
echo "Using Docker Image Tag: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }}"
$ErrorActionPreference = "Stop"
Write-Host "Starting azd deployment..."
Write-Host "WAF Enabled: ${{ env.WAF_ENABLED }}"
Write-Host "EXP: ${{ env.EXP }}"
Write-Host "Using Docker Image Tag: ${{ steps.determine_image_tag.outputs.IMAGE_TAG }}"

# Generate current timestamp in desired format: YYYY-MM-DDTHH:MM:SS.SSSSSSSZ
current_date=$(date -u +"%Y-%m-%dT%H:%M:%S.0000000Z")
$current_date = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.0000000Z")

echo "Creating environment..."
azd env new $ENV_NAME --no-prompt
echo "Environment created: $ENV_NAME"
Write-Host "Creating environment..."
azd env new $env:ENV_NAME --no-prompt
Write-Host "Environment created: $env:ENV_NAME"

echo "Setting default subscription..."
Write-Host "Setting default subscription..."
azd config set defaults.subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}

# Set additional parameters
azd env set AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}"
azd env set AZURE_ENV_AI_DEPLOYMENTS_LOCATION="$AZURE_ENV_OPENAI_LOCATION"
azd env set AZURE_LOCATION="$AZURE_LOCATION"
azd env set AZURE_RESOURCE_GROUP="$RESOURCE_GROUP_NAME"
azd env set AZURE_ENV_AI_DEPLOYMENTS_LOCATION="$env:AZURE_ENV_OPENAI_LOCATION"
azd env set AZURE_LOCATION="$env:AZURE_LOCATION"
azd env set AZURE_RESOURCE_GROUP="$env:RESOURCE_GROUP_NAME"
azd env set AZURE_ENV_CONTAINER_IMAGE_TAG="${{ steps.determine_image_tag.outputs.IMAGE_TAG }}"
azd env set AZURE_DEV_COLLECT_TELEMETRY="${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}"
# Set ACR name only when building Docker image
if [[ "${{ env.BUILD_DOCKER_IMAGE }}" == "true" ]]; then
if ("${{ env.BUILD_DOCKER_IMAGE }}" -eq "true") {
# Extract ACR name from login server and set as environment variable
ACR_NAME=$(echo "${{ secrets.ACR_TEST_LOGIN_SERVER }}" )
$ACR_NAME = "${{ secrets.ACR_TEST_LOGIN_SERVER }}"
azd env set AZURE_ENV_CONTAINER_REGISTRY_ENDPOINT="$ACR_NAME"
echo "Set ACR name to: $ACR_NAME"
else
echo "Skipping ACR name configuration (using existing image)"
fi
Write-Host "Set ACR name to: $ACR_NAME"
} else {
Write-Host "Skipping ACR name configuration (using existing image)"
}

if [[ "${{ env.EXP }}" == "true" ]]; then
echo "✅ EXP ENABLED - Setting EXP parameters..."
if ("${{ env.EXP }}" -eq "true") {
Write-Host "✅ EXP ENABLED - Setting EXP parameters..."

# Set EXP variables dynamically
if [[ -n "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" ]]; then
EXP_LOG_ANALYTICS_ID="${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}"
else
EXP_LOG_ANALYTICS_ID="${{ secrets.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}"
fi
if ("${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}" -ne "") {
$EXP_LOG_ANALYTICS_ID = "${{ github.event.inputs.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}"
} else {
$EXP_LOG_ANALYTICS_ID = "${{ secrets.AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID }}"
}

if [[ -n "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" ]]; then
EXP_AI_PROJECT_ID="${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}"
else
EXP_AI_PROJECT_ID="${{ secrets.AZURE_ENV_FOUNDRY_PROJECT_ID }}"
fi
if ("${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}" -ne "") {
$EXP_AI_PROJECT_ID = "${{ github.event.inputs.AZURE_EXISTING_AI_PROJECT_RESOURCE_ID }}"
} else {
$EXP_AI_PROJECT_ID = "${{ secrets.AZURE_ENV_FOUNDRY_PROJECT_ID }}"
}

echo "AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: $EXP_LOG_ANALYTICS_ID"
echo "AZURE_ENV_FOUNDRY_PROJECT_ID: $EXP_AI_PROJECT_ID"
Write-Host "AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID: $EXP_LOG_ANALYTICS_ID"
Write-Host "AZURE_ENV_FOUNDRY_PROJECT_ID: $EXP_AI_PROJECT_ID"
azd env set AZURE_ENV_LOG_ANALYTICS_WORKSPACE_ID="$EXP_LOG_ANALYTICS_ID"
azd env set AZURE_ENV_FOUNDRY_PROJECT_ID="$EXP_AI_PROJECT_ID"
else
echo "❌ EXP DISABLED - Skipping EXP parameters"
fi
} else {
Write-Host "❌ EXP DISABLED - Skipping EXP parameters"
}

# Deploy using azd up
azd up --no-prompt

echo "✅ Deployment succeeded."
echo "$DEPLOY_OUTPUT"
Write-Host "✅ Deployment succeeded."

# Get deployment outputs using azd
echo "Extracting deployment outputs..."
DEPLOY_OUTPUT=$(azd env get-values --output json)
echo "Deployment output: $DEPLOY_OUTPUT"
Write-Host "Extracting deployment outputs..."
$DEPLOY_OUTPUT = azd env get-values --output json | ConvertFrom-Json
Write-Host "Deployment output: $($DEPLOY_OUTPUT | ConvertTo-Json -Depth 10)"

if [[ -z "$DEPLOY_OUTPUT" ]]; then
echo "Error: Deployment output is empty. Please check the deployment logs."
if (-not $DEPLOY_OUTPUT) {
Write-Host "Error: Deployment output is empty. Please check the deployment logs."
exit 1
fi
}

# Export variables only after successful deploy
export CONTAINER_API_APPURL="https://$(echo "$DEPLOY_OUTPUT" | jq -r '.CONTAINER_API_APP_FQDN // empty')"
echo "CONTAINER_API_APPURL=$CONTAINER_API_APPURL" >> $GITHUB_ENV
$CONTAINER_API_APPURL = "https://$($DEPLOY_OUTPUT.CONTAINER_API_APP_FQDN)"
"CONTAINER_API_APPURL=$CONTAINER_API_APPURL" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

export CONTAINER_API_APPNAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.CONTAINER_API_APP_NAME // empty')
echo "CONTAINER_API_APPNAME=$CONTAINER_API_APPNAME" >> $GITHUB_ENV
$CONTAINER_API_APPNAME = $DEPLOY_OUTPUT.CONTAINER_API_APP_NAME
"CONTAINER_API_APPNAME=$CONTAINER_API_APPNAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

export CONTAINER_WEB_APPURL="https://$(echo "$DEPLOY_OUTPUT" | jq -r '.CONTAINER_WEB_APP_FQDN // empty')"
echo "CONTAINER_WEB_APPURL=$CONTAINER_WEB_APPURL" >> $GITHUB_ENV
echo "CONTAINER_WEB_APPURL=$CONTAINER_WEB_APPURL" >> $GITHUB_OUTPUT
$CONTAINER_WEB_APPURL = "https://$($DEPLOY_OUTPUT.CONTAINER_WEB_APP_FQDN)"
"CONTAINER_WEB_APPURL=$CONTAINER_WEB_APPURL" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"CONTAINER_WEB_APPURL=$CONTAINER_WEB_APPURL" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append

export CONTAINER_WEB_APPNAME=$(echo "$DEPLOY_OUTPUT" | jq -r '.CONTAINER_WEB_APP_NAME // empty')
echo "CONTAINER_WEB_APPNAME=$CONTAINER_WEB_APPNAME" >> $GITHUB_ENV
$CONTAINER_WEB_APPNAME = $DEPLOY_OUTPUT.CONTAINER_WEB_APP_NAME
"CONTAINER_WEB_APPNAME=$CONTAINER_WEB_APPNAME" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Register schemas
id: register
shell: bash
shell: pwsh
run: |
echo "Registering schemas..."
sleep 40 # Wait for the API to be ready
Write-Host "Registering schemas..."
Start-Sleep -Seconds 40 # Wait for the API to be ready

cd src/ContentProcessorAPI/samples/schemas
chmod +x ./register_schema.sh
./register_schema.sh ${{ env.CONTAINER_API_APPURL }}/schemavault/ schema_info_sh.json
Set-Location src/ContentProcessorAPI/samples/schemas
& .\register_schema.ps1 "${{ env.CONTAINER_API_APPURL }}/schemavault/" "schema_info_sh.json"

- name: Upload sample invoice and claim data
shell: bash
shell: pwsh
run: |
echo "Uploading sample data..."
cd src/ContentProcessorAPI/samples
chmod +x ./upload_files.sh
./upload_files.sh ${{ env.CONTAINER_API_APPURL }}/contentprocessor/submit ./invoices '${{ steps.register.outputs.invoice_schema_id }}'
./upload_files.sh ${{ env.CONTAINER_API_APPURL }}/contentprocessor/submit ./propertyclaims '${{ steps.register.outputs.propertylossdamageclaimform_schema_id }}'
Write-Host "Uploading sample data..."
Set-Location src/ContentProcessorAPI/samples
& .\upload_files.ps1 "${{ env.CONTAINER_API_APPURL }}/contentprocessor/submit" ".\invoices" "${{ steps.register.outputs.invoice_schema_id }}"
& .\upload_files.ps1 "${{ env.CONTAINER_API_APPURL }}/contentprocessor/submit" ".\propertyclaims" "${{ steps.register.outputs.propertylossdamageclaimform_schema_id }}"


- name: Disable Auth in Web App
Expand Down Expand Up @@ -642,7 +641,7 @@ jobs:
send-notification:
if: always()
needs: [docker-build, deploy, e2e-test]
runs-on: windows-latest
runs-on: ubuntu-latest
env:
accelerator_name: "Content Processing"
steps:
Expand Down Expand Up @@ -802,19 +801,15 @@ jobs:
if: always() && needs.deploy.result == 'success' && needs.deploy.outputs.RESOURCE_GROUP_NAME != '' && github.event.inputs.existing_webapp_url == '' && (github.event_name != 'workflow_dispatch' || github.event.inputs.cleanup_resources == 'true' || github.event.inputs.cleanup_resources == null)
needs: [docker-build, deploy, e2e-test]
runs-on: windows-latest
continue-on-error: true
env:
RESOURCE_GROUP_NAME: ${{ needs.deploy.outputs.RESOURCE_GROUP_NAME }}
AZURE_LOCATION: ${{ needs.deploy.outputs.AZURE_LOCATION }}
AZURE_ENV_OPENAI_LOCATION: ${{ needs.deploy.outputs.AZURE_ENV_OPENAI_LOCATION }}
ENV_NAME: ${{ needs.deploy.outputs.ENV_NAME }}
IMAGE_TAG: ${{ needs.deploy.outputs.IMAGE_TAG }}
AZURE_DEV_COLLECT_TELEMETRY: ${{ vars.AZURE_DEV_COLLECT_TELEMETRY }}
steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Install Azure Developer CLI
uses: Azure/setup-azd@v1.0.0

- name: Setup Azure CLI
shell: bash
run: |
Expand All @@ -826,9 +821,9 @@ jobs:
run: |
az login --service-principal -u ${{ secrets.AZURE_CLIENT_ID }} -p ${{ secrets.AZURE_CLIENT_SECRET }} --tenant ${{ secrets.AZURE_TENANT_ID }}
az account set --subscription ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Delete Resource Group Directly (Optimized Cleanup)
shell: bash
id: delete_rg
run: |
set -e
echo "🗑️ Starting optimized resource cleanup..."
Expand All @@ -843,33 +838,14 @@ jobs:
--yes \
--no-wait

echo "✅ Resource group deletion initiated (running asynchronously)"
echo "✅ Resource group deletion initiated"
echo "Note: Resources will be cleaned up in the background"

- name: Cleanup azd Environment State
if: always()
shell: bash
run: |
set -e
echo "🧹 Cleaning up local azd environment state..."

# Remove local azd environment to prevent state conflicts
if azd env list | grep -q "${{ env.ENV_NAME }}"; then
echo "Removing azd environment: ${{ env.ENV_NAME }}"
azd env select ${{ env.ENV_NAME }} || true
# Just remove the local state, resources already deleted
rm -rf ~/.azd/environments/${{ env.ENV_NAME }} || true
echo "✅ Local azd environment cleaned up"
else
echo "Environment ${{ env.ENV_NAME }} not found locally"
fi

- name: Logout from Azure
if: always()
shell: bash
run: |
azd auth logout
az logout || echo "Warning: Failed to logout from Azure CLI"
az logout
echo "Logged out from Azure."

- name: Generate Cleanup Job Summary
Expand All @@ -880,16 +856,14 @@ jobs:
echo "" >> $GITHUB_STEP_SUMMARY
echo "| Field | Value |" >> $GITHUB_STEP_SUMMARY
echo "|-------|--------|" >> $GITHUB_STEP_SUMMARY
echo "| **Job Status** | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY
echo "| **Resouce Group deletion Status** | ${{ steps.delete_rg.outcome == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY
echo "| **Resource Group** | \`${{ env.RESOURCE_GROUP_NAME }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Azure Region (Infrastructure)** | \`${{ env.AZURE_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Azure OpenAI Region** | \`${{ env.AZURE_ENV_OPENAI_LOCATION }}\` |" >> $GITHUB_STEP_SUMMARY
echo "| **Docker Image Tag** | \`${{ env.IMAGE_TAG }}\` |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "${{ job.status }}" == "success" ]]; then
if [[ "${{ steps.delete_rg.outcome }}" == "success" ]]; then
echo "### ✅ Cleanup Details" >> $GITHUB_STEP_SUMMARY
echo "- Successfully initiated resource group deletion" >> $GITHUB_STEP_SUMMARY
echo "- Resource group \`${{ env.RESOURCE_GROUP_NAME }}\` and all associated resources are being deleted asynchronously" >> $GITHUB_STEP_SUMMARY
echo "- Successfully initiated deletion for Resource Group \`${{ env.RESOURCE_GROUP_NAME }}\`" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
else
echo "### ❌ Cleanup Failed" >> $GITHUB_STEP_SUMMARY
Expand Down
7 changes: 7 additions & 0 deletions src/ContentProcessorAPI/samples/schemas/register_schema.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,13 @@ foreach ($entry in $schemaEntries) {
$id = $responseJson.Id
$desc = $responseJson.Description
Write-Output "$desc's Schema Id - $id"

# Set GitHub Actions output if GITHUB_OUTPUT environment variable exists
if ($env:GITHUB_OUTPUT) {
# Create a safe variable name from the class name (lowercase, alphanumeric and underscores only)
$safeName = $className.ToLower() -replace '[^a-z0-9_]', ''
"${safeName}_schema_id=$id" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append
}
}
else {
Write-Error "Failed to upload '$schemaFile'. HTTP Status: $httpStatusCode"
Expand Down
Loading