如何使用VSTS版本管理部署到Azure资源组

时间:2016-02-17 13:47:49

标签: asp.net azure deployment ms-release-management azure-resource-manager

我是Visual Studio Team Services Release Management的新手。我的目标是自动将ASP.NET MVC应用程序部署到Azure App Service。

尝试不同的方法,我创建了一个基于证书的服务端点和一个使用服务主体(SPN)的服务端点。我的构建定义已经构建了一个Web部署包,并且发布定义与之相关联,并且可以使用此工件。

成功1: 使用 Azure Web App部署任务部署应用程序已经成功 - 几乎 缺点1:我不明白如何使用此任务指定正确的资源组。这使用基于证书的端点,对于此任务,我不能使用其他(SPN)端点。

成功2: 使用 Azure资源组部署任务,我能够使用JSON ARM模板创建一个包含Web应用程序的新资源组。这样我就可以指定资源组,寻址 Shortcoming 1
缺点2:但是现在我不明白我如何实际部署已经链接到我的发布定义的构建定义的二进制文件。由资源组部署创建的Web应用程序为空,后续Web应用程序部署任务似乎无法定位此新创建的Web应用程序,因为它可能不是基于ARM的。

我觉得我在这里遗漏了一些明显的东西 - 感谢任何帮助。

更新1

感谢@ bmoore-msft,我使用他链接到的子资源扩展示例进行了部署。基本上,我的ARM模板的相应片段现在看起来像这样:

"resources": [
{
    "apiVersion": "2015-08-01",
    "type": "Microsoft.Web/sites",
    "name": "[variables('fullEnvName')]",
    "location": "[parameters('siteLocation')]",
    "properties": {
        "name": "[variables('fullEnvName')]"
    },
    "resources": [
        {
            "apiVersion": "2014-06-01",
            "name": "MSDeploy",
            "type": "Extensions",
            "dependsOn": [
                "[concat('Microsoft.Web/Sites/', variables('fullEnvName'))]"
            ],
            "properties": {
                "packageUri": "https://dl.dropboxusercontent.com/u/<myId>/<WebDeploymentPackage>.zip",
                "dbType": "None",
                "connectionString": "",
                "mode": "Complete"
            }
        }
    ]
  }
]

但问题是这会在我的模板中放置一个静态链接 - 正如您所看到的,我使用Dropbox作为临时解决方案。但当然我不想手动或自动将我的Web部署包上传到Dropbox。我想链接到我的构建定义创建的工件,遗憾的是它是动态的,我找不到有关如何构建此链接的​​任何信息。例如,构建1位于以下路径
https://<tenant>.visualstudio.com/DefaultCollection/_apis/resources/Containers/800850?itemPath=<PathToWebDeploymentPackage>.zip
虽然构建2在这里可用 https://<tenant>.visualstudio.com/DefaultCollection/_apis/resources/Containers/801968?itemPath=<PathToWebDeploymentPackage>.zip

因此链接内部有一个数字更改,这意味着我在模板中引用的链接必须是动态的,这意味着我需要了解从哪里获取该数字,我不知道。

也许还有另一种引用工件上传的方法?

1 个答案:

答案 0 :(得分:2)

看一下这个样本:

https://github.com/Azure/azure-quickstart-templates/blob/75d0588fbd2702288bd35ed24cb00e43dcf980c2/wordpress-mysql-replication/website.json

该模板资源中的网站具有名为“MSDeploy”的子资源扩展。这将在部署期间将包部署到网站。因此,在执行部署的任务中,您可以创建Web应用程序,并将所有程序包部署在RM中的一个部署任务中。

对于使用ARM(无证书)的任何内容,您将需要使用用户或SPN authn。

更新:暂存套餐

好的,通常我在这里做的是“暂存”我在Azure存储中的工件(用sasToken保护)。您在模板中提供的uri必须可供AzureRM访问。您的VSTS构建输出可能是安全的,因此即使您可以以交互方式访问它,AzureRM也不能。

基本上你需要的是RM(或构建)中的任务1)将工件复制到Azure(安全),然后2)告诉下一个任务这些工件的位置......这是一个选项:

https://azure.microsoft.com/en-us/documentation/articles/vs-azure-tools-resource-groups-ci-in-vsts/

此文档使用的是VSTS版本,但RM的工作方式相同。另一个不同的部分是doc使用Azure资源组项目中Visual Studio使用的PS脚本。这个脚本没有什么特别之处(它可以像任何其他PS脚本一样在任何地方工作),但这就是示例。它不使用Azure资源组部署任务,因为该任务无法执行工件的暂存。

基本上你需要做的是:

  1. 参数化该URI属性(请参阅下面的示例&amp; repo)
  2. 将webdeploy包复制到Azure(本例中为PowerShell)
  3. 部署模板并传入包的uri
  4. e.g。     “packageUri”:“[concat(parameters('artifactsLocation'),webdeploy.zip,parameters('sasToken')]”

    该文档向您展示了VS是如何做到的,并且您应该能够针对您的场景进行调整。如果您使用此路由,则可以使用Azure PowerShell任务,不再需要Azure资源组部署任务。

    另一种方法是使用Azure文件复制任务,但当前该任务不输出URI或sasToken,因此您无法将其传递到部署任务(队列中有一个PR来实现工作)。

    如果您无法访问Visual Studio,则另一个选项是此repo:

    https://github.com/Azure/azure-xplat-arm-tooling/tree/master/PowerShell

    它具有VS使用的相同PS脚本,模板显示参数化URL的示例(对于此示例中的dsc.zip文件),但对于msdeploy的工作方式相同。

    你实际上已经遇到了一个比较复杂的场景,而且目前还没有真正做好,但是当它工作时它非常酷。 LMK如果您需要更多帮助。