gpt4 book ai didi

Azure函数应用程序在首次部署时间歇性失败: "Resource should exist before deployment."

转载 作者:行者123 更新时间:2023-12-02 22:59:15 26 4
gpt4 key购买 nike

问题陈述

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

  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 能够发现应用服务存在并且正在运行,但在尝试项目部署时我仍然收到上面的错误消息。

我的问题

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

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

最佳答案

  • 修改 Azure Pipelines 中的 Azure Web App 部署任务
  • 添加属性:
    • deployToSlotOrASE:true
    • resourceGroupName:“资源组名称”
    • slotName:生产

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

关于Azure函数应用程序在首次部署时间歇性失败: "Resource should exist before deployment.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69567979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com