Azure DevOps 和 Azure Function Deployment:我的应用程序设置在哪里
Azure DevOps and Azure Function Deployment: where are my app settings
我正在尝试将 Dotnet 核心 Azure 函数上传到 Windows 上托管的应用服务,我正在努力证明它有效或确保设置正确。
我也希望部署应该完全自动化,而无需通过 Azure 门户和调整设置等。
构建过程:目前看起来是这样的...
- C# 函数编译并且所有单元测试在本地和 Azure DevOps 构建代理上通过
- 构建完成并生成 zip 文件
- 我将 zip 文件包装在版本控制的 Nuget 包中
- Nuget 包托管在 Azure DevOps Artifacts 存储库中
现在看来一切都很好。
发布过程
- 我在 Azure DevOps 构建代理上还原并解压了 nuget 包。
- 我确认 zip 文件与 Powershell 任务一起存在 - 一切正常。
- 然后我使用 Azure DevOps 发布管道任务; "Azure Functions"
- 我想我已经正确配置了这个任务
- 包或文件夹:"The path I validated in step 2 above"
- 部署方式:Zip Deploy(我在不同的版本中交替使用过这种部署方式和Package部署方式)
应用设置(见下方截图)
- 名称值对,如 -Name "value" -Name2 "value2" 等
- 我还在应用程序设置列表中包含了 -WEBSITE_RUN_FROM_PACKAGE“1”(我尝试过有和没有此设置的版本)
结果
发布通过,它在日志中说它上传了包和应用程序设置。
但是,当我转到 Azure 门户时:
- 我没有看到我认为我已在版本中上传的应用程序设置。
- 它保留了我直接通过 Azure 门户添加的虚拟应用程序设置
问题
- 在使用此任务开始发布之前,我是否应该使用 Azure 门户在 AppServive 中创建一个空的 Azure 函数?
- 我第一次 运行 发布失败,因为它说找不到我指定的插槽。我的印象是 Azure Function 管道任务 会创建所有内容,但它似乎希望有一个空函数,其中预定义了插槽,并且可能预定义了应用程序设置。有什么想法吗?
- 我是否必须在发布前在门户中创建应用程序设置?换句话说,管道任务是否仅允许 更新 到现有门户创建的应用程序设置。
- 是否有更好的管道任务可供使用 - 可以创建一个新的 Azure 函数(如果它不存在)?
就像帮助文档中经常出现的情况一样,我看到的信息遵循一条快乐的道路,或者有时太多了,有很多如果、但是,也许还有建议。
任何指导都将不胜感激,因为我觉得我在这里兜圈子,应该很简单。
谢谢。
您可以通过 Azure-Resource-Manager Templates. You can find samples on GitHub 部署 Azure Functions。通过此步骤,您可以在部署之前在 Azure 上创建所需的基础结构。在您的例子中,Azure Functions 和消费计划。因此,在您的部署中,基础结构在第一步中提供,然后将包实际部署到您的函数中。
对于基础架构,请查看 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'
在 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 浏览已部署的文件。如果您选择 运行 from package,您可以看到在 /data/SitePackages/
处使用的包。 packagename.txt 指向最新使用的包。包的内容被提取到 /site/wwwroot/
。在那里您应该至少看到一个 host.json
、一个 bin
文件夹,以及包含您的函数的文件夹。没有其他的。函数应用内容不应部署到 /site/wwwroot/
的子文件夹,例如 /site/wwwroot/FunctionApp/
.
如果 wwwroot 中的内容和文件夹结构不正确,您可能仍然会看到部署成功,出现了功能应用程序,但没有显示任何功能。
我正在尝试将 Dotnet 核心 Azure 函数上传到 Windows 上托管的应用服务,我正在努力证明它有效或确保设置正确。
我也希望部署应该完全自动化,而无需通过 Azure 门户和调整设置等。
构建过程:目前看起来是这样的...
- C# 函数编译并且所有单元测试在本地和 Azure DevOps 构建代理上通过
- 构建完成并生成 zip 文件
- 我将 zip 文件包装在版本控制的 Nuget 包中
- Nuget 包托管在 Azure DevOps Artifacts 存储库中
现在看来一切都很好。
发布过程
- 我在 Azure DevOps 构建代理上还原并解压了 nuget 包。
- 我确认 zip 文件与 Powershell 任务一起存在 - 一切正常。
- 然后我使用 Azure DevOps 发布管道任务; "Azure Functions"
- 我想我已经正确配置了这个任务
- 包或文件夹:"The path I validated in step 2 above"
- 部署方式:Zip Deploy(我在不同的版本中交替使用过这种部署方式和Package部署方式)
应用设置(见下方截图)
- 名称值对,如 -Name "value" -Name2 "value2" 等
- 我还在应用程序设置列表中包含了 -WEBSITE_RUN_FROM_PACKAGE“1”(我尝试过有和没有此设置的版本)
结果
发布通过,它在日志中说它上传了包和应用程序设置。
但是,当我转到 Azure 门户时:
- 我没有看到我认为我已在版本中上传的应用程序设置。
- 它保留了我直接通过 Azure 门户添加的虚拟应用程序设置
问题
- 在使用此任务开始发布之前,我是否应该使用 Azure 门户在 AppServive 中创建一个空的 Azure 函数?
- 我第一次 运行 发布失败,因为它说找不到我指定的插槽。我的印象是 Azure Function 管道任务 会创建所有内容,但它似乎希望有一个空函数,其中预定义了插槽,并且可能预定义了应用程序设置。有什么想法吗?
- 我是否必须在发布前在门户中创建应用程序设置?换句话说,管道任务是否仅允许 更新 到现有门户创建的应用程序设置。
- 是否有更好的管道任务可供使用 - 可以创建一个新的 Azure 函数(如果它不存在)?
就像帮助文档中经常出现的情况一样,我看到的信息遵循一条快乐的道路,或者有时太多了,有很多如果、但是,也许还有建议。
任何指导都将不胜感激,因为我觉得我在这里兜圈子,应该很简单。
谢谢。
您可以通过 Azure-Resource-Manager Templates. You can find samples on GitHub 部署 Azure Functions。通过此步骤,您可以在部署之前在 Azure 上创建所需的基础结构。在您的例子中,Azure Functions 和消费计划。因此,在您的部署中,基础结构在第一步中提供,然后将包实际部署到您的函数中。
对于基础架构,请查看 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'
在 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 浏览已部署的文件。如果您选择 运行 from package,您可以看到在 /data/SitePackages/
处使用的包。 packagename.txt 指向最新使用的包。包的内容被提取到 /site/wwwroot/
。在那里您应该至少看到一个 host.json
、一个 bin
文件夹,以及包含您的函数的文件夹。没有其他的。函数应用内容不应部署到 /site/wwwroot/
的子文件夹,例如 /site/wwwroot/FunctionApp/
.
如果 wwwroot 中的内容和文件夹结构不正确,您可能仍然会看到部署成功,出现了功能应用程序,但没有显示任何功能。