使用GoLang部署Azure Function 流水线部署成功后门户无函数问题
1. 打包路径配置错误
你当前的go build命令将产物输出到$(System.DefaultWorkingDirectory),但后续ArchiveFiles@2任务却从$(Build.BinariesDirectory)路径读取文件打包,导致最终的部署zip包中没有包含编译好的Go二进制、host.json、各函数的function.json等必要文件,Azure Function服务无法识别到有效函数定义。
修复方式:要么修改go build的输出路径到$(Build.BinariesDirectory),要么修改ArchiveFiles的根路径为$(System.DefaultWorkingDirectory),同时确保所有必要配置文件也被复制到待打包目录。
2. 跨平台编译兼容问题
你使用的构建代理是Windows镜像vs2017-win2016,默认编译出来的是Windows平台可执行文件,如果你的Azure Function运行在Linux计划(包括消费计划、专用计划),会因为二进制无法执行导致函数加载失败。
修复方式:在go build步骤添加环境变量指定目标平台,比如针对Linux 64位环境的配置:
- task: Go@0 displayName: 'go build' inputs: command: build arguments: '-o go_ibors_backend main.go' workingDirectory: '$(System.DefaultWorkingDirectory)' env: GOOS: linux GOARCH: amd64 CGO_ENABLED: 0
3. 必要配置文件打包校验
本地推送可以正常运行说明你本地项目中存在host.json、对应函数目录下的function.json等配置文件,需要确保这些文件也被打包到zip的根路径下,不要出现嵌套层级。可以在go build之后增加复制文件任务,把所有必要文件统一归集到待打包目录,示例配置:
- task: CopyFiles@2 inputs: SourceFolder: '$(System.DefaultWorkingDirectory)' Contents: | go_ibors_backend host.json */function.json TargetFolder: '$(Build.BinariesDirectory)'
4. 自定义处理程序配置校验
确保你项目根目录的host.json中已经正确配置了Go自定义处理程序的路径,示例配置如下:
{ "version": "2.0", "customHandler": { "description": { "defaultExecutablePath": "go_ibors_backend", "workingDirectory": "", "arguments": [] }, "enableForwardingHttpRequest": true } }
如果执行路径配置错误,即使所有文件都打包正确,函数服务也无法启动处理程序加载函数。
内容的提问来源于stack exchange,提问作者Thijs van Tol

