将文件部署到 Azure 应用服务

备注

从 2024 年 6 月 1 日开始,新创建的应用服务应用可以生成使用命名约定 <app-name>-<random-hash>.<region>.chinacloudsites.cn 的唯一默认主机名。 现有应用名称保持不变。 例如:

myapp-ds27dh7271aah175.chinanorth3-01.chinacloudsites.cn

本文介绍如何将代码作为 ZIP、WAR、JAR 或 EAR 包部署到 Azure 应用服务。 它还演示如何将单个文件部署到应用服务,与应用程序包分开。

先决条件

若要完成本文中的步骤,请创建一个应用服务应用,或者使用为其他教程创建的应用。

如果没有 Azure 订阅,可在开始前创建一个试用帐户

创建一个项目 ZIP 包

重要

为部署创建 ZIP 包时,不要包含根目录,应只包含其中的文件和目录。 如果将 GitHub 存储库下载为 ZIP 文件,无法将该文件按原样部署到应用服务。 GitHub 可在顶层添加额外的嵌套目录,但这不适用于应用服务。

在本地终端窗口中,导航到应用项目的根目录。

此目录应包含 Web 应用的入口文件,例如 index.htmlindex.phpapp.js。 它还可能包含包管理文件,如 project.jsoncomposer.jsonpackage.jsonbower.jsonrequirements.txt

除非你希望应用服务为你运行部署自动化,否则请运行所有生成任务(例如,npmbowergulpcomposerpip),并确保你拥有运行应用所需的所有文件。 如果想要直接运行包,则此步骤是必需的。

创建一个包含项目所有内容的 zip 文件。 对于 dotnet 项目,这是 dotnet publish 命令的输出目录中的所有内容(不包含输出目录本身)。 例如,在终端中使用以下命令创建包含当前目录内容的 ZIP 包:

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

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

部署 ZIP 包

部署 ZIP 包时,应用服务会将其内容解压缩到应用的默认路径中: D:\home\site\wwwroot 适用于 Windows 和 /home/site/wwwroot Linux。

此 ZIP 包部署使用为基于持续集成的部署提供支持的同一 Kudu 服务。 Kudu 支持使用以下功能进行 ZIP 包部署:

  • 删除从上一部署留下的文件
  • 打开默认生成过程(包括包还原)的选项
  • 部署自定义,包括运行部署脚本
  • 部署日志
  • 包大小限制为 2,048 兆字节

备注

仅当 ZIP 包中文件的时间戳与已部署的文件不匹配时,才会复制该包中的文件。

在 Kudu 中通过 ZIP 部署界面进行部署

在浏览器中,转到 https://<app_name>.scm.chinacloudsites.cn/ZipDeployUI。 有关应用名称,请参阅 文章开头的注释

上传在 创建项目 ZIP 包中创建的 ZIP 包。 将它拖到网页上的“文件资源管理器”区域。

部署正在进行时,右上角的图标会显示进度百分比。 该页还会显示 文件资源管理器 区域下方的操作消息。 部署完成后,最后一条消息应显示“部署成功”。

此终结点目前不适用于 Linux 上的应用服务。 请考虑改用 FTP 或 ZIP 部署 API

在 Kudu 中不使用 ZIP 部署 UI 进行部署

使用 az webapp deploy 命令将 ZIP 包部署到 Web 应用。 该 CLI 命令使用 Kudu 发布 API 部署文件,并且完全可自定义。

以下示例将 ZIP 包推送到站点。 为 --src-path 指定本地 ZIP 包的路径。

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

部署 ZIP 包后,此命令将重启应用。

为 ZIP 部署启用生成自动化

默认情况下,部署引擎假设 ZIP 包已准备好按原样运行,并且不运行任何生成自动化。 若要启用 Git 部署中使用的同一生成自动化,请设置 SCM_DO_BUILD_DURING_DEPLOYMENT 应用设置。 在 Azure Cloud Shell 中运行以下命令:

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

有关详细信息,请参阅 Kudu 文档

部署 WAR、JAR 或 EAR 包

可以使用 Azure CLI、PowerShell 或 Kudu 发布 API 将 WAR、JAR 或 EAR 包部署到应用服务以运行 Java Web 应用。

