你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
每个开发团队都有独特的要求,因此很难做到在任何云服务上都能实现高效的部署管道。 本文介绍了部署到 Azure 应用服务的三个主要组件:部署源、生成管道和部署机制。 本文还提供了特定语言堆栈的一些最佳做法和提示。
部署组件
本部分介绍部署到应用服务的三个主要组件。
部署源
部署源是指应用程序代码的位置。 对于生产应用,部署源通常是由版本控制软件(例如 GitHub、Bitbucket 或 Azure Repos)托管的存储库。 对于开发和测试应用场景,部署源可能是本地计算机上的一个项目。
生成管道
确定了部署源后,下一步就是选择生成管道。 生成管道从部署源读取源代码,并运行一系列步骤,使应用程序处于可运行状态。
步骤可能包括编译代码、缩小 HTML 和 JavaScript、运行测试和打包组件。 生成管道运行的特定命令取决于语言堆栈。 可以在生成服务器(例如 Azure Pipelines)上或本地运行这些操作。
部署机制
部署机制是指将生成的应用程序放入 Web 应用程序的 /home/site/wwwroot 目录中的操作。 /wwwroot 目录是 Web 应用的所有实例一起共享的已装载存储位置。 当部署机制将应用程序放入此目录时,实例会收到要同步新文件的通知。
应用服务支持以下部署机制:
- Kudu 终结点:Kudu 是作为 Windows App 服务中的单独进程运行的开放源代码开发人员生产力工具。 它在 Linux 应用服务中作为第二个容器运行。 Kudu 可以处理持续部署,并提供用于部署的 HTTP 终结点,例如 zipdeploy/。
- FTP 和 WebDeploy:通过使用站点或用户凭据,可以通过 FTP 或 WebDeploy 上传文件。 这些机制不会通过 Kudu。
诸如 Azure Pipelines、Jenkins 和编辑器插件之类的部署工具将使用这些部署机制之一。
使用部署槽位
部署新的生产版本时,请尽可能使用部署槽位。 使用标准应用服务计划层或更好的层级,可以将应用部署到过渡环境、验证更改并执行冒烟测试。 准备就绪后,交换过渡槽和生产槽。 交换操作将根据生产规模所需预热必要的辅助角色实例,这会缩短故障时间。
持续部署代码
如果项目中指定了用于测试、QA 和过渡的分支,则每个分支都应持续部署到过渡槽。 此方法允许利益干系人轻松评估和测试已部署的分支。 有关分支策略的信息,请参阅 基于中继的开发 或 比较 Git 工作流。
对于生产槽位,不得启用持续部署。 而是应将生产分支(通常是主分支)部署到非生产槽上。 准备好发布基本分支后,请将其交换到生产槽中。 交换到生产槽(而不是部署到生产槽)可以防止故障时间,并且允许通过再次交换来回滚更改。
持续部署容器
对于 Docker 或其他容器注册表中的自定义容器,请将映像部署到过渡槽位后交换到生产槽位中,以避免故障停机。 自动化比代码部署更为复杂。 必须将映像推送到容器注册表并更新 Web 应用上的映像标记。
对于想要部署到槽的每个分支,请设置自动化过程,以在每次提交到分支时执行这些任务。
- 生成并标记映像。 作为生成管道的一部分,使用 Git 提交 ID、时间戳或其他可识别信息来标记映像。 最好不要使用默认的 latest 标记。 否则将很难追溯到当前部署的代码,导致调试难度加大。
- 推送已标记的映像。 生成并标记了映像后,管道会将该映像推送到容器注册表。 在下一步中,部署槽位从容器注册表拉取标记的映像。
- 使用新的映像标记更新部署槽位。 更新此属性后,站点会自动重启并拉取新的容器映像。
本文包含常见自动化框架的示例。
使用 Azure DevOps
应用服务通过部署中心为容器提供内置的持续交付。 在 Azure 门户中导航到应用。 在“部署”下,选择“部署中心”。 按照说明选择存储库和分支。 此方法将配置 DevOps 生成和发布管道,以便在将新提交推送到所选分支时,自动生成、标记和部署容器。
使用 GitHub Actions
还可以通过 GitHub Actions 完成自动化容器部署。 工作流文件使用提交 ID 生成并标记容器,将其推送到容器注册表,并使用新的映像标记更新指定的 Web 应用。
on:
push:
branches:
- <your-branch-name>
name: Linux_Container_Node_Workflow
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
# checkout the repo
- name: 'Checkout GitHub Action'
uses: actions/checkout@main
- uses: azure/docker-login@v1
with:
login-server: contoso.azurecr.io
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- run: |
docker build . -t contoso.azurecr.io/nodejssampleapp:${{ github.sha }}
docker push contoso.azurecr.io/nodejssampleapp:${{ github.sha }}
- uses: azure/webapps-deploy@v2
with:
app-name: 'node-rnc'
publish-profile: ${{ secrets.azureWebAppPublishProfile }}
images: 'contoso.azurecr.io/nodejssampleapp:${{ github.sha }}'
使用其他自动化提供程序
前面列出的步骤同样适用于其他自动化实用程序,例如 CircleCI 或 Travis CI。 但是在最后一步中,需要使用 Azure CLI 更新包含了新的映像标记的部署槽位。 若要在自动化脚本中使用 Azure CLI,请使用以下命令生成服务主体。
az ad sp create-for-rbac --name "myServicePrincipal" --role contributor \
--scopes /subscriptions/{subscription}/resourceGroups/{resource-group} \
--sdk-auth
在脚本中,使用 az login --service-principal 进行登录,提供主体信息。 然后,可以使用 az webapp config container set 来设置容器名称、标记、注册表 URL 和注册表密码。 有关详细信息,请参阅如何登录到 Circle CI 上的 Azure CLI。
特定于语言的注意事项
请记住 Java、Node 和 .NET 实现的以下注意事项。
Java
使用 Kudu zipdeploy API 部署 JAR 应用程序。 对 WAR 应用使用 wardeploy。 如果使用的是 Jenkins,则可以在部署阶段直接使用这些 API。 有关详细信息,请参阅使用 Jenkins 部署到 Azure 应用服务。
Node
默认情况下,Kudu 为 Node 应用程序 (npm install) 运行生成步骤。 如果使用的是生成服务(例如 Azure DevOps),则不需要 Kudu 生成。 若要禁用 Kudu 生成,请创建一个值为 false 的应用设置 SCM_DO_BUILD_DURING_DEPLOYMENT。
.NET
默认情况下,Kudu 为 .NET 应用程序 (dotnet build) 运行生成步骤。 如果使用的是生成服务(例如 Azure DevOps),则不需要 Kudu 生成。 若要禁用 Kudu 生成,请创建一个值为 false 的应用设置 SCM_DO_BUILD_DURING_DEPLOYMENT。
其他部署注意事项
其他注意事项包括本地缓存和高 CPU 或内存。
本地缓存
Azure 应用服务内容存储在 Azure 存储中,作为内容共享持续提供。 但是,某些应用只需要高性能的只读内容存储,就能以高可用性运行。 这些应用受益于本地缓存的使用。 有关详细信息,请参阅 Azure 应用服务本地缓存概述。
注意
对于内容管理站点(例如 WordPress),建议不要使用本地缓存。
为防止故障时间,请始终将本地缓存用于部署槽位。 有关结合使用这些功能的信息,请参阅最佳做法。
高 CPU 或内存
如果应用服务计划占用了超过 90% 的可用 CPU 或内存,则基础虚拟机在处理部署时可能会遇到问题。 发生这种情况时,请临时纵向扩展实例计数以执行部署。 部署完成后,可以将实例计数返回到其以前的值。
有关详细信息,请访问应用服务诊断,了解特定于资源的可操作最佳做法。
在 Azure 门户中导航到 Web 应用。
在左侧导航中选择“诊断并解决问题”,这会打开“应用服务诊断”。
选择“可用性和性能”或浏览其他选项,例如“高 CPU 分析”。
查看应用的当前状态,了解这些最佳做法。
还可以单击此链接,直接打开资源对应的“应用服务诊断”:https://portal.azure.com/?websitesextension_ext=asd.featurePath%3Ddetectors%2FParentAvailabilityAndPerformance#@microsoft.onmicrosoft.com/resource/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{siteName}/troubleshoot。