多个项目的Azure持续部署

时间:2015-08-15 17:02:42

标签: azure azure-web-sites azure-devops continuous-deployment tfvc

我创建了一个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”发布目标(在填写所有设置之后)将发布配置文件添加到我的项目中,并允许我按照我想要的方式手动部署它们。 / p>

不幸的是,似乎无法重新上传这些发布配置文件,以便可以在CD版本中使用它们。我已将它们检查到源代码控制中,我只需要知道如何使用CD构建来使用它们。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

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

  

部署设置的路径:Web应用程序的.pubxml文件的路径,相对于repo的根文件夹。忽略了云服务。

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

这导致我this question and answer,这表明Azure / TFVC持续部署仅使用MSBuild的普通Web Deploy参数。在Visual Studio Online中查看我的构建的诊断日志证明了这一点;以下是相关论点:

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

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

enter image description here

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

  

Web部署任务失败。 (连接到远程计算机   (" [mysitename] .scm.azurewebsites.net")使用Web管理服务,   但无法授权。

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

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

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

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

所以我采用的解决方案略胜一筹;这是我们在新西兰所描述的" huckery"。

基本上我在InvokeMethodInitializeContinuousDeployment活动之间添加了RunMSBuild版本活动。此活动的参数如下:

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=""附加到命令行,那么如果你只需要将{{1}}附加到命令行,就可以稍微好一点了,但是这只会将属性设置为一个空字符串而你会得到一个错误:

  

" ConcatFullServiceUrlWithSiteName"任务没有给出一个值   必需参数" SiteAppName"

就像我说的那样,非常讨厌,但它是一个解决方案,允许您通过对默认设置进行少量更改,将多个Web项目连续部署到Azure。

答案 1 :(得分:0)

您可以使用Kudu覆盖Azure CLI Tools中的部署引擎。运行azure site deploymentscript command并传入其中一个项目-s <solutionFile> --aspWAP <projectFilePath>的参数。

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

deployment hooks中提供了project kudu wiki的更多信息。

修改

您可以使用应用设置COMMAND向您的网站添加部署脚本。