【问题标题】:Azure DevOps and Azure Function Deployment: where are my app settingsAzure DevOps 和 Azure 函数部署:我的应用设置在哪里
【发布时间】:2020-05-08 14:08:24
【问题描述】:

我正在尝试将 Dotnet 核心 Azure 函数上传到托管在 Windows 上的应用服务,并且我正在努力证明它有效或确保设置正确。

我还希望部署应该完全自动化,而无需通过 Azure 门户和调整设置等。

构建过程:目前看起来是这样的......

  1. c# 函数编译,所有单元测试在本地和 Azure DevOps 构建代理上通过
  2. 构建完成并生成 zip 文件
  3. 我将 zip 文件包装在版本化的 Nuget 包中
  4. Nuget 包托管在 Azure DevOps Artifacts 存储库中

所以现在一切看起来都很好。

发布流程

  1. 我在 Azure DevOps 构建代理上恢复并解压 nuget 包。
  2. 我通过 Powershell 任务确认 zip 文件存在 - 一切正常。
  3. 然后我使用 Azure DevOps 发布管道任务; “蔚蓝函数”
  4. 我想我已经正确配置了这个任务
    • 包或文件夹:“我在上面第 2 步中验证的路径”
    • 部署方法:Zip 部署(我在不同版本中交替使用此部署和包部署)

应用设置(见下方截图)

  • 名称值对,例如 -Name "value" -Name2 "value2" 等
  • 我还在应用设置列表中添加了 -WEBSITE_RUN_FROM_PACKAGE "1"(我尝试过有和没有这个设置的版本)

结果

发布通过,它在日志中说它上传了包和应用程序设置。

但是,当我访问 Azure 门户时:

  • 我没有看到我认为我在发行版中上传的应用程序设置。
  • 它保留了我直接通过 Azure 门户添加的虚拟应用设置

问题

  • 在开始使用此任务发布之前,是否应该使用 Azure 门户在 AppServive 中创建一个空的 Azure 函数?
    • 我第一次运行该版本时失败了,因为它说找不到我指定的插槽。我的印象是 Azure 函数管道任务 会创建所有内容,但它似乎希望有一个空函数,其中预定义了插槽,并且可能预定义了应用程序设置。请问有什么想法吗?
    • 是否必须在发布前在 Portal 中创建应用设置?换句话说,Pipeline 任务是否只允许 更新 到现有 Portal 创建的应用设置。
  • 是否有更好的 Pipeline 任务可供使用 - 如果它尚不存在,它可以创建一个新的 Azure 函数?

与帮助文档的常见情况一样,我所看到的信息遵循一条愉快的道路,或者有时太多了,有很多如果、但是,也许还有建议。

任何指导都将不胜感激,因为我觉得我在这里绕圈子,应该很简单。

谢谢。

【问题讨论】:

    标签: c# azure azure-devops azure-deployment azure-function-app


    【解决方案1】:

    您可以通过Azure-Resource-Manager Templates 部署 Azure Function。您可以在GitHub 上找到示例。通过此步骤,您可以在部署之前在 Azure 上创建所需的基础结构。在您的情况下,Azure 功能和消费计划。因此,在您的部署中,在第一步中提供了基础设施,然后将包实际部署到您的函数中。

    对于基础架构,请查看 Create or Update Resource Groups 的 Azure DevOps 步骤。

    两个步骤的 YAML 示例:

    - task: AzureResourceGroupDeployment@2
      displayName: 'Create Or Update Resource Group'
      inputs:
        deploymentMode: 'Incremental'
        azureSubscription: 'Your-Subscription'
        resourceGroupName: '${{ parameters.resourceGroupName }}'
        location: '${{ parameters.location }}'
        csmFile: '${{ parameters.csmFile }}'
        csmParametersFile: '${{ parameters.csmParametersFile }}'
    
    - task: AzureRmWebAppDeployment@4
      displayName: 'Azure App Service Deploy'
      inputs:
        azureSubscription: 'Your-Subscription'
        appType: functionApp
        WebAppName: '${{ parameters.function }}'
        packageForLinux: '$(Agent.BuildDirectory)/${{ parameters.dropfolder }}/$(Build.Repository.Name)-$(version)-$(Build.SourceBranchName)-$(Build.BuildNumber).zip'
    

    【讨论】:

    • 您还可以通过这些模板包含您的功能设置。然后这些会在每次部署时自动设置为增量。
    • 您好,感谢 Daniel 就 Azure ARM 模板的使用问题提供的答复。我可以理解这可能是如何工作的,并且我喜欢用于初始配置的 ARM 模板。但是,通常我发现一旦您开始向 RG 添加更多资源,它们会很快变得非常复杂。我希望 Azure 函数任务能够在管道中快速获胜,以便轻松地将变量注入 AppSettings 并自动更新 Azure 中的变量。即使管道任务清楚地表明它是,它似乎也没有更新它们。也许我只需要求助于 powershell。
    • @SJB 在您开始尝试使用 ARM 模板来管理您的 Azure Function 应用程序设置之前,您应该知道我在 GitHub 上提交的一个问题,我仍在等待解决方案.目前,带有应用程序设置的 ARM 模板部署将删除所有应用程序设置并将其替换为 ARM 模板中的任何内容。所以,如果你在部署之间添加任何东西,它就消失了。如果您的 ARM 模板进行任何其他应用程序设置配置,它就消失了。这是一个巨大的痛苦。当心github.com/Azure/azure-cli/issues/11718
    • 补充一下我之前的评论,我目前正在使用的解决方法是仅使用 ARM 模板部署资源,没有应用程序设置。然后我跟进发布管道任务以使用 Azure CLI 应用应用程序设置,因为 AzureCLI 命令不会删除。它合并更改,而不是我需要的所需行为。我有一篇 stackoverflow 帖子详细说明了我对这个问题的追求。 stackoverflow.com/questions/59383303/…
    • 感谢 Anthony 的提醒 :-)。那么我将求助于命令行任务...我只是希望 Azure DevOps Release Pipeline Azure Function 任务将是最快和最简单的方法。
    【解决方案2】:

    在 Azure Devops 管道中完成构建后,您将创建一个包以用于发布。您必须确保该包中的内容与正确的文件夹结构相匹配。根据Requirements for continuous deployment,您的应用程序的内容应具有以下结构。

    FunctionApp
     | - host.json
     | - MyFirstFunction
     | | - function.json
     | | - ...  
     | - MySecondFunction
     | | - function.json
     | | - ...  
     | - SharedCode
     | - bin
    

    构建后,您可以通过转到特定构建的摘要并单击已发布的工件来检查生成的包的内容。您可以在那里下载内容并确保其具有以下结构和内容:

     | - host.json
     | - MyFirstFunction
     | | - function.json
     | | - ...  
     | - MySecondFunction
     | | - function.json
     | | - ...  
     | - SharedCode (might not be there)
     | - bin
    

    部署后,您可以使用 CMD 或 Powershell 调试控制台通过 Kudu 浏览部署的文件。如果您选择从包运行,您可以在/data/SitePackages/ 看到使用的包。 packagename.txt 指向使用的最新包。包的内容被提取到/site/wwwroot/。在那里您应该至少看到一个host.json、一个bin 文件夹以及包含您的函数的文件夹。没有其他的。函数应用内容不应部署到/site/wwwroot/ 的子文件夹,例如/site/wwwroot/FunctionApp/

    如果 wwwroot 中的内容和文件夹结构不正确,您可能仍会看到部署成功,您的 Function App 出现了,但没有出现任何函数。

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多