Azure Pipeline中PowerShell脚本无法登录Azure账户,本地执行正常
在Azure Pipeline的PowerShell任务中执行登录Azure账户的脚本时,出现以下报错:
2023-03Method 'get_SerializationSettings' in type 'Microsoft.Azure.Management.Internal.Resources.ResourceManagementClient' from assembly 'Microsoft.Azure.Commands.ResourceManager.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' does not have an implementation.
但在同一构建机器上,手动通过PowerShell命令行执行相同脚本却能正常运行。脚本内容如下:
$applicationId = "015e10e9-0136-4393-xxxx-"; $securePassword = "QGf8Q~x-xxxxxx" | ConvertTo-SecureString -AsPlainText -Force $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $applicationId, $securePassword Connect-AzureRmAccount -ServicePrincipal -Credential $credential -TenantId "b49ce02b-187d-xxx"
这个问题本质是Azure PowerShell模块版本冲突或环境不一致导致的——手动PowerShell环境和Azure Pipeline任务使用的PowerShell环境加载的模块版本不匹配,尤其是AzureRm和Az模块共存时容易出现这类兼容性问题。
以下是具体解决步骤:
强制使用指定版本的AzureRm模块
在脚本开头添加模块导入命令,指定兼容的版本(比如5.1.1,稳定性较好),避免Pipeline自动加载不兼容的版本:# 卸载已加载的Azure相关模块 Get-Module -Name Azure*,Az* | Remove-Module -Force # 导入指定版本的AzureRm模块 Import-Module AzureRM -RequiredVersion 5.1.1 -Force改用Az模块替代AzureRm模块
AzureRm模块已停止维护,建议迁移到Az模块,兼容性更好。修改脚本为:$applicationId = "015e10e9-0136-4393-xxxx-"; $securePassword = "QGf8Q~x-xxxxxx" | ConvertTo-SecureString -AsPlainText -Force $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $applicationId, $securePassword Connect-AzAccount -ServicePrincipal -Credential $credential -TenantId "b49ce02b-187d-xxx"注意:如果使用Az模块,需确保Pipeline的PowerShell任务中已安装Az模块,可手动添加安装命令:
Install-Module Az -Force -AllowClobber -Scope CurrentUser指定Pipeline任务的PowerShell版本
在Azure Pipeline的PowerShell任务设置中,选择与手动执行环境一致的PowerShell版本(比如Windows PowerShell 5.1或PowerShell 7.x),避免环境差异导致模块加载问题。清理构建机器上的模块冲突
如果构建机器上同时存在Az和AzureRm模块,手动执行以下命令清理冲突:Uninstall-Module AzureRM -AllVersions -Force Uninstall-Module Az -AllVersions -Force # 重新安装所需版本 Install-Module AzureRM -RequiredVersion 5.1.1 -Force -AllowClobber
内容的提问来源于stack exchange,提问作者Bob

