多个项目的 Azure 持续部署

Azure continuous deployment for multiple projects

我创建了一个 Azure 网站并将其连接到 Visual Studio Online,这会自动设置持续部署构建(根据 this page)。

最初这适用于一个项目的解决方案,但现在我添加了一个 Web API 项目作为后端。它被命名为 the two projects alphabetically 中的第一个,因此现在它是唯一在签入文件时构建和部署的项目。这引出了我的问题:

如何修改默认的持续部署构建以部署这两个应用程序?

我敢肯定,这一定是对构建模板或参数或构建所使用的发布配置文件的相当简单的更改。唯一的问题是我不知道:A) 如何更改默认 TfvcContinuousDeploymentTemplate.12.xaml 构建模板中的那些设置,以及 B) 如何修改持续部署构建中使用的发布配置文件。

我已经在 Visual Studio 中手动发布了这两个项目,并按照 this answer 中的说明将它们部署到正确的位置。我右键单击每个项目,单击发布,然后选择 "Microsoft Azure Web Apps" 发布目标(在填写所有设置后)将发布配置文件添加到我的项目中,并允许我按照我的需要手动部署它们。

不幸的是,似乎没有办法重新上传那些发布配置文件,以便它们可以在 CD 构建中使用。我已经将它们签入了源代码管理,我只需要知道如何获取 CD 版本以使用它们。我该怎么做?

您可以覆盖 Kudu by using the Azure CLI Tools. Running the azure site deploymentscript command 中的部署引擎并传入您的项目之一的参数 -s <solutionFile> --aspWAP <projectFilePath>

这将创建一个 .deployment 文件和一个 deploy.cmd(或 deploy.sh,如果您传递 -t bash 参数)修改 deploy.cmd 以添加 build/deploy 第二个项目的步骤。

有关 deployment hooks is available in the project kudu wiki 的更多信息。

编辑

您可以使用应用程序设置 COMMAND 将部署脚本添加到您的站点。

再次阅读我问题中的 first link 后,我注意到您可以编辑构建定义(或模板)以指向您要使用的发布配置文件:

Path to Deployment Settings: The path to your .pubxml file for a web app, relative to the root folder of the repo. Ignored for cloud services.

不幸的是,这两者都不起作用,并且只允许您指定一个发布配置文件。据推测,即使指定此参数有效,构建仍然只会按字母顺序部署第一个应用程序。

不过,这让我想到了 this question and answer,这表明 Azure/TFVC 持续部署只需使用 MSBuild 的普通 Web 部署参数即可工作。查看我在 Visual Studio Online 中构建的诊断日志证明是这种情况;以下是相关论点:

C:\Program Files (x86)\MSBuild.0\bin\amd64\msbuild.exe /p:DeployOnBuild=true /p:CreatePackageOnPublish=true /p:DeployIisAppPath=mysitename

因此,根据该问题,要使用特定的发布配置文件,您只需在构建定义中设置额外的必要 MSBuild 参数即可:

每个项目都需要有一个名为 "publishprofilename.pubxml" 的发布配置文件,在本例中,已签入源代码管理。我发现不需要用户名(这是您的站点名称,前面有一个美元符号),但不幸的是密码字符串是必需的。如果你不包含它,你会在构建中得到这样的错误:

Web deployment task failed. (Connected to the remote computer ("[mysitename].scm.azurewebsites.net") using the Web Management Service, but could not authorize.

我不需要其他参数,但必须包含密码似乎并不理想。不使用发布配置文件的默认部署设置必须以某种方式使用该密码进行授权,但我不知道如何进行。


所以在进行此更改后,我导航到 [mysitename].azurewebsites.net,看起来仍然只有 Web API 项目正在部署。但是,通过转到该站点的控制台并输入 dir D:\home\site\wwwroot,我可以看到这两个项目实际上都在部署中。只是这两个项目都被部署到站点的根目录,位于 D:\home\site\wwwrootDeployIisAppPath 设置在每个发布配置文件中都不同,但这些值将被忽略。这是因为 MSBuild 的 /p:DeployIisAppPath=mysitename 参数(如上所述)覆盖了发布配置文件 *.pubxml 文件中的任何 PropertyGroup 设置,如 this blog post.

中所述

我发现 Azure/TFVC 的持续部署过程通过在 TfvcContinuousDeploymentTemplate.12.xaml 构建模板中有一个 InitializeContinuousDeployment 构建 activity 来工作,就在之前RunMSBuild activity。这会获取您在生成定义中指定的 MSbuild 参数,并将部署到 Azure 所需的参数附加到它们。不幸的是,这主要是硬编码的,这意味着它总是为解决方案中的所有 Web 项目指定一个部署路径。您无法单独使用发布配置文件将每个 Web 应用程序部署到不同的位置。

因此,一种解决方法是向每个项目添加类似 BeforeBuild MSBuild 目标的内容,以覆盖 DeployIisAppPath 的命令行值。这样做的问题是,在发布配置文件中指定的路径以及在发布向导中看到的路径将不再是实际用于部署的路径。

所以我采用的解决方案稍微好一些;这就是我们在新西兰描述的 "huckery".

基本上我在 InitializeContinuousDeploymentRunMSBuild 活动之间添加了一个 InvokeMethod build activity。这个activity的参数如下:

DisplayName:
Configure build for using publish profiles (removes DeployIisAppPath MSBuild parameter)

GenericTypeArguments:
System.String

MethodName:
SetValue

TargetObject:
AdvancedBuildSettings

Parameters:
Direction:      Type:       Value
In              String      "MSBuildArguments"
In              String      String.Join(" ", AdvancedBuildSettings.GetValue(Of String)("MSBuildArguments", String.Empty).Split(New String() {" "}, StringSplitOptions.RemoveEmptyEntries).Where(Function(s) Not s.StartsWith("/p:DeployIisAppPath=")))

这样做是从 MSBuild 命令行参数列表中完全删除 DeployIisAppPath 参数,这样它就不会覆盖发布配置文件中的 属性 参数。如果你可以将 /p:DeployIisAppPath="" 附加到命令行,而不是乱七八糟地拆分和连接字符串,它会稍微好一点,但这只是将 属性 设置为一个空字符串,你会得到一个错误:

"ConcatFullServiceUrlWithSiteName" task was not given a value for the required parameter "SiteAppName"

所以就像我说的,非常胡闹,但它是一种解决方案,允许您将多个 Web 项目持续部署到 Azure,而对默认设置的更改最少。