CI/CD Azure - Real-Time Intelligence Operations #10
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_ENV_NAME_DEV: ${{ vars.AZURE_ENV_NAME_DEV }} | |
| AZURE_RESOURCE_GROUP_NAME_DEV: 'rg-${{ vars.AZURE_ENV_NAME_DEV }}' | |
| # Optional environment variables | |
| FABRIC_WORKSPACE_ADMINISTRATORS: ${{ vars.FABRIC_WORKSPACE_ADMINISTRATORS }} | |
| 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 ${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }} \ | |
| --template-file infra/main.json \ | |
| --parameters infra/main.parameters.json \ | |
| --parameters solutionName=${{ env.AZURE_ENV_NAME_DEV }} | |
| 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 | |
| SOLUTION_SUFFIX: ${{ steps.bicep-deploy.outputs.SOLUTION_SUFFIX }} | |
| AZURE_ENV_NAME: ${{ env.AZURE_ENV_NAME_DEV }} | |
| 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 }} | |
| 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 " Workspace Administrators: ${FABRIC_WORKSPACE_ADMINISTRATORS:-'(none specified)'}" | |
| 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 unified PowerShell provisioning script with environment variables | |
| pwsh ./Run-PythonScript.ps1 \ | |
| -ScriptPath "infra/scripts/fabric/deploy_fabric_rti.py" \ | |
| -SkipPythonVirtualEnvironment \ | |
| -SkipPythonDependencies \ | |
| -SkipPipUpgrade | |
| echo "✅ RTI fabric items provisioning completed" | |
| - name: Output Deployment Summary | |
| env: | |
| SOLUTION_SUFFIX: ${{ steps.bicep-deploy.outputs.SOLUTION_SUFFIX }} | |
| 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 }} | |
| AZURE_EVENT_HUB_NAME: ${{ steps.bicep-deploy.outputs.AZURE_EVENT_HUB_NAME }} | |
| run: | | |
| 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 "🏷️ **Environment:** ${{ env.AZURE_ENV_NAME_DEV }}" >> $GITHUB_STEP_SUMMARY | |
| echo "🔖 **Solution Suffix:** ${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🏢 Azure Resources Deployed" >> $GITHUB_STEP_SUMMARY | |
| echo "| Resource | Name |" >> $GITHUB_STEP_SUMMARY | |
| echo "|----------|------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| 📂 Resource Group | ${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| ⚡ Fabric Capacity | ${AZURE_FABRIC_CAPACITY_NAME} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 📡 Event Hub Namespace | ${AZURE_EVENT_HUB_NAMESPACE_NAME} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| 📨 Event Hub | ${AZURE_EVENT_HUB_NAME} |" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🔗 Azure Portal Links" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📂 [Resource Group](https://portal.azure.com/#@${{ env.AZURE_TENANT_ID }}/resource/subscriptions/${{ env.AZURE_SUBSCRIPTION_ID }}/resourceGroups/${{ env.AZURE_RESOURCE_GROUP_NAME_DEV }}/overview)" >> $GITHUB_STEP_SUMMARY | |
| echo "- ⚡ [Fabric Capacity](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/${AZURE_FABRIC_CAPACITY_NAME}/overview)" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📡 [Event Hub Namespace](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/${AZURE_EVENT_HUB_NAMESPACE_NAME}/overview)" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🔧 Fabric Resources (Expected Names)" >> $GITHUB_STEP_SUMMARY | |
| echo "The following Fabric resources should have been created with these naming patterns:" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🏠 **Workspace:** rti_workspace_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🏛️ **Eventhouse:** rti_eventhouse_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🗄️ **Database:** rti_kqldb_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "- 📊 **Dashboard:** rti_dashboard_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🌊 **Eventstream:** rti_eventstream_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "- 🚨 **Activator:** rti_activator_${SOLUTION_SUFFIX}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 🚀 Next Steps" >> $GITHUB_STEP_SUMMARY | |
| echo "1. 📊 Access your Fabric workspace at [app.fabric.microsoft.com](https://app.fabric.microsoft.com)" >> $GITHUB_STEP_SUMMARY | |
| echo "2. 🎯 Start the event simulator to generate sample data" >> $GITHUB_STEP_SUMMARY | |
| echo "3. 📈 View real-time analytics in the dashboard" >> $GITHUB_STEP_SUMMARY | |
| echo "4. 🔔 Configure alert recipients in the Activator" >> $GITHUB_STEP_SUMMARY |