如何通过CI/CD流水线将Azure Function部署到已创建的Function App中
配置方案
- 第一步:在基础设施部署流水线的ARM模板中添加输出参数,明确输出后续部署需要的核心信息,示例ARM配置:
"outputs": { "functionAppName": { "type": "string", "value": "[variables('functionAppName')]" }, "functionResourceGroup": { "type": "string", "value": "[resourceGroup().name]" }, "targetSubscriptionId": { "type": "string", "value": "[subscription().subscriptionId]" } }
- 第二步:在基础设施部署流水线的yml中,将ARM输出的参数注册为流水线输出变量,示例Azure DevOps配置:
- task: AzureResourceManagerTemplateDeployment@3 name: deployInfra inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: '你的Azure服务连接名' subscriptionId: '$(subscriptionId)' resourceGroupName: '$(resourceGroupName)' location: '$(location)' csmFile: '你的ARM模板路径' overrideParameters: '-functionAppName $(functionAppNameParam)' deploymentOutputs: 'armOutputs' - script: | echo "##vso[task.setvariable variable=deployedFunctionAppName;isOutput=true]$(armOutputs.functionAppName.value)" echo "##vso[task.setvariable variable=deployedResourceGroup;isOutput=true]$(armOutputs.functionResourceGroup.value)" name: setInfraOutputs
- 第三步:打通两套流水线的参数传递
- 如果你用单流水线分阶段实现:将基础设施部署和Function代码部署拆分为同一流水线的两个Stage,在Function部署Stage中直接引用前一Stage的输出变量即可
- 如果你保留两套独立流水线:给Function部署流水线添加基础设施流水线的触发依赖,将基础设施流水线的输出变量作为Function部署流水线的入参
- 第四步:修改Function部署任务的配置,将原硬编码的
appName、resourceGroupName参数替换为传递过来的变量,示例Azure Function部署任务配置:
- task: AzureFunctionApp@1 inputs: azureSubscription: '和基础设施流水线相同的Azure服务连接名' appType: 'functionAppLinux' appName: '$(deployedFunctionAppName)' resourceGroupName: '$(deployedResourceGroup)' package: '$(System.DefaultWorkingDirectory)/你的Function构建包路径/*.zip' deploymentMethod: 'zipDeploy'
- 第五步:可选稳定性校验
如果部署时出现Function App不存在的报错,在Function部署任务前添加1~2分钟的等待任务,避免基础设施部署完成后Function App未完全初始化导致的部署失败
确认ARM模板中已经为Linux Function App配置了WEBSITE_RUN_FROM_PACKAGE = 1的应用设置,适配zip部署模式
内容的提问来源于stack exchange,提问作者abautista
相关产品推荐
相关产品推荐

