如何使用 VSTS 发布管理部署到 Azure 资源组
How to deploy to Azure Resource Group using VSTS release management
我是 Visual Studio 团队服务发布管理的新手。我的目标是自动将 ASP.NET MVC 应用程序部署到 Azure 应用服务。
尝试不同的方法,我创建了一个基于证书的服务端点和一个使用服务主体 (SPN) 的服务端点。我的构建定义已经构建了一个 web 部署包,并且发布定义是 linked 并且可以使用这个工件。
成功 1:
使用 Azure Web 应用程序部署 任务部署应用程序已经成功 - 几乎。
缺点 1: 我不明白如何使用此任务指定正确的资源组。这使用基于证书的端点,对于此任务我不能使用其他 (SPN) 端点。
成功 2:
使用 Azure 资源组部署 任务,我能够使用 JSON ARM 模板创建一个新的资源组,其中包含一个 Web 应用程序。这样我就可以指定资源组,解决缺点1
缺点 2: 但现在我不明白如何实际部署已根据我的发布定义 linked 的构建定义的二进制文件。资源组部署创建的 Web 应用程序是空的,后续的 Web 应用程序部署任务似乎无法针对这个新创建的 Web 应用程序,因为它可能不是基于 ARM 的。
我觉得我在这里遗漏了一些明显的东西 - 感谢您的帮助。
更新 1
感谢@bmoore-msft,我使用他link编辑的子资源扩展示例进行了部署。基本上,我的 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"
}
}
]
}
]
但问题是这会将静态 link 放入我的模板中 - 如您所见,我使用 Dropbox 作为临时解决方案。但是我当然不想将我的网络部署包上传到 Dropbox,无论是手动还是自动。我想 link 我的构建定义创建的工件,不幸的是它是动态的,我找不到任何关于如何构建这个 link 的信息。例如,构建 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
所以 link 中有一个数字在变化,这意味着我在模板中引用的 link 必须是动态的,这意味着我需要了解从哪里获取该数字,我不要。
也许还有另一种引用工件上传的方法?
看看这个样本:
该模板资源中的网站有一个名为 "MSDeploy" 的子资源扩展。这将在部署期间将包部署到网站。因此,在执行部署的任务中,您可以创建 Web 应用程序,并在 RM 中的一个部署任务中部署所有包。
对于任何使用 ARM(无证书)的内容,您都需要使用用户或 SPN 身份验证。
更新:暂存包
好的,通常我在这里做的是 "stage" 我在 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 的工作方式相同。另一部分不同的是,文档使用了 Azure 资源组项目中 Visual Studio 使用的 PS 脚本。该脚本没有什么特别之处(它可以像任何其他 PS 脚本一样在任何地方工作)但这就是示例。它不使用 Azure 资源组部署任务,因为该任务无法暂存工件。
基本上你需要做的是:
- 参数化该 URI 属性(请参阅下面的示例和 repo)
- 将 webdeploy 包复制到 Azure(本例中为 PowerShell)
- 部署模板并传入包的uri
例如
"packageUri":“[连接(参数('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。
我是 Visual Studio 团队服务发布管理的新手。我的目标是自动将 ASP.NET MVC 应用程序部署到 Azure 应用服务。
尝试不同的方法,我创建了一个基于证书的服务端点和一个使用服务主体 (SPN) 的服务端点。我的构建定义已经构建了一个 web 部署包,并且发布定义是 linked 并且可以使用这个工件。
成功 1:
使用 Azure Web 应用程序部署 任务部署应用程序已经成功 - 几乎。
缺点 1: 我不明白如何使用此任务指定正确的资源组。这使用基于证书的端点,对于此任务我不能使用其他 (SPN) 端点。
成功 2:
使用 Azure 资源组部署 任务,我能够使用 JSON ARM 模板创建一个新的资源组,其中包含一个 Web 应用程序。这样我就可以指定资源组,解决缺点1
缺点 2: 但现在我不明白如何实际部署已根据我的发布定义 linked 的构建定义的二进制文件。资源组部署创建的 Web 应用程序是空的,后续的 Web 应用程序部署任务似乎无法针对这个新创建的 Web 应用程序,因为它可能不是基于 ARM 的。
我觉得我在这里遗漏了一些明显的东西 - 感谢您的帮助。
更新 1
感谢@bmoore-msft,我使用他link编辑的子资源扩展示例进行了部署。基本上,我的 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"
}
}
]
}
]
但问题是这会将静态 link 放入我的模板中 - 如您所见,我使用 Dropbox 作为临时解决方案。但是我当然不想将我的网络部署包上传到 Dropbox,无论是手动还是自动。我想 link 我的构建定义创建的工件,不幸的是它是动态的,我找不到任何关于如何构建这个 link 的信息。例如,构建 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
所以 link 中有一个数字在变化,这意味着我在模板中引用的 link 必须是动态的,这意味着我需要了解从哪里获取该数字,我不要。
也许还有另一种引用工件上传的方法?
看看这个样本:
该模板资源中的网站有一个名为 "MSDeploy" 的子资源扩展。这将在部署期间将包部署到网站。因此,在执行部署的任务中,您可以创建 Web 应用程序,并在 RM 中的一个部署任务中部署所有包。
对于任何使用 ARM(无证书)的内容,您都需要使用用户或 SPN 身份验证。
更新:暂存包
好的,通常我在这里做的是 "stage" 我在 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 的工作方式相同。另一部分不同的是,文档使用了 Azure 资源组项目中 Visual Studio 使用的 PS 脚本。该脚本没有什么特别之处(它可以像任何其他 PS 脚本一样在任何地方工作)但这就是示例。它不使用 Azure 资源组部署任务,因为该任务无法暂存工件。
基本上你需要做的是:
- 参数化该 URI 属性(请参阅下面的示例和 repo)
- 将 webdeploy 包复制到 Azure(本例中为 PowerShell)
- 部署模板并传入包的uri
例如 "packageUri":“[连接(参数('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。