我是 Visual Studio Team Services 发布管理的新手。我的目标是自动将 ASP.NET MVC 应用程序部署到 Azure 应用服务。
尝试不同的方法,我创建了一个基于证书且使用服务主体 (SPN) 的服务端点。我的构建定义已经构建了一个 Web 部署包,并且发布定义与其链接并且可以使用此工件。
成功1:
使用Azure Web App 部署任务部署应用程序已经成功 - 几乎成功。
缺点 1:我不明白如何使用此任务指定正确的资源组。这使用基于证书的端点,对于此任务,我无法使用其他 (SPN) 端点。
成功2:
通过使用 Azure 资源组部署任务,我能够使用 JSON ARM 模板创建一个包含 Web 应用程序的新资源组。这样我就可以指定资源组,解决缺点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
因此,链接内部有一个数字发生变化,这意味着我在模板中引用的链接必须是动态的,这意味着我需要了解从哪里获取该数字,但我不知道。
也许还有另一种方式来引用工件上传?
最佳答案
看一下这个示例:
该模板资源中的网站有一个名为“MSDeploy”的子资源扩展。这将在部署期间将包部署到网站。因此,在执行部署的任务中,您可以创建 Web 应用程序,并将包全部部署在 RM 的一个部署任务中。
对于使用 ARM 的任何内容,您都需要使用用户或 SPN 身份验证(无证书)。
更新:暂存包
好的,通常我在这里所做的是将我的工件“暂存”在 Azure 存储中(使用 sasToken 进行保护)。 AzureRM 必须可以访问您在模板中提供的 uri。您的 VSTS 构建输出可能是安全的,因此即使您可以交互式访问它,AzureRM 也不能。
本质上,您需要的是 RM(或构建)中的一个任务,该任务将 1) 将工件复制到 Azure(安全地),然后 2) 告诉下一个任务这些工件的位置...这是一个选项:
https://azure.microsoft.com/en-us/documentation/articles/vs-azure-tools-resource-groups-ci-in-vsts/
本文档使用 VSTS 构建,但 RM 的工作方式相同。另一部分不同的是该文档使用的是 Azure 资源组项目中 Visual Studio 使用的 PS 脚本。该脚本没有什么特别之处(它可以像任何其他 PS 脚本一样在任何地方工作),但这就是示例。它不使用 Azure 资源组部署任务,因为该任务无法暂存项目。
基本上你需要做的是:
- 参数化该 URI 属性(请参阅下面的示例和存储库)
- 将 webdeploy 包复制到 Azure(本例中为 PowerShell)
- 部署模板并传入包的 uri
例如 “packageUri”:“[concat(参数('artifactsLocation'),webdeploy.zip,参数('sasToken')]”
该文档向您展示了 VS 如何执行此操作,您应该能够根据您的场景进行调整。如果选择此路线,您将使用 Azure PowerShell 任务,而不再需要 Azure 资源组部署任务。
执行此操作的另一种方法是使用 Azure 文件复制任务,但当前该任务不输出 URI 或 sasToken,因此您无法将其传递到部署任务(队列中有一个 PR 可以使该任务工作)。
如果您无法访问 Visual Studio,另一个选择是此存储库:
https://github.com/Azure/azure-xplat-arm-tooling/tree/master/PowerShell
它具有与 VS 使用的相同的 PS 脚本,并且模板显示了参数化 URL 的示例(本示例中为 dsc.zip 文件),但对于 msdeploy 的工作方式相同。
您实际上已经遇到了一种更复杂的场景,目前还没有很好地记录,但是当它起作用时非常酷。如果您需要更多帮助,请LMK。
关于asp.net - 如何使用 VSTS 发布管理部署到 Azure 资源组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35458493/