Bitbucket Pipeline发布Azure Functions提示找不到项目根host.json
在Bitbucket Pipeline中配置Azure Functions发布流程时出现路径识别问题:
- 本地终端执行
func azure functionapp publish "" --csharp命令可正常完成函数应用发布 - Pipeline中执行完全相同的命令时抛出错误:
Unable to find project root. Expecting to find one of host.json in project root.
为排查问题,在Pipeline脚本中添加路径与文件列表查看命令:
pwd ls -l
执行返回结果如下:
Deploying functions app code with func... /opt/atlassian/pipelines/agent total 16 drwxrwxrwx 2 root root 4096 Jun 7 09:16 artifact drwxrwxrwx 5 root root 4096 Jun 7 09:16 build drwxrwxrwx 2 root root 4096 Jun 7 09:16 cache drwxrwxrwt 3 root root 100 Jun 7 09:16 data drwxrwxrwt 3 root root 100 Jun 7 09:16 ssh drwxrwxrwx 2 root root 4096 Jun 7 09:16 tmp
结果显示Pipeline当前执行目录为/opt/atlassian/pipelines/agent,该目录下不存在host.json文件。但host.json已提交至代码仓库,本地执行相同的pwd和ls -l命令时,工作目录为项目根目录且host.json存在,本地发布可正常运行。
Bitbucket Pipeline执行脚本时的默认工作目录是/opt/atlassian/pipelines/agent,拉取的仓库代码实际存放在内置环境变量BITBUCKET_CLONE_DIR指向的路径下(默认路径为/opt/atlassian/pipelines/agent/build),执行发布命令前没有切换到代码所在的项目根目录,导致Azure Functions Core Tools无法找到标识项目根目录的host.json文件。
两种方案二选一即可:
方案1:执行发布命令前先切换到项目根目录
在Pipeline的script步骤中,先进入代码克隆的根目录,再执行发布命令,示例配置片段:script: # 前置步骤:安装对应版本dotnet SDK、Azure Functions Core Tools - cd $BITBUCKET_CLONE_DIR # 可选校验步骤:确认当前目录下存在host.json - ls | grep host.json - func azure functionapp publish "<替换为实际的函数应用名称>" --csharp如果你的Azure Functions项目不在仓库根目录,而是在子目录下(例如
src/MyFunctionApp),将cd命令的路径改为$BITBUCKET_CLONE_DIR/src/MyFunctionApp即可。方案2:发布命令直接指定项目路径
不需要切换工作目录,直接在func命令中通过--project参数指定项目根目录路径:script: # 前置步骤:安装对应版本dotnet SDK、Azure Functions Core Tools - func azure functionapp publish "<替换为实际的函数应用名称>" --csharp --project $BITBUCKET_CLONE_DIR
配置调整后首次运行时,可以在发布命令前添加ls $BITBUCKET_CLONE_DIR命令,确认输出的文件列表中包含host.json、项目csproj文件后,再执行后续发布操作,可快速确认路径配置是否正确。
内容的提问来源于stack exchange,提问作者floormind