此处显示的部署过程使用正确的命名约定和目录结构将包放置在应用的内容共享上。 有关详细信息,请查看 Kudu 发布 API 参考。 建议采用此方法。 如果改为通过使用 FTP 或 Web 部署来部署 WAR、JAR 或 EAR 包,则可能会看到由于命名或结构错误而导致的未知故障。

使用 az webapp deploy 命令将 WAR 包部署到 Tomcat 或 JBoss EAP。 为 --src-path 指定本地 Java 包的路径。

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

该 CLI 命令使用 Kudu 发布 API 来部署包,并且完全可自定义。

部署单个文件

使用带参数的 az webapp deploy 命令 --type 将启动脚本、库和静态文件部署到 Web 应用。

如果以这种方式部署启动脚本,应用服务会自动使用你的脚本来启动应用。

该 CLI 命令使用 Kudu 发布 API 部署文件。 完全可自定义此命令。

部署启动脚本

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

部署库文件

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

部署静态文件

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

部署到受网络保护的应用

根据 Web 应用的网络配置,可能会阻止从开发环境直接访问应用。 (请参阅 “部署到受网络保护的站点 ”和 “部署到网络安全站点”第 2 部分。可以将其发布到可从 Web 应用访问的存储系统,并触发应用从存储位置拉取 ZIP,而不是将包或文件直接推送到 Web 应用。

远程 URL 可以是任何可公开访问的位置,但最好使用具有共享访问签名 (SAS) 密钥的 Blob 存储容器来保护它。

像在其他部分中一样使用 az webapp deploy 命令,但使用 --src-url 而不是 --src-path。 以下示例会使用 --src-url 参数指定 Azure 存储帐户中托管的 ZIP 文件的 URL。

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

Kudu 发布 API 参考

publish Kudu API 允许指定 CLI 命令中所用的相同参数作为 URL 查询参数。 若要使用 Kudu REST API 进行身份验证,建议使用令牌身份验证,但也可使用采用应用部署凭据的基本身份验证。

下表显示了可用的查询参数及其允许的值和说明。

密钥 允许的值 描述 必须 类型
type war|jar|ear|lib|startup|static|zip 这是要部署的项目的类型。 它设置默认的目标路径,并通知 Web 应用应如何处理部署。

type=zip:通过将内容解压缩到 /home/site/wwwroot来部署 ZIP 包。 target-path 参数是可选的。

type=war:部署 WAR 包。 默认情况下,WAR 包将部署到 /home/site/wwwroot/app.war。 可以使用 target-path 指定目标路径。

type=jar:将 JAR 包部署到 /home/site/wwwroot/app.jar. 忽略 target-path 参数。

type=ear:将 EAR 包部署到 /home/site/wwwroot/app.ear。 忽略 target-path 参数。

type=lib:部署 JAR 库文件。 默认情况下,该文件将部署到 /home/site/libs。 可以使用 target-path 指定目标路径。

type=static:部署静态文件,例如脚本。 默认情况下,该文件将部署到 /home/site/wwwroot

type=startup:部署一个脚本,该脚本会自动被应用服务用作应用的启动脚本。 默认情况下,该脚本将部署到 D:\home\site\scripts\<name-of-source>(在 Windows 中)或 home/site/wwwroot/startup.sh(在 Linux 中)。 可以使用 target-path 指定目标路径。
字符串
restart true|false 默认情况下,在完成部署操作后,API 将重启应用 (restart=true)。 部署多个项目时,可以设置 restart=false,防止在除最后一个部署外的其他所有部署上重启。 布尔
clean true|false 指定在目标部署中部署项目之前是否清理(删除)目标部署。 布尔
ignorestack true|false 发布 API 使用 WEBSITE_STACK 环境变量根据站点的语言堆栈选择安全默认值。 将此参数设置为 false 会禁用任何特定于语言的默认值。 布尔
target-path 绝对路径 要将项目部署到的绝对路径。 例如,/home/site/deployments/tools/driver.jar/home/site/scripts/helper.sh 字符串

有关更高级的部署方案,请参阅使用 Git 部署到 Azure。 通过基于 Git 的 Azure 部署可实现版本控制、包还原、MSBuild 等功能。