From f47b3c568215fbb3575a15bc5638945f97919d63 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Tue, 24 Feb 2026 07:41:09 +0100
Subject: [PATCH] ci: restore build and deploy workflow
Restore .github/workflows/build-deploy.yml so pushes to main trigger automated ACR build and Azure Container App deployment again.
Co-authored-by: Cursor
---
.github/workflows/build-deploy.yml | 111 +++++++++++++++++++++++++++++
1 file changed, 111 insertions(+)
create mode 100644 .github/workflows/build-deploy.yml
diff --git a/.github/workflows/build-deploy.yml b/.github/workflows/build-deploy.yml
new file mode 100644
index 0000000..7023253
--- /dev/null
+++ b/.github/workflows/build-deploy.yml
@@ -0,0 +1,111 @@
+name: Build and Deploy to ACR
+
+on:
+ push:
+ branches:
+ - main
+ workflow_dispatch:
+
+env:
+ IMAGE_NAME: teams-browser-bot
+ RESOURCE_GROUP: resource-core
+ CONTAINER_APP_NAME: cae-poweron-shared
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Log in to Azure Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ${{ secrets.ACR_LOGIN_SERVER }}
+ username: ${{ secrets.ACR_USERNAME }}
+ password: ${{ secrets.ACR_PASSWORD }}
+
+ - name: Build and push Docker image
+ uses: docker/build-push-action@v5
+ with:
+ context: .
+ push: true
+ tags: |
+ ${{ secrets.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:latest
+ ${{ secrets.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
+
+ - name: Azure Login
+ uses: azure/login@v2
+ with:
+ creds: ${{ secrets.AZURE_CREDENTIALS }}
+
+ - name: Deploy to Container App
+ uses: azure/cli@v2
+ with:
+ azcliversion: latest
+ inlineScript: |
+ SUFFIX=$(echo "${{ github.sha }}" | cut -c1-8)
+
+ # Update image AND ensure minReplicas=1 so the container actually starts.
+ # Without --min-replicas 1, Azure scales to zero and the bot never boots.
+ az containerapp update \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --image ${{ secrets.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ github.sha }} \
+ --revision-suffix "deploy-${SUFFIX}" \
+ --min-replicas 1 \
+ --max-replicas 1
+
+ - name: Verify deployment
+ uses: azure/cli@v2
+ with:
+ azcliversion: latest
+ inlineScript: |
+ sleep 15
+
+ # Get the revision we just deployed (sorted by creation date, newest first)
+ EXPECTED_SUFFIX="deploy-$(echo "${{ github.sha }}" | cut -c1-8)"
+ LATEST_REVISION=$(az containerapp revision list \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --query "sort_by(@, &properties.createdTime) | [-1].name" -o tsv)
+ echo "Latest revision: $LATEST_REVISION"
+
+ # Check provisioning state
+ STATE=$(az containerapp revision show \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --revision "$LATEST_REVISION" \
+ --query "properties.runningState" -o tsv 2>/dev/null || echo "unknown")
+ echo "Revision state: $STATE"
+
+ # Activate revision if not running, then restart
+ if [ "$STATE" != "Running" ]; then
+ echo "Revision not running yet, activating..."
+ az containerapp revision activate \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --revision "$LATEST_REVISION" || true
+ sleep 5
+ fi
+
+ az containerapp revision restart \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --revision "$LATEST_REVISION" || true
+
+ # Final status check
+ sleep 10
+ REPLICAS=$(az containerapp revision show \
+ --name ${{ env.CONTAINER_APP_NAME }} \
+ --resource-group ${{ env.RESOURCE_GROUP }} \
+ --revision "$LATEST_REVISION" \
+ --query "properties.replicas" -o tsv 2>/dev/null || echo "0")
+ echo "Running replicas: $REPLICAS"
+
+ - name: Summary
+ run: |
+ echo "### Deployed successfully! :rocket:" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Image: \`${{ secrets.ACR_LOGIN_SERVER }}/${{ env.IMAGE_NAME }}:${{ github.sha }}\`" >> $GITHUB_STEP_SUMMARY