Azure 函数应用程序在首次部署时间歇性失败:“资源在部署之前应该存在。”

2024-02-10

问题陈述

我有一个类似这样的管道:

  1. 使用 ARM 模板部署新的应用服务
  2. 将 zip 工件部署到该应用程序服务

第一次运行管道时,第二步通常会失败并显示以下消息:

##[error]Error: Resource 'my-function-app' doesn't exist. Resource should exist before deployment.

如果我“重新运行失败的作业”或只是再次运行管道,那么管道就会成功。这对我来说表明这不是我在管道中提供的值的问题;而是问题。但这与第二阶段的时间安排有关。

额外细节

  1. 我只部署到一个位置;北欧
  2. 我正在使用 SKU P1V3 部署到 Linux 应用程序服务计划(尽管我已经注意到迄今为止使用过的每个 SKU 都有这个问题)
  3. 我当前没有使用部署槽
  4. 应用程序服务 ARM 模板在管道中部署如下:
    - task: AzureResourceManagerTemplateDeployment@3
      name: DeployFunctionAppARM
      displayName: 'Deploy Function App ARM'
      inputs:
        deploymentScope: Resource Group
        azureResourceManagerConnection: ${{ variables.serviceConnection }}
        subscriptionId: ${{ variables.azureSubscription }}
        action: 'Create Or Update Resource Group'
        resourceGroupName: ${{ variables.resourceGroup }}
        location: ${{ variables.location }} # North Europe
        templateLocation: 'Linked artifact'
        csmFile: 'BuiltARMTemplates/main.json' # Built from bicep
        overrideParameters: >-
          -parameter1 $(parameter1)
          -parameter2 $(parameter2)
          ...
    
  5. 然后,该工件将像这样部署:
    - task: AzureFunctionApp@1
      displayName: 'Deploy Function App'
      inputs:
        azureSubscription: ${{ variables.azureSubscription }}
        appType: functionAppLinux
        appName: 'my-funciton-app'
        package: $(Pipeline.Workspace)/**/*.zip # Matches only one zip file
    
  6. 工件部署是绝对,100%等待 ARM 部署完成后再继续。

尝试修复

我尝试在 ARM 部署和工件部署之间运行一个脚本,该脚本使用 Azure CLI 来验证应用服务的状态:

  1. 使用 ARM 模板部署新的应用服务
  2. 调用 Azure CLI 以确保应用程序服务已启动并正在运行
  3. 将 zip 工件部署到该应用程序服务
sub="${{ parameters.subscriptionId }}"
rg="${{ parameters.resourceGroup }}"
fn="${{ parameters.functionAppName }}"
expected="Running"
attempts=30 # Thirty Attempts 
delaySeconds=10 # Gives about 5 minutes before timeout

for attempt in $(seq $attempts)
do
    # Check if function app is "Running"
    if [[ "$(az resource show --ids /subscriptions/$sub/resourceGroups/$rg/providers/Microsoft.Web/sites/$fn | jq -r ".properties.state")" = "$expected"* ]]
    then
        echo "$fn is \"$expected\""
        break # If the resource is running, then break the loop
    fi

    # Otherwise, wait before trying again
    echo "[$attempt/$attempts] $fn is not currently \"$expected\" waiting for $delaySeconds seconds..."
    sleep $delaySeconds
done

有时此脚本检测到应用程序服务尚未配置,因此我可以延迟工件部署。

这在一定程度上降低了故障率,但并没有完全降低。通常,Azure CLI 能够发现应用程序服务存在并且正在运行,但在尝试项目部署时我仍然收到上述错误消息。

我的问题

有谁知道如何检测应用程序服务何时已配置但尚未准备好进行部署?

Note: 我还没有发布完整的管道或任何 ARM 模板,因为它们非常冗长(这是一个很大的管道!),而且我不确定它们对于我提出的问题是否非常重要。也就是说,如果这些细节对当前的问题至关重要的话,我很乐意提供更多细节!


  • 修改 Azure Pipelines 中的任务 Azure Web App Deploy
  • Add the properties:
    • 部署到插槽或ASE:true
    • 资源组名称:“资源组名称”
    • 插槽名称:生产

这是一个已知问题,如下所述:https://github.com/microsoft/azure-pipelines-tasks/issues/15532 https://github.com/microsoft/azure-pipelines-tasks/issues/15532

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure 函数应用程序在首次部署时间歇性失败:“资源在部署之前应该存在。” 的相关文章

随机推荐