我正在尝试使用 Azure DevOps 部署无服务器 Linux 函数应用程序,但遇到了部署失败的问题,除非我先启动函数应用程序(或插槽)。这似乎只发生在 Linux 上,而不是 Windows 函数应用程序中。
这是我的设置:
我在 DevOps Pipeline 中遇到的错误如下:
##[错误]错误:无法同步函数应用“my-func-app”的触发器。错误:未经授权 - 遇到来自扩展 API 的错误(禁止)。 (代码:400)
我有几个问题:
任何见解或建议将不胜感激,谢谢
我已经尝试过Windows和Linux,这在部署Windows函数应用程序时似乎不是问题。
当插槽处于停止状态时,当我尝试在插槽中部署函数应用程序时,我也遇到了相同的错误。
当我将
Storage Account Contributor role
分配给与功能相关的存储中的服务连接服务主体并将 Contibutor
分配给功能应用程序时,它对我有用。
下面给出了对我有用的
.yml
文件。
是我使用服务主体的服务连接名称。DevOps
trigger:
- Dev
variables:
# Function app name
functionAppName: 'pyfunc31aug'
# Agent VM image name
vmImageName: 'ubuntu-latest'
# Working Directory
workingDirectory: '.'
stages:
- stage: Build
displayName: Build stage
jobs:
- job: Build
displayName: Build
pool:
vmImage: $(vmImageName)
steps:
- bash: |
if [ -f extensions.csproj ]
then
dotnet build extensions.csproj --runtime ubuntu.16.04-x64 --output ./bin
fi
workingDirectory: $(workingDirectory)
displayName: 'Build extensions'
- task: UsePythonVersion@0
displayName: 'Use Python 3.11'
inputs:
versionSpec: 3.11 # Functions V2 supports Python 3.6 as of today
- bash: |
pip install --target="./.python_packages/lib/site-packages" -r ./requirements.txt
workingDirectory: $(workingDirectory)
displayName: 'Install application dependencies'
- task: ArchiveFiles@2
displayName: 'Archive files'
inputs:
rootFolderOrFile: '$(workingDirectory)'
includeRootFolder: false
archiveType: zip
archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
replaceExistingArchive: true
- publish: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
artifact: drop
- stage: Deploy
displayName: Deploy stage
dependsOn: Build
condition: succeeded()
jobs:
- deployment: Deploy
displayName: Deploy
environment: 'development'
pool:
vmImage: $(vmImageName)
strategy:
runOnce:
deploy:
steps:
- task: AzureFunctionApp@1
displayName: 'Azure functions app deploy'
inputs:
azureSubscription: 'DevOps'
appType: functionAppLinux
appName: $(functionAppName)
package: '$(Pipeline.Workspace)/drop/$(Build.BuildId).zip'
deployToSlotOrASE: true
slotName: staging
OUTPUT
: