【问题标题】:Azure continuous deployment for multiple projects多个项目的 Azure 持续部署
【发布时间】:2015-08-15 17:02:41
【问题描述】:

我创建了一个 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 构建以使用它们。我该怎么做?

【问题讨论】:

    标签: azure azure-web-app-service azure-devops continuous-deployment tfvc


    【解决方案1】:

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

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

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

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

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

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

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

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

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


    因此,在进行此更改后,我导航到 [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 构建活动来工作,紧接在 RunMSBuild 活动之前。这将获取您在生成定义中指定的 MSbuild 参数,并将部署到 Azure 所需的参数附加到它们。不幸的是,这主要是硬编码的,这意味着它总是为解决方案中的所有 Web 项目指定一个部署路径。您不能单独使用发布配置文件将每个 Web 应用部署到不同的位置。

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

    所以我采用的解决方案稍微好一点;这就是我们在新西兰所说的“胡扯”。

    基本上我在InitializeContinuousDeploymentRunMSBuild 活动之间添加了一个InvokeMethod 构建活动。该活动的论据如下:

    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”任务没有为 必需参数“SiteAppName”

    所以就像我说的那样,这很荒唐,但它是一种解决方案,允许您将多个 Web 项目持续部署到 Azure,只需对默认设置进行最少的更改。

    【讨论】:

      【解决方案2】:

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

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

      有关deployment hooks 的更多信息,请访问project kudu wiki

      编辑

      您可以使用 App Setting COMMAND 将部署脚本添加到您的站点。

      【讨论】:

      • 谢谢,但是当我的源代码被检入 TFVC 而不是 git 时,这是否有效?
      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多