首页 文章

Azure为多个项目持续部署

提问于
浏览
5

我创建了一个Azure Web站点并将其连接到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构建来使用它们 . 我怎样才能做到这一点?

2 回答

  • 3

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

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

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

    这导致我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部署任务失败 . (使用Web管理服务连接到远程计算机(“[mysitename] .scm.azurewebsites.net”),但无法授权 .

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


    因此,在进行此更改后,我导航到[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的持续部署过程通过在 RunMSBuild 活动之前的TfvcContinuousDeploymentTemplate.12.xaml构建模板中具有 InitializeContinuousDeployment 构建活动来工作 . 这将获取您在构建定义中指定的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 .

  • 0

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

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

    有关deployment hooks的更多信息,请参阅project kudu wiki .

    EDIT

    您可以使用App Setting COMMAND 向站点添加部署脚本 .

相关问题