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