Skip to content

First draft of Azure pipeline implementation and Devcontainers for AI… #1

First draft of Azure pipeline implementation and Devcontainers for AI…

First draft of Azure pipeline implementation and Devcontainers for AI… #1

Workflow file for this run

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