Спасибо Мюррею за начальную точку в правильном направлении, показать то, что я надеялся сделать, было невозможно!
Сначала я попытался сделать это в рамках задачи Azure PowerShell, но довольно далеко, но зашел в тупик с помощью AzureRm.Profile , поскольку вы не можете выгрузить старую версию .
Хитрость заключалась в том, чтобы понять, как задача AzureRM VSTS выполняет настройку зависимостей. Она эффективно берет строку «Версия Azure Powershell» в пользовательском интерфейсе VSTS и использует ее для определения дополнительного пути поиска в переменной среды 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 не будет устанавливаться в c: \ modules, такие как vsts проекта генерации образа .
Мне показалось, что мне нужен AllowClobber, чтобы обойти проблемы, возникающие при замене старых версий PowerShell во время экспериментов, но я подозреваю, что мне это больше не нужно.
При следующем использовании сценария Azure PowerShell появится элегантное решение.
Поле предпочтительной версии powershell, заполненное 6.2.1, добавит C:\Modules\azurerm_6.2.1
к пути PSModules. Этого не существует, но, к счастью, PSModules по-прежнему содержат путь к конкретным модулям пользователя, поэтому наш 6.2.1 загружается сам по себе!
К счастью, AzureRM.Profile из 5.1.1 достаточно совместим с прямой переадресацией, так что вход в систему субъекта-службы, выполняемый задачей Azure Powershell, все еще работает.
Бег
Get-Module AzureRm
Get-AzureRmContext
Выводит версии, на которые вы надеетесь:
В частности, если он не смог войти, я думаю System.AccessToken можно использовать (если опция включена на уровне фазы агента).
Методы диагностики, если обходной путь требует настройки:
Вещи, которые очень помогли, читая код, который загружается в AzureRM в задаче:
https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/AzurePowerShell.ps1#L80
https://github.com/Microsoft/vsts-tasks/blob/0703b8869041d64db994934bde97de167787ed2e/Tasks/Common/VstsAzureHelpers_/ImportFunctions.ps1
https://github.com/Microsoft/vsts-tasks/blob/master/Tasks/AzurePowerShellV3/Utility.ps1#L18
А также как генерируется образ VSTS:
https://github.com/Microsoft/vsts-image-generation/blob/2f57db26dc30ae0f257a3415d26eaa8eea0febf9/images/win/scripts/Installers/Install-AzureModules.ps1
Enabing System.Debug = true как переменная выпуска среды.
Затем с помощью плагин выделения файлов журнала VSCode
Я бы рекомендовал всем, кто заинтересован голосовать в: https://github.com/Microsoft/vsts-image-generation/issues/149
Поскольку версия AzureRM на момент написания статьи устарела для агента VSTS Hosted 2017.
К сожалению, я не могу отправить PR для его обновления, так как он загружается через zip-файл, размещенный в частном порядке.