如何通过Azure YAML Pipeline部署多函数至同一Function App且不覆盖
解决Azure Function App多独立函数部署覆盖问题
问题根源
你当前使用的AzureFunctionApp@1任务默认采用全量部署模式,加上Linux Function App默认启用的「Run From Package」机制,每次部署会将Function App的现有内容完全替换为当前流水线的artifact,导致B函数部署时覆盖A函数。
解决方案步骤
1. 关闭Run From Package模式(必须)
Linux Function App默认启用Run From Package,此模式下应用从单一只读zip包加载,无法增量更新。需先关闭:
- 进入Azure Portal -> 目标Function App -> 「配置」-> 「应用设置」
- 添加或修改
WEBSITE_RUN_FROM_PACKAGE参数,设置值为0 - 保存配置,重启Function App
2. 修改部署流水线的YAML配置
将原AzureFunctionApp@1任务的部署方式改为zipDeploy,并添加clean: false参数,确保部署时不清理现有文件:
#Deploy to DEV - stage: DEV displayName: Deploy to DEV dependsOn: Build variables: - group: my-dev-variables condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/dev')) jobs: - job: Deploy steps: #Download artifact to make it available to this stage - task: DownloadPipelineArtifact@2 inputs: source: 'current' path: '$(Pipeline.Workspace)' #Deploy - 增量部署,保留现有函数 - task: AzureFunctionApp@1 displayName: Deploy Linux function app (incremental) inputs: azureSubscription: $(azureRmConnection.Id) appType: 'functionAppLinux' appName: $(functionAppName) package: '$(Pipeline.Workspace)/**/*.zip' deploymentMethod: zipDeploy # 指定用zip部署方式 clean: false # 关键:不清理现有部署内容
3. 确保每个函数的打包内容正确
每个代码库的构建流程仅需打包自身函数的文件(如FunctionA/文件夹、必要的共享配置如host.json),无需包含整个Function App的结构。若两个函数有共享配置(如host.json),需确保两个流水线的配置内容一致,避免冲突。
备选方案:使用Azure Functions Core Tools部署
若偏好命令行方式,可替换AzureFunctionApp@1任务为脚本任务,通过Core Tools实现增量部署:
- script: | func azure functionapp publish $(functionAppName) --no-build --no-clean --package $(Pipeline.Workspace)/**/*.zip displayName: Deploy Linux function app incrementally via Core Tools env: AZURE_SUBSCRIPTION_ID: $(azureRmConnection.Id)
内容的提问来源于stack exchange,提问作者FaCoffee
相关产品推荐
相关产品推荐

