Deploy files to App Service

This article shows you how to deploy your code as a ZIP, WAR, JAR, or EAR package to Azure App Service. It also shows how to deploy individual files to App Service, separate from your application package.

Prerequisites

To complete the steps in this article, create an App Service app, or use an app that you created for another tutorial.

If you don't have an Azure subscription, create a free account before you begin.

Create a project ZIP package

Note

If you downloaded the files in a ZIP package, extract the files first. For example, if you downloaded a ZIP package from GitHub, you cannot deploy that file as-is. GitHub adds additional nested directories, which do not work with App Service.

In a local terminal window, navigate to the root directory of your app project.

This directory should contain the entry file to your web app, such as index.html, index.php, and app.js. It can also contain package management files like project.json, composer.json, package.json, bower.json, and requirements.txt.

Unless you want App Service to run deployment automation for you, run all the build tasks (for example, npm, bower, gulp, composer, and pip) and make sure that you have all the files you need to run the app. This step is required if you want to run your package directly.

Create a ZIP archive of everything in your project. For dotnet projects, this folder is the output folder of the dotnet publish command. The following command uses the default tool in your terminal:

# Bash
zip -r <file-name>.zip .

# PowerShell
Compress-Archive -Path * -DestinationPath <file-name>.zip

Deploy a ZIP package

When you deploy a ZIP package, App Service unpacks its contents in the default path for your app (D:\home\site\wwwroot for Windows, /home/site/wwwroot for Linux).

This ZIP package deployment uses the same Kudu service that powers continuous integration-based deployments. Kudu supports the following functionality for ZIP package deployment:

  • Deletion of files left over from a previous deployment.
  • Option to turn on the default build process, which includes package restore.
  • Deployment customization, including running deployment scripts.
  • Deployment logs.
  • A package size limit of 2048 MB.

For more information, see Kudu documentation.

Note

Files in the ZIP package are copied only if their timestamps don't match what is already deployed. Generating a zip using a build process that caches outputs can result in faster deployments. See Deploying from a zip file or url, for more information.

Deploy a ZIP package to your web app by using the az webapp deploy command. The CLI command uses the Kudu publish API to deploy the files and can be fully customized.

The following example pushes a ZIP package to your site. Specify the path to your local ZIP package for --src-path.

az webapp deploy --resource-group <group-name> --name <app-name> --src-path <zip-package-path>

This command restarts the app after deploying the ZIP package.

Depending on your web apps's networking configuration, direct access to the site from your local environment may be blocked. To deploy your code in this scenario, you can publish your ZIP to a storage system accessible from the web app and trigger the app to pull the ZIP from the storage location, instead of pushing the ZIP to the web app. See this article on deploying to network secured web apps for more information.

The following example uses the --src-url parameter to specify the URL of an Azure Storage account that the site should pull the ZIP from.

az webapp deploy --resource-group <grou-name> --name <app-name> --src-url "https://storagesample.blob.core.windows.net/sample-container/myapp.zip?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3

Enable build automation for ZIP deploy

By default, the deployment engine assumes that a ZIP package is ready to run as-is and doesn't run any build automation. To enable the same build automation as in a Git deployment, set the SCM_DO_BUILD_DURING_DEPLOYMENT app setting by running the following command in the Cloud Shell:

az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings SCM_DO_BUILD_DURING_DEPLOYMENT=true

For more information, see Kudu documentation.

What happens to my app during deployment?

All the officially supported deployment methods make changes to the files in the /home/site/wwwroot folder of your app. These files are used to run your app. So the deployment can fail because of locked files. The app might also behave unpredictably during deployment because the files aren't all updated at the same time. This behavior is undesirable for a customer-facing app. There are a few ways to avoid these issues:

Deploy WAR/JAR/EAR packages

You can deploy your WAR, JAR, or EAR package to App Service to run your Java web app using the Azure CLI, PowerShell, or the Kudu publish API.

