将PowerShell函数发布到函数应用程序时遇到了一个奇怪的问题。功能应用程序使用Windows消费和Y1应用程序服务计划。
该函数使用模块目录中存在的5个不同的Az模块作为包的一部分:
- Az.Accounts
- Az.Resources
- Az.Compute
- Az.Sql
- Az.SqlVirtualMachine
文件结构如下所示:
wwwroot/
| - .funcignore
| - ahubReporter
| | - function.json
| | - readme.md
| | - run.ps1
| - host.json
| - Modules
| | - Az.Accounts
| | - Az.Compute
| | - Az.Resources
| | - Az.Sql
| | - Az.SqlVirtualMachine
| - profile.ps1
| - requirements.psd1
注:未启用managedDependency
,并且不会自动下载Az
模块。这些模块包含在Modules
目录下的源代码中,并随函数
如果使用Azure函数扩展通过vscode手动发布函数,则该函数可以正常工作和运行。
但是,如果我使用命令Publish-AzWebApp
通过Azure DevOps任务AzureFunctionApp@2
或Azure PowerShell任务AzurePowerShell@5发布函数,则函数已发布,但不会运行,并且我会收到以下错误:
The 'Get-AzLocation' command was found in the module 'Az.Resources', but the module could not be loaded. For more information, run 'Import-Module Az.Resources'.
Azure DevOps Pipeline配置为使用Windows代理。
Azure DevOps任务AzureFunctionApp@2是:
- task: AzureFunctionApp@2
displayName: 'Publish Function | package'
inputs:
azureSubscription: ${{ parameters.customerServiceConnection }}
appType: functionApp
appName: $(functionName)
package: $(System.ArtifactsDirectory)/**/*.zip
deploymentMethod: 'runFromPackage' # <--- I've tried auto as well
Azure DevOps任务AzurePowerShell@5是:
- task: AzurePowerShell@5
displayName: 'Publish Function | azpwsh'
inputs:
azureSubscription: ${{ parameters.customerServiceConnection }}
ScriptType: 'InlineScript'
Inline: 'Publish-AzWebapp -ResourceGroupName $(functionAppRg) -Name $(functionName) -ArchivePath $(System.ArtifactsDirectory)/build$(Build.BuildId).zip -Force'
azurePowerShellVersion: 'LatestVersion'
pwsh: true
谢谢!
3条答案
按热度按时间s5a0g9ez1#
我对此进行了一点调查,因为错误消息表明
PSModulePath
没有正确配置,因为它可以定位函数/cmdlet和模块,但无法加载。据我所知,当初始化worker时,项目根目录中的
Modules
文件夹会附加到PSModulePath中。我很快在一个devcontainer中构建了一个项目来做一些测试,并按照您的建议禁用了托管依赖项。
运行
Save-Module
以保存Az.Resources
模块,并将其添加到项目中的Modules文件夹中。当运行项目时,您可以看到比从AzDo或门户网站更详细的日志,并且有大量的错误来自内部命令
Az.Resources
&Az.Accounts
还有内部模块Az.Authorisation
&Az.MsGraph
,其中显示在日志中Newtonsoft冲突错误。我把项目推到了Github这里,这样你就可以看到它产生的错误了
https://github.com/brettmillerb/stackoverflowTest
出于好奇,您是否尝试过使用Azure Functions Deploy v2任务而不是PowerShell任务并使用PowerShell等效任务?
https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/azure-function-app-v2?view=azure-pipelines
mjqavswn2#
而不是将您的Powershell模块添加到单独的Module文件夹中,直接将它们添加到requirements.psd1文件夹中,requirements.psd1将自动为您下载这些包。
我运行了一个Azure DevOps管道来部署Azure Powershell HTTP触发器,并且成功了,参考下面:
我的仓库:-
requirements.psd1
入口:-
如果你想运行模块文件,请确保在下面的PowerShell任务中导入或安装它们,然后运行函数发布任务。
如果错误仍然存在,请通过启用诊断或在PowerShell命令的末尾添加--Verbose标志来运行管道,如下所示:
s8vozzvw3#
好的我修好了。
虽然,我仍然不明白为什么它不能使用Azure DevOps任务
AzureFunctionApp@2
或Azure PowerShell任务AzurePowerShell@5
使用命令Publish-AzWebApp
,但如果它通过vscode
发布,它就会工作。基本上,我简化了代码(我最初没有写),删除了模块并更新了以下文件:
host.json
启用
managedDependency
requirements.psd1
删除
'Az' = '10.*'
并添加以下内容:谢谢大家的回应。每个人都给了我一些想法,我只是结束了尝试不同的配置和增强原始代码。
谢谢!