First draft of Azure pipeline implementation and Devcontainers for AI… #1
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI/CD Azure - Real-Time Intelligence Operations | |
| # Trigger the workflow on push to main/master or manual dispatch | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| - "*" | |
| paths: | |
| - "infra/**" | |
| - "src/**" | |
| - ".github/workflows/azure-dev.yml" | |
| pull_request: | |
| branches: | |
| - main | |
| paths: | |
| - "infra/**" | |
| - "src/**" | |
| - ".github/workflows/azure-dev.yml" | |
| # Set up permissions for deploying with secretless Azure federated credentials | |
| permissions: | |
| id-token: write | |
| contents: read | |
| env: | |
| AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }} | |
| AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }} | |
| AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }} | |
| AZURE_LOCATION: ${{ vars.AZURE_LOCATION }} | |
| AZURE_ENV_NAME_DEV: ${{ vars.AZURE_ENV_NAME }} | |
| AZURE_RESOURCE_GROUP_NAME_DEV: ${{ vars.AZURE_RESOURCE_GROUP_NAME }} | |
| AZURE_FABRIC_WORKSPACE_NAME_DEV: "Real-Time Intelligence for Operations - Dev" | |
| # Fabric configuration variables | |
| FABRIC_ACTIVATOR_ALERTS_EMAIL: "alerts@contoso.com" | |
| # Custom resource names (can be overridden by changing these values) | |
| FABRIC_EVENTHOUSE_NAME: "" # If empty, will use default: rti_eventhouse_{suffix} | |
| FABRIC_EVENTHOUSE_DATABASE_NAME: "" # If empty, will use default: rti_kqldb_{suffix} | |
| FABRIC_EVENT_HUB_CONNECTION_NAME: "" # If empty, will use default: rti_eventhub_connection_{suffix} | |
| FABRIC_RTIDASHBOARD_NAME: "" # If empty, will use default: rti_dashboard_{suffix} | |
| FABRIC_EVENTSTREAM_NAME: "" # If empty, will use default: rti_eventstream_{suffix} | |
| FABRIC_ACTIVATOR_NAME: "" # If empty, will use default: rti_activator_{suffix} | |
| jobs: | |
| build: | |
| runs-on: ubuntu-latest | |
| name: Build and Static Analysis | |
| environment: 'rti-build' | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup 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: Install Bicep CLI | |
| run: | | |
| curl -Lo bicep https://github.com/Azure/bicep/releases/latest/download/bicep-linux-x64 | |
| chmod +x ./bicep | |
| sudo mv ./bicep /usr/local/bin/bicep | |
| - name: Bicep Static Code Analysis | |
| run: | | |
| echo "Running Bicep static code analysis on main.bicep..." | |
| bicep build infra/main.bicep --outfile infra/main.json | |
| echo "✅ Bicep compilation successful" | |
| # Run bicep linter | |
| bicep lint infra/main.bicep | |
| echo "✅ Bicep linting completed" | |
| - name: Validate Bicep Template | |
| run: | | |
| echo "Validating Bicep template..." | |
| az deployment group validate \ | |
| --resource-group rg-${{ env.AZURE_ENV_NAME_DEV }} \ | |
| --template-file infra/main.json \ | |
| --parameters infra/main.parameters.json \ | |
| --parameters solutionName=${{ env.AZURE_ENV_NAME_DEV }} \ | |
| --parameters location=${{ env.AZURE_LOCATION }} || true | |
| echo "✅ Bicep template validation completed" | |
| deploy-dev: | |
| runs-on: ubuntu-latest | |
| name: Deploy to Development | |
| environment: 'rti-dev' | |
| needs: build | |
| # if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/pre-deploy-alguadam' || github.event_name == 'workflow_dispatch' | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Azure CLI login | |
| uses: azure/login@v2 | |
| with: | |
| client-id: ${{ env.AZURE_CLIENT_ID }} | |
| tenant-id: ${{ env.AZURE_TENANT_ID }} | |
| subscription-id: ${{ env.AZURE_SUBSCRIPTION_ID }} | |
| - name: Deploy Infrastructure | |
| id: bicep-deploy | |
| uses: azure/bicep-deploy@v2 | |
| with: | |
| type: deployment | |
| operation: create | |
| scope: resourceGroup | |
| subscription-id: ${{ env.AZURE_SUBSCRIPTION_ID }} | |
| resource-group-name: ${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }} | |
| template-file: ./infra/main.bicep | |
| parameters-file: ./infra/main.parameters.json | |
| parameters: | | |
| { | |
| "solutionName": "${{ env.AZURE_ENV_NAME_DEV }}" | |
| } | |
| - name: Setup Python Environment | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.11" | |
| - name: Install Python Dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -r requirements.txt | |
| - name: Run Fabric Provisioning Script | |
| working-directory: infra/scripts/utils | |
| env: | |
| # Required environment variables from Bicep outputs | |
| AZURE_ENV_NAME: ${{ env.AZURE_ENV_NAME_DEV }} | |
| SOLUTION_SUFFIX: ${{ steps.bicep-deploy.outputs.SOLUTION_SUFFIX }} | |
| AZURE_SUBSCRIPTION_ID: ${{ env.AZURE_SUBSCRIPTION_ID }} | |
| AZURE_RESOURCE_GROUP: ${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }} | |
| AZURE_FABRIC_CAPACITY_NAME: ${{ steps.bicep-deploy.outputs.AZURE_FABRIC_CAPACITY_NAME }} | |
| AZURE_EVENT_HUB_NAME: ${{ steps.bicep-deploy.outputs.AZURE_EVENT_HUB_NAME }} | |
| AZURE_EVENT_HUB_NAMESPACE_NAME: ${{ steps.bicep-deploy.outputs.AZURE_EVENT_HUB_NAMESPACE_NAME }} | |
| # Optional environment variables (use default values if not provided) | |
| AZURE_EVENT_HUB_AUTHORIZATION_RULE_NAME: ${{ steps.bicep-deploy.outputs.AZURE_EVENT_HUB_AUTHORIZATION_RULE_NAME || 'RootManageSharedAccessKey' }} | |
| FABRIC_WORKSPACE_NAME: ${{ env.AZURE_FABRIC_WORKSPACE_NAME_DEV }} | |
| FABRIC_ACTIVATOR_ALERTS_EMAIL: ${{ env.FABRIC_ACTIVATOR_ALERTS_EMAIL }} | |
| # Fabric admin members for workspace configuration | |
| AZURE_FABRIC_ADMIN_MEMBERS: ${{ steps.bicep-deploy.outputs.AZURE_FABRIC_ADMIN_MEMBERS }} | |
| # Custom resource names (YAML variables - modify in env section above) | |
| FABRIC_EVENTHOUSE_NAME: ${{ env.FABRIC_EVENTHOUSE_NAME }} | |
| FABRIC_EVENTHOUSE_DATABASE_NAME: ${{ env.FABRIC_EVENTHOUSE_DATABASE_NAME }} | |
| FABRIC_EVENT_HUB_CONNECTION_NAME: ${{ env.FABRIC_EVENT_HUB_CONNECTION_NAME }} | |
| FABRIC_RTIDASHBOARD_NAME: ${{ env.FABRIC_RTIDASHBOARD_NAME }} | |
| FABRIC_EVENTSTREAM_NAME: ${{ env.FABRIC_EVENTSTREAM_NAME }} | |
| FABRIC_ACTIVATOR_NAME: ${{ env.FABRIC_ACTIVATOR_NAME }} | |
| run: | | |
| echo "Running RTI fabric provisioning script..." | |
| echo "Environment configuration:" | |
| echo " Solution: $AZURE_ENV_NAME" | |
| echo " Suffix: $SOLUTION_SUFFIX" | |
| echo " Workspace: $FABRIC_WORKSPACE_NAME" | |
| echo " Capacity: $AZURE_FABRIC_CAPACITY_NAME" | |
| echo " Event Hub Namespace: $AZURE_EVENT_HUB_NAMESPACE_NAME" | |
| echo " Event Hub: $AZURE_EVENT_HUB_NAME" | |
| echo " Alerts Email: $FABRIC_ACTIVATOR_ALERTS_EMAIL" | |
| echo "" | |
| # Note: Custom resource names can be configured in the workflow env section. | |
| # If empty, the deploy script will use default names with solution suffix. | |
| echo "Custom resource names (configured in workflow YAML):" | |
| echo " FABRIC_EVENTHOUSE_NAME: ${FABRIC_EVENTHOUSE_NAME:-'(using default)'}" | |
| echo " FABRIC_EVENTHOUSE_DATABASE_NAME: ${FABRIC_EVENTHOUSE_DATABASE_NAME:-'(using default)'}" | |
| echo " FABRIC_EVENT_HUB_CONNECTION_NAME: ${FABRIC_EVENT_HUB_CONNECTION_NAME:-'(using default)'}" | |
| echo " FABRIC_RTIDASHBOARD_NAME: ${FABRIC_RTIDASHBOARD_NAME:-'(using default)'}" | |
| echo " FABRIC_EVENTSTREAM_NAME: ${FABRIC_EVENTSTREAM_NAME:-'(using default)'}" | |
| echo " FABRIC_ACTIVATOR_NAME: ${FABRIC_ACTIVATOR_NAME:-'(using default)'}" | |
| echo "" | |
| # Run the PowerShell provisioning script with environment variables | |
| pwsh ./Run-DeployFabricRtiPythonScript.ps1 \ | |
| -SkipPythonVirtualEnvironment \ | |
| -SkipPythonDependencies \ | |
| -SkipPipUpgrade | |
| echo "✅ RTI fabric items provisioning completed" | |
| - name: Output Deployment Summary | |
| env: | |
| SOLUTION_SUFFIX: ${{ steps.bicep-deploy.outputs.SOLUTION_SUFFIX }} | |
| FABRIC_WORKSPACE_NAME: ${{ env.AZURE_FABRIC_WORKSPACE_NAME_DEV }} | |
| AZURE_FABRIC_CAPACITY_NAME: ${{ steps.bicep-deploy.outputs.AZURE_FABRIC_CAPACITY_NAME }} | |
| AZURE_EVENT_HUB_NAMESPACE_NAME: ${{ steps.bicep-deploy.outputs.AZURE_EVENT_HUB_NAMESPACE_NAME }} | |
| run: | | |
| # Extract workspace ID from deployment logs if available | |
| WORKSPACE_ID="placeholder-workspace-id" | |
| # Construct URLs based on deploy_fabric_rti.py output format | |
| AZURE_RG_URL="https://portal.azure.com/#@${{ env.AZURE_TENANT_ID }}/resource/subscriptions/${{ env.AZURE_SUBSCRIPTION_ID }}/resourceGroups/${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }}/overview" | |
| CAPACITY_URL="https://portal.azure.com/#@${{ env.AZURE_TENANT_ID }}/resource/subscriptions/${{ env.AZURE_SUBSCRIPTION_ID }}/resourceGroups/${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }}/providers/Microsoft.Fabric/capacities/${{ env.AZURE_FABRIC_CAPACITY_NAME }}/overview" | |
| EVENTHUB_NAMESPACE_URL="https://portal.azure.com/#@${{ env.AZURE_TENANT_ID }}/resource/subscriptions/${{ env.AZURE_SUBSCRIPTION_ID }}/resourceGroups/${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }}/providers/Microsoft.EventHub/namespaces/${{ env.AZURE_EVENT_HUB_NAMESPACE_NAME }}/overview" | |
| WORKSPACE_URL="https://app.fabric.microsoft.com/groups/${WORKSPACE_ID}?experience=fabric-developer" | |
| # Resource names based on naming convention from deploy script | |
| EVENTHOUSE_NAME="rti_eventhouse_${{ env.SOLUTION_SUFFIX }}" | |
| DATABASE_NAME="rti_kqldb_${{ env.SOLUTION_SUFFIX }}" | |
| DASHBOARD_NAME="rti_dashboard_${{ env.SOLUTION_SUFFIX }}" | |
| EVENTSTREAM_NAME="rti_eventstream_${{ env.SOLUTION_SUFFIX }}" | |
| ACTIVATOR_NAME="rti_activator_${{ env.SOLUTION_SUFFIX }}" | |
| CONNECTION_NAME="rti_eventhub_connection_${{ env.SOLUTION_SUFFIX }}" | |
| echo "## 🎉 REAL-TIME INTELLIGENCE OPERATIONS DEPLOYMENT COMPLETE!" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "📅 **Completed:** $(date '+%Y-%m-%d %H:%M:%S')" >> $GITHUB_STEP_SUMMARY | |
| echo "🏷️ **Solution:** ${{ env.SOLUTION_SUFFIX }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 📋 DEPLOYED RESOURCES" >> $GITHUB_STEP_SUMMARY | |
| echo "| Component | Name | Status |" >> $GITHUB_STEP_SUMMARY | |
| echo "|-----------|------|--------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🏠 Workspace | ${{ env.FABRIC_WORKSPACE_NAME }} | ✅ Created |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🏛️ Eventhouse | ${EVENTHOUSE_NAME} | ✅ Created |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🗄️ Database | ${DATABASE_NAME} | ✅ Data Loaded |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 📊 Dashboard | ${DASHBOARD_NAME} | ✅ Created |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🌊 Eventstream | ${EVENTSTREAM_NAME} | ✅ Configured |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🚨 Activator | ${ACTIVATOR_NAME} | ✅ Configured |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 🔗 Connection | ${CONNECTION_NAME} | ✅ Connected |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🏢 AZURE RESOURCES" >> $GITHUB_STEP_SUMMARY | |
| echo "- ⚡ **Capacity:** [${{ env.AZURE_FABRIC_CAPACITY_NAME }}](${CAPACITY_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📡 **Event Hub:** [${{ env.AZURE_EVENT_HUB_NAMESPACE_NAME }}](${EVENTHUB_NAMESPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📂 **Resource Group:** [${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }}](${AZURE_RG_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🔧 FABRIC RESOURCES" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🏠 **Workspace:** [Open in Fabric](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🏛️ **Eventhouse:** [View Eventhouse](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🗄️ **Database:** [Query Database](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📊 **Dashboard:** [View Dashboard](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🌊 **Eventstream:** [Manage Stream](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🚨 **Activator:** [Configure Alerts](${WORKSPACE_URL})" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "✨ **Your real-time intelligence solution is ready!**" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "🚀 **Next Steps:**" >> $GITHUB_STEP_SUMMARY | |
| echo "1. Start the event simulator to generate sample data" >> $GITHUB_STEP_SUMMARY | |
| echo "2. View real-time analytics in the dashboard" >> $GITHUB_STEP_SUMMARY | |
| echo "3. Configure alert recipients in the Activator" >> $GITHUB_STEP_SUMMARY |