name: Deploy to Azure permissions: contents: read on: workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Validate Secrets run: | echo "Validating required secrets..." [ -n "${{ secrets.AZURE_CLIENT_ID }}" ] || (echo "❌ Missing: AZURE_CLIENT_ID"; exit 1) [ -n "${{ secrets.AZURE_CLIENT_SECRET }}" ] || (echo "❌ Missing: AZURE_CLIENT_SECRET"; exit 1) [ -n "${{ secrets.AZURE_TENANT_ID }}" ] || (echo "❌ Missing: AZURE_TENANT_ID"; exit 1) [ -n "${{ secrets.AZURE_SUBSCRIPTION_ID }}" ] || (echo "❌ Missing: AZURE_SUBSCRIPTION_ID"; exit 1) [ -n "${{ secrets.AZURE_OPENAI_ENDPOINT }}" ] || (echo "❌ Missing: AZURE_OPENAI_ENDPOINT"; exit 1) [ -n "${{ secrets.AZURE_OPENAI_API_KEY }}" ] || (echo "❌ Missing: AZURE_OPENAI_API_KEY"; exit 1) echo "✓ All required secrets are present" - name: Azure CLI Login run: | echo "Logging in to Azure..." 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 }}" echo "✓ Azure login successful" - name: Build Docker Image run: | echo "Building Docker image in Azure Container Registry..." az acr build \ --registry nursingvalidatoracr \ --image nursing-validator:latest \ --image nursing-validator:${{ github.sha }} \ --file Dockerfile . - name: Deploy Container run: | echo "Getting Azure Container Registry credentials..." REGISTRY_USERNAME=$(az acr credential show --name nursingvalidatoracr --query username --output tsv) REGISTRY_PASSWORD=$(az acr credential show --name nursingvalidatoracr --query 'passwords[0].value' --output tsv) echo "Removing existing container if present..." az container delete \ --resource-group nursing-validator-prod \ --name nursing-validator \ --yes 2>/dev/null || true sleep 5 echo "Creating new container instance..." az container create \ --resource-group nursing-validator-prod \ --name nursing-validator \ --image nursingvalidatoracr.azurecr.io/nursing-validator:latest \ --registry-login-server nursingvalidatoracr.azurecr.io \ --registry-username "$REGISTRY_USERNAME" \ --registry-password "$REGISTRY_PASSWORD" \ --os-type Linux \ --cpu 2 \ --memory 4 \ --ports 8501 \ --ip-address Public \ --environment-variables \ APP_ENV=production \ LOG_LEVEL=info \ --secure-environment-variables \ AZURE_OPENAI_ENDPOINT="${{ secrets.AZURE_OPENAI_ENDPOINT }}" \ AZURE_OPENAI_API_KEY="${{ secrets.AZURE_OPENAI_API_KEY }}" \ AZURE_OPENAI_DEPLOYMENT="gpt-4o" \ AZURE_OPENAI_API_VERSION="2024-08-01-preview" \ --restart-policy OnFailure - name: Get Deployment URL run: | echo "Waiting for container to be assigned a public IP..." sleep 15 FQDN=$(az container show \ --resource-group nursing-validator-prod \ --name nursing-validator \ --query ipAddress.fqdn \ --output tsv 2>/dev/null || echo "") if [ -z "$FQDN" ]; then echo "⚠️ IP not yet assigned. Check status with:" echo " az container show --resource-group nursing-validator-prod --name nursing-validator" else echo "" echo "✅ DEPLOYMENT SUCCESSFUL!" echo "" echo "🌐 Access your application at:" echo " http://$FQDN:8501" echo "" echo "🔑 Login credentials:" echo " Username: admin" echo " Password: admin2025" echo "" echo "📊 Features:" echo " • Predictions Dashboard" echo " • Recommendations Dashboard" echo " • Anomaly Detection" echo " • Explainability (SHAP)" echo "" echo "📋 View logs:" echo " az container logs --resource-group nursing-validator-prod --name nursing-validator" fi