The deployment process places the package on the shared file drive correctly (see Kudu publish API reference). For that reason, deploying WAR/JAR/EAR packages using FTP or WebDeploy is not recommended.

Deploy a WAR package to Tomcat or JBoss EAP by using the az webapp deploy command. Specify the path to your local Java package for --src-path.

az webapp deploy --resource-group <group-name> --name <app-name> --src-path ./<package-name>.war

Depending on your web apps's networking configuration, direct access to the site from your local environment may be blocked. To deploy your code in this scenario, you can publish your ZIP to a storage system accessible from the web app and trigger the app to pull the ZIP from the storage location, instead of pushing the ZIP to the web app. See this article on deploying to network secured web apps for more information.

The following example uses the --src-url parameter to specify the URL of an Azure Storage account that the web app should pull the ZIP from.

az webapp deploy --resource-group <grou-name> --name <app-name> --src-url "https://storagesample.blob.core.windows.net/sample-container/myapp.war?sv=2021-10-01&sb&sig=slk22f3UrS823n4kSh8Skjpa7Naj4CG3

The CLI command uses the Kudu publish API to deploy the package and can be fully customized.

Deploy individual files

Deploy a startup script, library, and static file to your web app by using the az webapp deploy command with the --type parameter.

If you deploy a startup script this way, App Service automatically uses your script to start your app.

The CLI command uses the Kudu publish API to deploy the files and can be fully customized.

Deploy a startup script

az webapp deploy --resource group <group-name> --name <app-name> --src-path scripts/startup.sh --type=startup

Deploy a library file

az webapp deploy --resource group <group-name> --name <app-name> --src-path driver.jar --type=lib

Deploy a static file

az webapp deploy --resource group <group-name> --name <app-name> --src-path config.json --type=static

Kudu publish API reference

The publish Kudu API allows you to specify the same parameters from the CLI command as URL query parameters. To authenticate with the Kudu API, you can use basic authentication with your app's deployment credentials.

The table below shows the available query parameters, their allowed values, and descriptions.

Key Allowed values Description Required Type
type war|jar|ear|lib|startup|static|zip The type of the artifact being deployed, this sets the default target path and informs the web app how the deployment should be handled.
- type=zip: Deploy a ZIP package by unzipping the content to /home/site/wwwroot. path parameter is optional.
- type=war: Deploy a WAR package. By default, the WAR package is deployed to /home/site/wwwroot/app.war. The target path can be specified with path.
- type=jar: Deploy a JAR package to /home/site/wwwroot/app.jar. The path parameter is ignored
- type=ear: Deploy an EAR package to /home/site/wwwroot/app.ear. The path parameter is ignored
- type=lib: Deploy a JAR library file. By default, the file is deployed to /home/site/libs. The target path can be specified with path.
- type=static: Deploy a static file (e.g. a script). By default, the file is deployed to /home/site/scripts. The target path can be specified with path.
- type=startup: Deploy a script that App Service automatically uses as the startup script for your app. By default, the script is deployed to D:\home\site\scripts\<name-of-source> for Windows and home/site/wwwroot/startup.sh for Linux. The target path can be specified with path.
Yes String
restart true|false By default, the API restarts the app following the deployment operation (restart=true). To deploy multiple artifacts, prevent restarts on the all but the final deployment by setting restart=false. No Boolean
clean true|false Specifies whether to clean (delete) the target deployment before deploying the artifact there. No Boolean
ignorestack true|false The publish API uses the WEBSITE_STACK environment variable to choose safe defaults depending on your site's language stack. Setting this parameter to false disables any language-specific defaults. No Boolean
path "<absolute-path>" The absolute path to deploy the artifact to. For example, "/home/site/deployments/tools/driver.jar", "/home/site/scripts/helper.sh". No String

Next steps

For more advanced deployment scenarios, try deploying to Azure with Git. Git-based deployment to Azure enables version control, package restore, MSBuild, and more.

More resources