Azure DevOps Pipeline部署Python函数至Function App无报错但函数未创建
Azure DevOps Pipeline部署Python函数无报错但函数未创建问题排查
问题现象
已创建Azure Function App,通过Azure DevOps Pipeline部署Imperva WAF云哨兵连接器Python函数。流水线运行无报错,但Function App中未生成函数;查看App Files的wwwroot目录,仅存在ImpervaWAFCloudSentinelConn文件夹及其内容,还有一个默认的host.json。
仓库结构
- pipelines/ -- azure-pipelines-src.yaml - src/ -- ImpervaWAFCloudSentinelConn/ --- host.json --- proxies.json --- requirements.txt --- ImpervaWAFCloudSentinelConnector/ ---- __init__.py ---- function.json ---- state_manager.py
原流水线代码
trigger: - none resources: - repo: self variables: azureSubscription: "<my-service-connection>" functionAppName: "<my-function-app-name>" resourceGroupName: "<my-rg>" stages: - stage: Build displayName: Build Function App jobs: - job: Build displayName: Build Code pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' addToPath: true architecture: 'x64' - bash: | pip install --target="./.python_packages/lib/site-packages" -r ./src/ImpervaWAFCloudSentinelConn/requirements.txt - task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(System.DefaultWorkingDirectory)/src/ImpervaWAFCloudSentinelConn' archiveFile: '$(Build.ArtifactStagingDirectory)/build$(Build.BuildId).zip' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/build$(Build.BuildId).zip' artifactName: drop - stage: Deploy displayName: Deploy Code to Function App jobs: - job: Deploy displayName: Deploy Code to Function App pool: DevOps VMSS Agents steps: - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: drop targetPath: $(System.DefaultWorkingDirectory) - task: AzureFunctionApp@2 inputs: connectedServiceNameARM: $(azureSubscription) appType: 'functionAppLinux' appName: $(functionAppName) resourceGroupName: $(resourceGroupName) package: '$(System.DefaultWorkingDirectory)/**/*.zip' runtimeStack: 'PYTHON|3.8' deploymentMethod: 'runFromPackage'
问题原因
- 打包路径错误:ArchiveFiles任务将
ImpervaWAFCloudSentinelConn文件夹本身打包到zip中,导致部署后wwwroot下存在该文件夹,而非直接包含函数所需的核心文件(如host.json、函数子文件夹)。Azure Functions要求函数文件必须放置在wwwroot根目录层级,才能被识别。 - 依赖包未被打包:bash任务将依赖安装到当前目录的
.python_packages,但该目录未被包含进打包的zip文件,导致部署后函数缺少运行依赖。
解决方案
修改Build阶段步骤
调整依赖安装路径和打包规则,确保依赖和函数核心文件都被正确打包到zip的根层级:
- stage: Build displayName: Build Function App jobs: - job: Build displayName: Build Code pool: vmImage: 'ubuntu-latest' steps: - task: UsePythonVersion@0 inputs: versionSpec: '3.8' addToPath: true architecture: 'x64' - bash: | # 切换到函数代码目录,将依赖安装到当前目录的.python_packages cd ./src/ImpervaWAFCloudSentinelConn pip install --target="./.python_packages/lib/site-packages" -r requirements.txt - task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(System.DefaultWorkingDirectory)/src/ImpervaWAFCloudSentinelConn' archiveFile: '$(Build.ArtifactStagingDirectory)/build$(Build.BuildId).zip' includeRootFolder: false # 关键:不包含外层文件夹,直接打包内部所有内容 - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/build$(Build.BuildId).zip' artifactName: drop
验证结果
重新运行流水线后,查看Function App的wwwroot目录,应直接包含host.json、proxies.json、.python_packages以及ImpervaWAFCloudSentinelConnector函数文件夹,此时函数会被自动识别并创建。
内容的提问来源于stack exchange,提问作者Sotiris Sotiriou
相关产品推荐
相关产品推荐

