.NET 7 中的 Azure 函数(隔离)发布到 Azure,已加载 0 个函数

问题描述 投票:0回答:4

我正在尝试使用 GitHub Actions 工作流程将带有 .NET 7 的 Azure Function(隔离)部署到 MS Azure。一切似乎运行良好,但由于某种原因,当我将其部署到云时,该功能未加载。当我运行本地主机功能时,一切都很好(在我的机器上工作),但部署后就不行了。

public class DemoFunction
{
    private readonly ILogger _logger;

    public DemoFunction(ILoggerFactory loggerFactory)
    {
        _logger = loggerFactory.CreateLogger<DemoFunction>();
    }

    [Function("DemoFunction")]
    public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
    {
        var response = req.CreateResponse(HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "text/plain; charset=utf-8");
        response.WriteString("Demo function works!");

        return response;
    }
}

函数应用程序仅包含一个具有 HTTP 绑定的函数(无需身份验证,允许匿名请求)。我使用 Bicep 部署基础设施,使用 GH Actions 部署 Function App。日志分析显示了这一点: enter image description here

因此,由于某种原因,它确实找到了该函数,但没有加载它。如果我导航到 Azure 门户中的“功能”边栏选项卡,我看不到任何功能。该项目只是一个 POC 项目,可在 https://github.com/nikneem/function-deployment-with-gh-actions

公开托管

有什么想法吗?

c# .net azure azure-functions github-actions
4个回答
4
投票

哇哦,我在部署过程中找到了答案。在我的 GitHub Actions 工作流程中,我将 Azure Functions 项目的

dotnet publish
保存到输出文件夹中。我压缩了输出文件夹的内容并将该 zip 文件作为工作流程工件发布。

然后在部署中,我下载了工作流程工件(例如该 zip 文件)并使用该 zip 文件进行了 Zip 部署。

现在显然,这个 zip 文件出了问题,所以我删除了手动 zip 操作,主要是因为我发现当您传递包含所有已发布文件的文件夹时,GitHub 操作中的部署步骤也有效。

所以我的 GH Actions 工作流程中的发布步骤现在如下所示:

publish-functions:
  runs-on: ubuntu-latest
  needs: versionize
  steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-dotnet@v3
      with:
        dotnet-version: "7.0.x"
    - name: Restore packages
      working-directory: src
      run: dotnet restore
    - name: Publish functions app
      working-directory: src
      run: dotnet publish $FUNCTIONS_PATH/$FUNCTIONS_PROJECT -c Release --no-restore -o functionsout /p:Version=${{needs.versionize.outputs.semver}}
    - name: Upload functions artifact
      uses: actions/upload-artifact@v3
      with:
        name: player-functions
        path: src/functionsout/*

部署步骤如下所示:

deploy-function-app:
  runs-on: ubuntu-latest
  needs: [publish-functions, deploy-infrastructure-prod]
  steps:
    - uses: actions/download-artifact@v3
      with:
        name: player-functions
        path: function
    - uses: azure/login@v1
      with:
        creds: ${{secrets.AZURE_PROD}}
    - name: Deploy Azure Functions app
      uses: Azure/functions-action@v1
      with:
        app-name: ${{needs.deploy-infrastructure-prod.outputs.functionResourceName}}
        package: function

查看部署过程生成的日志,它仍然会创建一个 zip 文件并部署它。但这是一个与我手动创建的不同的 zip 文件。现在一切正常;)


1
投票

根据本文档中的注释:

为了能够将隔离函数项目发布到 Azure 中的 Windows 或 Linux 函数应用,必须在远程 FUNCTIONS_WORKER_RUNTIME 应用程序设置中设置 dotnet-isolated 值。要支持 zip 部署并从 Linux 上的部署包运行,您还需要将 linuxFxVersion 站点配置设置更新为 DOTNET-ISOLATED|7.0。要了解更多信息,请参阅 Linux 上的手动版本更新。

我可以看到基础设施模板中的相关配置设置似乎已正确设置,但

linuxFxVersion
除外 - 这似乎没有在任何地方提及,并且 CICD 工作流程似乎正在执行 zip 部署。


0
投票

我也有类似的问题。我收到 Bad Gateway (502) 错误,本地部署工作正常。 最后我找到了问题的原因。已部署解决方案中配置的 .NET 版本与预期版本不同。它应该配置为 .Net Framework v4.8,但默认情况下它被设置为 .NET 6 (LTS) 隔离。 一旦更改为 .NET Framework v4.8,Function App 就可以正常工作了。


0
投票

对于遇到此问题的人,根本原因是部署包缺少“.azurefunctions”文件夹。要解决此问题,请将其添加到“actions/upload-artifact@v4”操作中:

包含隐藏文件:true

这将解决功能不显示的问题。

© www.soinside.com 2019 - 2024. All rights reserved.