从本地 Git 部署到 Azure 应用服务

本操作方法指南说明如何将代码从本地计算机上的 Git 存储库部署到 Azure 应用服务

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

先决条件

按照本操作方法指南中的步骤操作:

  • 安装 Git
  • 使用想要部署的代码维护本地 Git 存储库。

要遵循示例存储库操作,请在本地终端窗口运行以下命令:

git clone https://github.com/Azure-Samples/nodejs-docs-hello-world.git

准备存储库

若要从应用服务 Kudu 生成服务器获取自动生成,请确保项目中存储库根路径具有正确的文件。

运行时 根目录文件
ASP.NET(仅限 Windows) *.sln*.csprojdefault.aspx
ASP.NET Core *.sln*.csproj
PHP index.php
Ruby(仅限 Linux) Gemfile
Node.js server.js、app.js 或具有启动脚本的 package.json
Python(仅限 Windows) *.pyrequirements.txtruntime.txt
HTML default.htm、default.html、default.asp、index.htm、index.html 或 iisstart.htm
Web 作业 App_Data/jobs/continuous(适用于连续的 WebJobs)或 App_Data/jobs/triggered(适用于触发的 WebJobs)下的 <job_name>/run.<extension>。 有关详细信息,请参阅 Kudu WebJobs 文档
函数 请参阅 Azure Functions 的连续部署

要自定义部署,可以在存储库根路径中添加 .deployment 文件。 有关详细信息,请参阅自定义部署自定义部署脚本

Note

如果在 Visual Studio 中进行开发,让 Visual Studio 创建存储库。 该项目可立即通过 Git 进行部署。

通过 Kudu 生成从本地 Git 部署

使用 Kudu 生成服务器为应用启用本地 Git 部署的最简单方法是使用命令外壳。

创建部署用户

使用 az webapp deployment user set 命令创建部署凭据。

在 Web 应用中进行 FTP 和本地 Git 部署时需要一个部署用户。 用户名和密码都为帐户级别。 它们与 Azure 订阅凭据不同。

在以下命令中,将 <user-name> 和 <password> 替换为新的用户名和密码。 用户名必须唯一。 密码长度必须至少为 8 个字符,其中包含以下 3 种元素中的两种:字母、数字、符号。

az webapp deployment user set --user-name <username> --password <password>

如果收到 'Conflict'. Details: 409 错误,请更改用户名。 如果收到 'Bad Request'. Details: 400 错误,请使用更强的密码。

只创建此部署用户一次;可对所有 Azure 部署使用此用户。

Note

记录用户名和密码。 稍后需要使用它们来部署 Web 应用。

使用 Kudu 启用本地 Git

若要使用 Kudu 生成服务器为应用启用本地 Git 部署,请运行 az webapp deployment source config-local-git

az webapp deployment source config-local-git --name <app_name> --resource-group <group_name>

要创建启用 Git 的应用,请结合 --deployment-local-git 参数运行 az webapp create

az webapp create --name <app_name> --resource-group <group_name> --plan <plan_name> --deployment-local-git

az webapp create 命令的输出应如下所示:

Local git is configured with url of 'https://<username>@<app_name>.scm.chinacloudsites.cn/<app_name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app_name>.chinacloudsites.cn",
  "deploymentLocalGitUrl": "https://<username>@<app_name>.scm.chinacloudsites.cn/<app_name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

部署项目

回到本地终端窗口,将 Azure 远程功能添加到本地 Git 存储库。 使用从启用应用的 Git中获取的 Git 远程 URL 替换 <url>。

git remote add azure <url>

使用以下命令推送到 Azure 远程功能以部署应用。 提示输入密码时,请确保输入在配置部署用户中创建的密码,而不是用于登录到 Azure 门户的密码。

```bash  
git push azure master
```

在输出中可能会看到特定于运行时的自动化,如 MSBuild for ASP.NET、npm install for Node.js 和 pip install for Python。

浏览到应用以验证内容已部署。

部署期间我的应用会发生什么情况?

所有官方支持的部署方法均具有一个共同点:它们会更改应用的 /site/home/wwwroot 文件夹中的文件。 这些文件与生产中运行的文件相同。 因此,部署可能由于存在锁定文件而失败,或者由于并非所有文件同时更新,生产中的应用在部署期间可能出现不可预测的行为。 可通过多种不同方式避免这些问题:

排查 Kudu 部署问题

以下是使用 Git 发布到 Azure 中的应用服务应用时遇到的常见错误或问题:


症状Unable to access '[siteURL]': Failed to connect to [scmAddress]

原因:如果应用无法启动和运行,则会发生该错误。

解决方法:在 Azure 门户中启动应用。 如果 Web 应用停止时,Git 部署将不可用。


症状Couldn't resolve host 'hostname'

原因:如果创建“azure”远程网站时输入的地址信息不正确,则会发生该错误。

解决方法:使用 git remote -v 命令列出所有远程网站以及关联的 URL。 确认“azure”远程网站的 URL 正确。 如果需要,请删除此远程网站并使用正确的 URL 重新创建它。


症状No refs in common and none specified; doing nothing. Perhaps you should specify a branch such as 'master'.

原因:如果在 git push 期间未指定分支,或者未在 .gitconfig 中设置 push.default 值,则会出现此错误。

解决方法:再次运行 git push,指定主分支。 例如:

git push azure master

症状src refspec [branchname] does not match any.

原因:如果尝试推送到“azure”远程网站上主分支之外的分支,则会发生该错误。

解决方法:再次运行 git push,指定主分支。 例如:

git push azure master

症状RPC failed; result=22, HTTP code = 5xx.

原因:如果尝试通过 HTTPS 推送大型 Git 存储库,则可能出现此错误。

解决方法:在本地计算机上更改 Git 配置,以增大 postBuffer

git config --global http.postBuffer 524288000

症状Error - Changes committed to remote repository but your web app not updated.

原因:如果部署 Node.js 应用时使用的 package.json 文件指定了其他所需模块,则会发生该错误。

解决方法:应在发生此错误之前记录包含“npm ERR!” 的其他消息,这些消息可提供有关失败的其他上下文。 以下是该错误的已知原因和相应的“npm ERR!” 消息:

  • package.json 文件格式不正确:npm ERR! 无法读取依赖项。
  • 没有 Windows 的二进制分发的本机模块

    • npm ERR! \cmd "/c" "node-gyp rebuild"\ failed with 1

      OR

    • npm ERR! [modulename@version] preinstall: \make || gmake\

其他资源