inbound calls #40
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: Deploy to Azure | |
| on: | |
| push: | |
| branches: | |
| - main | |
| workflow_dispatch: | |
| inputs: | |
| environment: | |
| description: 'Deployment environment' | |
| required: true | |
| default: 'production' | |
| type: choice | |
| options: | |
| - production | |
| - staging | |
| env: | |
| RESOURCE_GROUP: aylin-rg | |
| LOCATION: germanywestcentral | |
| ACR_NAME: aylinacr | |
| AKS_CLUSTER_NAME: aylin-aks-cluster | |
| NAMESPACE: aylin | |
| jobs: | |
| build-and-deploy: | |
| name: Build and Deploy to Azure | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Install UV | |
| run: pip install uv | |
| - name: Install backend dependencies | |
| working-directory: apps/backend | |
| run: npm ci | |
| - name: Install frontend dependencies | |
| working-directory: apps/frontend | |
| run: npm ci | |
| - name: Run backend tests | |
| working-directory: apps/backend | |
| run: npm test || true | |
| - name: Run agent tests | |
| working-directory: apps/agent | |
| run: | | |
| uv sync | |
| uv run pytest || true | |
| - name: Build backend | |
| working-directory: apps/backend | |
| run: npm run build | |
| - name: Build frontend | |
| working-directory: apps/frontend | |
| run: npm run build | |
| - name: Login to Azure | |
| uses: azure/login@v1 | |
| with: | |
| creds: ${{ secrets.AZURE_CREDENTIALS }} | |
| - name: Login to Azure Container Registry | |
| run: | | |
| az acr login --name ${{ env.ACR_NAME }} | |
| - name: Get ACR login server and credentials | |
| id: acr | |
| run: | | |
| ACR_LOGIN_SERVER=$(az acr show --name ${{ env.ACR_NAME }} --query loginServer -o tsv) | |
| echo "login_server=$ACR_LOGIN_SERVER" >> $GITHUB_OUTPUT | |
| echo "ACR Login Server: $ACR_LOGIN_SERVER" | |
| # Enable admin user and get credentials | |
| az acr update --name ${{ env.ACR_NAME }} --admin-enabled true | |
| ACR_USERNAME=$(az acr credential show --name ${{ env.ACR_NAME }} --query username -o tsv) | |
| ACR_PASSWORD=$(az acr credential show --name ${{ env.ACR_NAME }} --query passwords[0].value -o tsv) | |
| echo "username=$ACR_USERNAME" >> $GITHUB_OUTPUT | |
| echo "password=$ACR_PASSWORD" >> $GITHUB_OUTPUT | |
| - name: Set up Docker Buildx | |
| uses: docker/setup-buildx-action@v3 | |
| - name: Build and push Docker images | |
| env: | |
| ACR_LOGIN_SERVER: ${{ steps.acr.outputs.login_server }} | |
| VERSION_TAG: ${{ github.sha }} | |
| run: | | |
| echo "Building and pushing images with tag: $VERSION_TAG for ARM64" | |
| # Build and push frontend | |
| # VITE_API_URL is empty - frontend uses relative URLs (/api) via ingress | |
| echo "Building frontend for ARM64..." | |
| docker buildx build \ | |
| --platform linux/arm64 \ | |
| -f apps/frontend/Dockerfile \ | |
| --build-arg VITE_GOOGLE_CLIENT_ID="${{ secrets.VITE_GOOGLE_CLIENT_ID }}" \ | |
| --build-arg VITE_API_URL="" \ | |
| -t $ACR_LOGIN_SERVER/aylin-frontend:$VERSION_TAG \ | |
| -t $ACR_LOGIN_SERVER/aylin-frontend:latest \ | |
| --push \ | |
| ./apps/frontend | |
| # Build and push backend | |
| echo "Building backend for ARM64..." | |
| docker buildx build \ | |
| --platform linux/arm64 \ | |
| -f apps/backend/Dockerfile \ | |
| -t $ACR_LOGIN_SERVER/aylin-backend:$VERSION_TAG \ | |
| -t $ACR_LOGIN_SERVER/aylin-backend:latest \ | |
| --push \ | |
| ./apps/backend | |
| # Build and push Python agent worker | |
| echo "Building agent worker for ARM64..." | |
| docker buildx build \ | |
| --platform linux/arm64 \ | |
| -f apps/agent/Dockerfile \ | |
| -t $ACR_LOGIN_SERVER/aylin-agent-worker:$VERSION_TAG \ | |
| -t $ACR_LOGIN_SERVER/aylin-agent-worker:latest \ | |
| --push \ | |
| ./apps/agent | |
| echo "All ARM64 images built and pushed successfully!" | |
| - name: Set up kubectl | |
| uses: azure/setup-kubectl@v3 | |
| with: | |
| version: 'latest' | |
| - name: Get AKS credentials | |
| run: | | |
| az aks get-credentials \ | |
| --resource-group ${{ env.RESOURCE_GROUP }} \ | |
| --name ${{ env.AKS_CLUSTER_NAME }} \ | |
| --overwrite-existing | |
| - name: Deploy to Kubernetes | |
| env: | |
| ACR_LOGIN_SERVER: ${{ steps.acr.outputs.login_server }} | |
| VERSION_TAG: ${{ github.sha }} | |
| run: | | |
| echo "Deploying to Kubernetes..." | |
| # Replace variables in manifests and apply | |
| for manifest in azure-deploy/k8s/backend.yaml azure-deploy/k8s/agent-worker.yaml azure-deploy/k8s/frontend.yaml; do | |
| echo "Applying $manifest..." | |
| cat $manifest | \ | |
| sed "s|\${ACR_LOGIN_SERVER}|$ACR_LOGIN_SERVER|g" | \ | |
| sed "s|\${VERSION_TAG}|$VERSION_TAG|g" | \ | |
| kubectl apply -f - | |
| done | |
| echo "Deployment to Kubernetes completed!" | |
| - name: Wait for deployments | |
| run: | | |
| echo "Waiting for deployments to be ready..." | |
| kubectl wait --for=condition=available --timeout=300s \ | |
| deployment/backend deployment/frontend deployment/agent-worker \ | |
| -n ${{ env.NAMESPACE }} || true | |
| - name: Verify deployment | |
| run: | | |
| echo "Verifying deployment..." | |
| echo "Pod status:" | |
| kubectl get pods -n ${{ env.NAMESPACE }} | |
| echo "" | |
| echo "Service status:" | |
| kubectl get svc -n ${{ env.NAMESPACE }} | |
| echo "" | |
| echo "Deployment status:" | |
| kubectl get deployments -n ${{ env.NAMESPACE }} | |
| # Check backend pod logs for startup | |
| echo "" | |
| echo "Checking backend pod logs for startup..." | |
| kubectl logs -n ${{ env.NAMESPACE }} -l app=backend --tail=20 || true | |
| - name: Deployment summary | |
| if: always() | |
| run: | | |
| echo "=========================================" | |
| echo "Deployment Summary" | |
| echo "=========================================" | |
| echo "Resource Group: ${{ env.RESOURCE_GROUP }}" | |
| echo "Cluster: ${{ env.AKS_CLUSTER_NAME }}" | |
| echo "Namespace: ${{ env.NAMESPACE }}" | |
| echo "Version: ${{ github.sha }}" | |
| echo "" | |
| echo "View resources:" | |
| echo " kubectl get all -n ${{ env.NAMESPACE }}" | |
| echo "" | |
| echo "View logs:" | |
| echo " Backend: kubectl logs -n ${{ env.NAMESPACE }} -l app=backend -f" | |
| echo " Frontend: kubectl logs -n ${{ env.NAMESPACE }} -l app=frontend -f" | |
| echo " Agent Worker: kubectl logs -n ${{ env.NAMESPACE }} -l app=agent-worker -f" | |
| echo "" | |
| echo "Get pod status:" | |
| echo " kubectl get pods -n ${{ env.NAMESPACE }}" |