You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

问题原因

  1. 打包路径错误:ArchiveFiles任务将ImpervaWAFCloudSentinelConn文件夹本身打包到zip中,导致部署后wwwroot下存在该文件夹,而非直接包含函数所需的核心文件(如host.json、函数子文件夹)。Azure Functions要求函数文件必须放置在wwwroot根目录层级,才能被识别。
  2. 依赖包未被打包: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:58:27