我正在尝试使用 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。日志分析显示了这一点:
因此,由于某种原因,它确实找到了该函数,但没有加载它。如果我导航到 Azure 门户中的“功能”边栏选项卡,我看不到任何功能。该项目只是一个 POC 项目,可在 https://github.com/nikneem/function-deployment-with-gh-actions
公开托管有什么想法吗?
哇哦,我在部署过程中找到了答案。在我的 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 文件。现在一切正常;)
根据本文档中的注释:
为了能够将隔离函数项目发布到 Azure 中的 Windows 或 Linux 函数应用,必须在远程 FUNCTIONS_WORKER_RUNTIME 应用程序设置中设置 dotnet-isolated 值。要支持 zip 部署并从 Linux 上的部署包运行,您还需要将 linuxFxVersion 站点配置设置更新为 DOTNET-ISOLATED|7.0。要了解更多信息,请参阅 Linux 上的手动版本更新。
我可以看到基础设施模板中的相关配置设置似乎已正确设置,但
linuxFxVersion
除外 - 这似乎没有在任何地方提及,并且 CICD 工作流程似乎正在执行 zip 部署。
我也有类似的问题。我收到 Bad Gateway (502) 错误,本地部署工作正常。 最后我找到了问题的原因。已部署解决方案中配置的 .NET 版本与预期版本不同。它应该配置为 .Net Framework v4.8,但默认情况下它被设置为 .NET 6 (LTS) 隔离。 一旦更改为 .NET Framework v4.8,Function App 就可以正常工作了。
对于遇到此问题的人,根本原因是部署包缺少“.azurefunctions”文件夹。要解决此问题,请将其添加到“actions/upload-artifact@v4”操作中:
包含隐藏文件:true
这将解决功能不显示的问题。