问题陈述
我有一个类似这样的管道:
- 使用 ARM 模板部署新的应用服务
- 将 zip 工件部署到该应用程序服务
第一次运行管道时,第二步通常会失败并显示以下消息:
##[error]Error: Resource 'my-function-app' doesn't exist. Resource should exist before deployment.
如果我“重新运行失败的作业”或只是再次运行管道,那么管道就会成功。这对我来说表明这不是我在管道中提供的值的问题;而是问题。但这与第二阶段的时间安排有关。
额外细节
- 我只部署到一个位置;北欧
- 我正在使用 SKU P1V3 部署到 Linux 应用程序服务计划(尽管我已经注意到迄今为止使用过的每个 SKU 都有这个问题)
- 我当前没有使用部署槽
- 应用程序服务 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)
...
- 然后,该工件将像这样部署:
- 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
- 工件部署是绝对,100%等待 ARM 部署完成后再继续。
尝试修复
我尝试在 ARM 部署和工件部署之间运行一个脚本,该脚本使用 Azure CLI 来验证应用服务的状态:
- 使用 ARM 模板部署新的应用服务
- 调用 Azure CLI 以确保应用程序服务已启动并正在运行
- 将 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 模板,因为它们非常冗长(这是一个很大的管道!),而且我不确定它们对于我提出的问题是否非常重要。也就是说,如果这些细节对当前的问题至关重要的话,我很乐意提供更多细节!