在 Azure DevOps 管道中为 WebApp 创建部署槽

Posted

技术标签:

【中文标题】在 Azure DevOps 管道中为 WebApp 创建部署槽【英文标题】:Create deployment slot for WebApp in Azure DevOps pipeline 【发布时间】:2020-06-27 16:03:20 【问题描述】:

我想从 Azure DevOps 管道执行以下操作:

为现有的 WebApp (staging) 创建新的部署槽 将应用程序部署到新插槽 将staging 插槽与production 交换 删除以前的production,现在删除staging

到目前为止我所拥有的是:

将应用程序部署到新插槽 将staging 插槽与生产交换 删除以前的production,现在删除staging

YAML:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'BizSpark(...)'
    appType: 'webApp'
    WebAppName: 'foo'
    deployToSlotOrASE: true
    ResourceGroupName: 'Default-WestEurope'
    SlotName: 'staging'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/**/*.zip'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: 'BizSpark(..)'
    Action: 'Swap Slots'
    WebAppName: 'foo'
    ResourceGroupName: 'Default-WestEurope'
    SourceSlot: 'staging'

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: 'BizSpark(..)'
    Action: 'Delete Slot'
    WebAppName: 'foo'
    ResourceGroupName: 'Default-WestEurope'
    Slot: 'staging'

但是,AzureAppServiceManage 任务不提供创建部署槽的方法。

如何做到这一点?

【问题讨论】:

通常这是通过在应用部署之前完成的 ARM 模板部署来实现的。 docs.microsoft.com/en-us/azure/azure-resource-manager/templates/… 保留应用服务槽会消耗大量内存。我现在将把同样的东西应用到我的项目中。你能告诉我它到现在是否还能正常工作吗? @ThiệnSinh 我在大约 10 个生产管道中使用这种方法,它对我来说非常有效。 【参考方案1】:

我可以使用 powershell 和 Microsft 托管代理在 azure devops 管道中创建一个 WebbApp 插槽,这是任务:

根据documentation example:

- task: AzureCLI@2
    displayName: Azure CLI   
     inputs:
      azureSubscription: <Name of the Azure Resource Manager service connection>
      scriptType: ps
      scriptLocation: inlineScript
      inlineScript: |
          az --version
          az account show

对于内联脚本,我使用了“az webapp deployment slot create”Azure CLI Command:

az webapp deployment slot create --name
                                 --resource-group
                                 --slot
                                 [--configuration-source]
                                 [--subscription]

这有帮助吗?

【讨论】:

【参考方案2】:

在 Azure DevOps 管道中为 WebApp 创建部署槽

恐怕没有这种开箱即用的方式来为 Azure DevOps 管道中的 WebApp 创建部署槽。

作为任务Azure App Service Management的state,我们可以知道:

Azure App Service Management 任务用于启动/停止/重启 应用服务、交换槽、安装扩展、启用连续 在 Azure 应用程序上监视或启动/停止所有连续的 WebJobs 服务。

它不支持在 Azure devops 管道中为 WebApp 创建部署槽。而且 AFAIK,目前没有其他任务在 Azure devops 管道中支持此功能。

作为这个问题的解决方案,就像 juunas 评论一样,通常这是通过 ARM 模板部署来实现的

我们可以使用以下 ARM 模板为 Azure 应用服务提供部署槽:


    "$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": 
        "siteName": 
            "type": "string"
        ,
        "slotName": 
            "type": "string"
        
    ,
    "resources": [
        
            "apiVersion": "2015-04-01",
            "type": "Microsoft.Web/Sites/Slots",
            "name": "[concat(parameters('siteName'), '/', parameters('slotName'))]",
            "location": "[resourceGroup().location]",
            "properties": ,
            "resources": []
        
    ]

然后,我们可以使用 Azure devops 部署 ARM 模板。

您可以查看this blog 和this blog 了解更多详情。

希望这会有所帮助。

【讨论】:

感谢您的回复!我选择了另一个答案,因为它对我来说似乎更直接一些。无论如何都非常感谢! 我相信这应该是首选答案。资源应该部署在 arm 模板中,而不是管道本身。插槽是资源的一部分。【参考方案3】:

扩展 @Mario Dietner 的答案:https://***.com/a/60772743/343347(cmets 有最大长度)

如果你生活在 powershell 世界但喜欢那个 cli.. 奖金,那就去吧/p>

##REQUIRED VARS
$rg = "myRG"
$app = "myApp"
$slotName = "staging"
$uamiName = "myUserAssignedMI"
##REQUIRED VARS


##SLOT CREATE
$slotConfig = az webapp deployment slot list --resource-group $rg --name $app --query "[?name=='$slotName']" | ConvertFrom-JSON

if($null -eq $slotConfig)
    Write-Host "Slot '$slotName' does not exist for rg/app '$rg/$app'."

    az webapp deployment slot create --name $app --resource-group $rg --slot $slotName --configuration-source $app

    Write-Host "Slot '$slotName' created."
else
    Write-Host "Slot '$($slotConfig.name)' already exists in app '$($slotConfig.repositorySiteName)'."


##MANAGED IDENTITY CREATE (singular... but identity assign supports a space delimited list)
$identityId = az identity list --query "[?name=='$uamiName'].id" -o tsv
$slotIdentity = az webapp identity show --resource-group $rg --name $app --slot $slotName | ConvertFrom-JSON

if($slotIdentity.userAssignedIdentities.psobject.properties.name -eq $identityId)
    Write-Host "Identity '$uamiName' exists for rg/app/slot '$rg/$app/$slotName'."
else
    Write-Host "Identity '$uamiName' does not exist for rg/app/slot '$rg/$app/$slotName'."
    
    az webapp identity assign -g $rg -n $app -s $slotName --identities $identityId

    Write-Host "Identity '$uamiName' added to rg/app/slot '$rg/$app/$slotName'."

【讨论】:

以上是关于在 Azure DevOps 管道中为 WebApp 创建部署槽的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure DevOps Server 2020 中为 C#10 / .NET 6.0 项目创建构建任务

Azure DevOps 中的多个 YAML 构建管道

无法使用服务主体从发布管道访问 Azure Devops Git 存储库

Azure Databricks 的 Azure DevOps 管道

链接 Azure DevOps 管道

MSBuild 在调试配置中工作,但在 azure devops 中发布失败