Visual Studio Teams Services(オンライン)でリリース管理を使用しています。私たちはホストされたビルドエージェントを使用しており、カスタムエージェントの管理のオーバーヘッドを回避したいのです。
私が必要とする1つのアイテムは、AzureRM PowerShellモジュールです。 5.1.1までのバージョンは エージェントで使用可能 ですが、6.0.0が必要です。
私がしたいことは、リリースプロセス(PowerShell)のステップを使用してバージョン6.0.0を取得し、代わりにthartを使用することですが、それをうまく機能させることができません。私はすべてが行き詰まったいくつかのアプローチを試しました、現在のアプローチは次のとおりです:
Write-Output "------------------ Install package provider ------------------"
Find-PackageProvider -Name "NuGet" | Install-PackageProvider -Scope CurrentUser -Force
Write-Output "------------------ Remove Modules ------------------"
Get-Module -ListAvailable | Where-Object {$_.Name -like 'AzureRM*'} | Remove-Module
Write-Output "------------------ Install the AzureRM version we want - 6.0.1! ------------------"
Install-Package AzureRM -RequiredVersion 6.0.1 -Scope CurrentUser -Force
Write-Output "------------------ Import AzureRM 6.0.1 ------------------"
Import-Module AzureRM -RequiredVersion 6.0.1
これはすべて正常に動作します(つまり、クラッシュしません...)が、6.0.1コマンドレットのいずれかを使用しようとすると、エラーが発生します。
Get-AzureRmADGroup:Azure PowerShellセッションが正しく初期化されていません。モジュールをインポートして、もう一度お試しください。
AzureRM 6.0.1をデプロイしてホストされたエージェントで使用するために、どこで問題が発生するのか、または代替の戦略を使用できるか?
私は最終的にそれを理解しました-同じことを苦しんでいる他の人のための答えを追加します。
キーは、AzureRMモジュールがアップグレードされた後にログインすることです。
PowerShellコード:
Write-Output "------------------ Start: Upgrade AzureRM on build Host ------------------"
Write-Output "- - - - - Install package provider"
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
Write-Output "- - - - - List Modules Before"
Get-Module -ListAvailable| where {$_.Name -Like “*AzureRM*”} | Select Name, Version
Write-Output "- - - - - Remove alll existing AzureRM Modules"
Get-Module -ListAvailable | Where-Object {$_.Name -like '*AzureRM*'} | Remove-Module -Force
Write-Output "- - - - - Install AzureRM 6.0.1"
Install-Module -Name AzureRM -RequiredVersion 6.0.1 -Force -Scope CurrentUser
Write-Output "- - - - - Import AzureRM 6.0.1"
Import-Module AzureRM -Force -Verbose -Scope Local
Write-Output "- - - - - List Modules After"
Get-Module -ListAvailable| where {$_.Name -Like “*AzureRM*”} | Select Name, Version
Write-Output "------------------ End: Upgrade AzureRM on build Host ------------------"
Write-Output "------------------ Start: LoginToAzure ------------------"
$SecurePassword = ConvertTo-SecureString $AdminPassword -AsPlainText -Force
$AdminCredential = New-Object System.Management.Automation.PSCredential ($AdminUserEmailAddress, $SecurePassword)
Login-AzureRmAccount -Credential $AdminCredential
Get-AzureRmSubscription –SubscriptionId $SubscriptionId | Select-AzureRmSubscription
Write-Output "------------------ End: LoginToAzure ------------------"
正しい方向への最初のポイントを提供してくれたMurrayに感謝します。私が望んでいたことを示すことは不可能ではありませんでした!
私は最初にAzure PowerShellタスク内でこれを実行しようとしましたが、かなり遠くまで行きましたが、古いバージョンをアンロードできないため、AzureRm.Profile で行き止まりになりました 。
トリックは、AzureRM VSTSタスクが依存関係のセットアップをどのように実行するかを理解することでした。これは、VSTS UIの「Azure Powershell Version」文字列を効果的に受け取り、それを使用してPSModules環境変数に追加の検索パスを定義します。つまり、C:\Modules\azurerm_5.1.1
です。
ユーザープロファイルを検索する前に、そのディレクトリを検索してから、グローバルモジュールパスを検索します。
モジュールが見つかると、Azureログインが実行されます。これにより、後でモジュールを削除する希望が妨げられます。
したがって、代わりに単純なpowershellタスク、つまりAzureRMが読み込まれていないタスクを使用する場合(マレーも結論付けたように):
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
Install-Module -Name AzureRM -RequiredVersion 6.2.1 -Force -Scope CurrentUser -AllowClobber
特にinstall-moduleは、 vsts画像生成プロジェクト のようなc:\ modulesにインストールされません。
実験するときに古いPowerShellバージョンを上書きする問題を回避するには、AllowClobberが必要であるように見えましたが、もう必要ないのではないかと思います。
エレガントなソリューションは、次にAzure PowerShellスクリプトを使用するときに始まります。
6.2.1が入力された優先PowerShellバージョンのフィールドは、PSModulesパスにC:\Modules\azurerm_6.2.1
を追加します。これは存在しませんが、ありがたいことに、PSModulesには依然としてユーザー固有のモジュールパスが含まれているため、6.2.1が単独でロードされます。
幸い、5.1.1からのAzureRM.Profileは、Azure Powershellタスクによって実行されるサービスプリンシパルログインが引き続き機能するのに十分な上位互換性があります。
ランニング
Get-Module AzureRm
Get-AzureRmContext
希望するバージョンを出力します:
特に、ログインできなかった場合は、IthinkSystem.AccessTokenを使用できます(エージェントフェーズレベルでオプションがオンになっている場合)。
回避策を微調整する必要がある場合の診断テクニック:
タスクでAzureRMに読み込まれるコードを読んで、非常に役立ちました。
https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/AzurePowerShell.ps1#L80
https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/Utility.ps1#L18
また、VSTSイメージの生成方法:
環境解放変数としてSystem.Debug = trueを有効にします。次に、 VSCodeのログファイルハイライタープラグイン
https://github.com/Microsoft/vsts-image-generationで投票することに興味がある人なら誰でもお勧めします/issues/149
執筆時点でのAzureRMのバージョンは、VSTS Hosted 2017エージェントで古いためです。
残念ながら、プライベートにホストされているZipファイルを介してプルされているため、PRを送信してアップグレードすることはできません。