Azure / webapps-deploy

Enable GitHub developers to deploy to Azure WebApps using GitHub Actions
MIT License
264 stars 190 forks source link

Deploying Web Apps with Sidecar Containers #430

Open jscarle opened 1 month ago

jscarle commented 1 month ago

I've looked over all of the documentation available for sidecars: https://learn.microsoft.com/en-us/azure/app-service/tutorial-custom-container-sidecar

I cannot find any way to deploy a new image for Web Apps that are sidecar enabled. The closest I could find was this:

    - name: Deploy Azure WebApp to Staging
      uses: azure/webapps-deploy@v2
      with: 
        app-name: ${{ env.WEB_APP_NAME }} 
        images: ${{ env.ACR_LOGIN_SERVER }}/${{ env.CONTAINER_IMAGE_NAME }}:${{ github.sha }}
        slot-name: staging

But that's not valid for sidecar enabled Web Apps.

tulikac commented 1 month ago

Hi @jscarle - right now, we don't have a way to deploy sidecars with Github Actions. However, we are working on this and you should have the functionality in a few months.

In the meanwhile, you can deploy your app using an ARM template. Here is an example https://github.com/Azure-Samples/appservice-linux-sidecar/blob/main/nginx-sample/armtemplatemultictr.json

jscarle commented 1 month ago

For anyone else who comes across this issue and is looking for the same answer as I was, this is how you can update your existing Web App using a GitHub Action.

// update-deployment.yml

permissions:
  contents: read
  id-token: write

jobs:
  update-deployment:
    name: Update Deployment
    runs-on: ubuntu-latest
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Login to Azure
        uses: azure/login@v2
        with:
          creds: {credentials}

      - name: Deploy Azure Resource Manager template
        uses: azure/arm-deploy@v2
        with:
          deploymentName: {deployment}
          deploymentMode: Incremental
          scope: resourcegroup
          resourceGroupName: {resourcegroup}
          template: ./update-deployment.json
          parameters: webAppName={webAppName} mainImage={mainImage} sidecarA={sidecarA}

Replace the following placeholders with your values: {credentials} => The Azure Credentials JSON, see https://github.com/Azure/login {deployment} => Any name you can to give to your deployment, restricted to the same rules as a resource group name. update-app for example. {resourcegroup} => The name of the resource group that contains the Web App. {webAppName} => The name of the web app that you want to update. {mainImage} => The registry, image name, and tag you want to set the image to. contoso.azurecr.io/app/app-main:latest for example. {sidecarA} => The image you want for the first sidecar. The template is written with conditionals so all sidecars are optional. The maximum you can configure are 4 sidecars as per Azure limits.

This is the ARM template:

// update-deployment.json

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "webAppName": {
      "type": "string",
      "metadata": {
        "description": "The name of the Web App"
      }
    },
    "mainImage": {
      "type": "string",
      "metadata": {
        "description": "The main image to set"
      }
    },
    "sidecarAImage": {
      "type": "string",
      "metadata": {
        "description": "The first sidecar image to set"
      },
      "defaultValue": ""
    },
    "sidecarBImage": {
      "type": "string",
      "metadata": {
        "description": "The second sidecar image to set"
      },
      "defaultValue": ""
    },
    "sidecarCImage": {
      "type": "string",
      "metadata": {
        "description": "The third sidecar image to set"
      },
      "defaultValue": ""
    },
    "sidecarDImage": {
      "type": "string",
      "metadata": {
        "description": "The fourth sidecar image to set"
      },
      "defaultValue": ""
    }
  },
  "resources": [
    {
      "type": "Microsoft.Web/sites/sitecontainers",
      "apiVersion": "2023-12-01",
      "name": "[format('{0}/{1}', parameters('webAppName'), 'main')]",
      "properties": {
        "image": "[parameters('mainImage')]",
        "isMain": true
      }
    },
    {
      "condition": "[not(empty(parameters('sidecarAImage')))]",
      "type": "Microsoft.Web/sites/sitecontainers",
      "apiVersion": "2023-12-01",
      "name": "[format('{0}/{1}', parameters('webAppName'), 'sidecarA')]",
      "properties": {
        "image": "[parameters('sidecarAImage')]",
        "isMain": false
      }
    },
    {
      "condition": "[not(empty(parameters('sidecarBImage')))]",
      "type": "Microsoft.Web/sites/sitecontainers",
      "apiVersion": "2023-12-01",
      "name": "[format('{0}/{1}', parameters('webAppName'), 'sidecarB')]",
      "properties": {
        "image": "[parameters('sidecarBImage')]",
        "isMain": false
      }
    },
    {
      "condition": "[not(empty(parameters('sidecarCImage')))]",
      "type": "Microsoft.Web/sites/sitecontainers",
      "apiVersion": "2023-12-01",
      "name": "[format('{0}/{1}', parameters('webAppName'), 'sidecarC')]",
      "properties": {
        "image": "[parameters('sidecarCImage')]",
        "isMain": false
      }
    },
    {
      "condition": "[not(empty(parameters('sidecarDImage')))]",
      "type": "Microsoft.Web/sites/sitecontainers",
      "apiVersion": "2023-12-01",
      "name": "[format('{0}/{1}', parameters('webAppName'), 'sidecarD')]",
      "properties": {
        "image": "[parameters('sidecarDImage')]",
        "isMain": false
      }
    }
  ]
}