Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
You can use GitHub Actions to build an automated software development workflow. You can use the Azure Web Deploy action to automate your workflow and deploy custom containers to Azure App Service.
A workflow is defined by a YAML (.yml) file in the /.github/workflows/ path in your repository. This definition contains the various steps and parameters that are in the workflow.
For an App Service container workflow, the file has three sections:
| Section | Tasks |
|---|---|
| Authentication | 1. Retrieve a service principal or publish profile. 2. Create a GitHub secret. |
| Build | 1. Create the environment. 2. Build the container image. |
| Deploy | 1. Deploy the container image. |
Prerequisites
- An Azure account with an active subscription. Create an account for free.
- A GitHub account. If you don't have one, sign up for free. You need to have code in a GitHub repository to deploy to Azure App Service.
- A working container registry and Azure App Service app for containers. This example uses Azure Container Registry. Make sure to finish the full deployment to Azure App Service for containers. Unlike regular web apps, web apps for containers don't have a default landing page. Publish the container to have a working example.
- Complete these tasks: Learn how to create a containerized Node.js application by using Docker, push the container image to a registry, and then deploy the image to Azure App Service.
Generate deployment credentials
We recommend that you authenticate with Azure App Services for GitHub Actions by using OpenID Connect. You can also authenticate with a service principal or a publish profile.
To authenticate with Azure, save your publish profile credential or service principal as a GitHub secret. You access the secret within your workflow.
A publish profile is an app-level credential. Set up your publish profile as a GitHub secret.
Go to App Service in the Azure portal.
On the Overview pane, select Get Publish profile.
Note
As of October 2020, users must set the app setting for Linux web apps
WEBSITE_WEBDEPLOY_USE_SCMtotruebefore they download the file. To learn how to configure common web app settings, go to Configure an App Service app in the Azure portal.Save the downloaded file. You use the contents of the file to create a GitHub secret.
Configure the GitHub secret for authentication
In GitHub, browse your repository. Select Settings > Security > Secrets and variables > Actions > New repository secret.
To use app-level credentials, paste the contents of the downloaded publish profile file into the secret's value field. Name the secret AZURE_WEBAPP_PUBLISH_PROFILE.
When you configure your GitHub workflow, use the AZURE_WEBAPP_PUBLISH_PROFILE secret in the deploy Azure Web App action. For example:
- uses: azure/webapps-deploy@v2
with:
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
Configure GitHub secrets for your registry
Define secrets to use with the Docker Login action. The example in this article uses Azure Container Registry for the container registry.
Go to your container in the Azure portal or Docker and copy the username and password. You can find the Azure Container Registry username and password in the Azure portal under Settings > Access keys for your registry.
Define a new secret for the registry username named
REGISTRY_USERNAME.Define a new secret for the registry password named
REGISTRY_PASSWORD.
Build the container image
The following example shows part of the workflow that builds a Node.js Docker image. Use Docker Login to sign in to a private container registry. This example uses Azure Container Registry but the same action works for other registries.
name: Linux Container Node Workflow
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
You can also use Docker sign in to sign in to multiple container registries at the same time. This example includes two new GitHub secrets for authentication with docker.io. The example assumes that there's a Dockerfile at the root level of the registry.
name: Linux Container Node Workflow
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- uses: azure/docker-login@v1
with:
login-server: index.docker.io
username: ${{ secrets.DOCKERIO_USERNAME }}
password: ${{ secrets.DOCKERIO_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
The following example shows part of the workflow that builds a Windows Docker image. Use Docker Login to sign in to a private container registry. This example uses Azure Container Registry but the same action works for other registries.
name: Windows Container Workflow
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
You can also use Docker sign-in to sign in to multiple container registries at the same time. This example includes two new GitHub secrets for authentication with docker.io. The example assumes that there's a Dockerfile at the root level of the registry.
name: Windows Container Workflow
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- uses: azure/docker-login@v1
with:
login-server: index.docker.io
username: ${{ secrets.DOCKERIO_USERNAME }}
password: ${{ secrets.DOCKERIO_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
Deploy to an App Service container
To deploy your image to a custom container in App Service, use the azure/webapps-deploy@v2 action. This action has seven parameters:
| Parameter | Explanation |
|---|---|
app-name |
(Required) Name of the App Service app. |
publish-profile |
(Optional) Used with web apps (Windows and Linux) and web app containers (Linux). Multi-container scenario not supported. Publish profile \*.publishsettings file contents with Web Deploy secrets. |
slot-name |
(Optional) Enter an existing slot other than the production slot. |
package |
(Optional) Used only with web apps: Path to package or folder. \*.zip, \*.war, \*.jar, or a folder to deploy. |
images |
(Required) Used only with web app containers: Specify the fully qualified container image name. For example, myregistry.azurecr.io/nginx:latest or python:3.12.12-alpine/. For a multi-container app, multiple container image names can be provided (multi-line separated). |
configuration-file |
(Optional) Used only with web app containers: Path of the Docker Compose file. Should be a fully qualified path or relative to the default working directory. Required for multi-container apps. |
startup-command |
(Optional) Enter the startup command. For example: dotnet run or dotnet filename.dll. |
name: Linux Container Node Workflow
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
- uses: azure/webapps-deploy@v2
with:
app-name: 'myapp'
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'
name: Windows_Container_Workflow
on: [push]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- uses: azure/docker-login@v1
with:
login-server: mycontainer.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- run: |
docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
docker push mycontainer.azurecr.io/myapp:${{ github.sha }}
- uses: azure/webapps-deploy@v2
with:
app-name: 'myapp'
publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'
Related content
You can find our set of actions grouped into different repositories on GitHub. Each repository contains documentation and examples to help you use GitHub for CI/CD and deploy your apps to Azure.