Обновите AzureRM Powershell на размещенном агенте 2017 года (VSTS - Visual Studio Team Services) - PullRequest
0 голосов
/ 16 мая 2018

Я использую управление выпуском через службы Visual Studio Teams Services (онлайн). Мы используем размещенные агенты сборки, и я действительно хочу избежать накладных расходов при управлении пользовательскими агентами.

Один элемент, который мне нужен, - это модуль 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 и использования его на размещенном агенте?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Спасибо Мюррею за начальную точку в правильном направлении, показать то, что я надеялся сделать, было невозможно!

Сначала я попытался сделать это в рамках задачи Azure PowerShell, но довольно далеко, но зашел в тупик с помощью AzureRm.Profile , поскольку вы не можете выгрузить старую версию .

Хитрость заключалась в том, чтобы понять, как задача AzureRM VSTS выполняет настройку зависимостей. Она эффективно берет строку «Версия Azure Powershell» в пользовательском интерфейсе VSTS и использует ее для определения дополнительного пути поиска в переменной среды PSModules, т. Е. C:\Modules\azurerm_5.1.1 .

Он будет искать в этом каталоге, прежде чем искать профиль пользователя, затем путь к глобальным модулям.

Как только он находит модуль, он выполняет вход в Azure, что лишает всякую надежду удалить модуль после.

Так что если вы вместо этого используете простую задачу PowerShell, то есть ту, в которую не загружается AzureRM (как Мюррей также сделал вывод):

Plain Powershell Task

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 появится элегантное решение.

Azure PowerShell Task

Поле предпочтительной версии 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

Выводит версии, на которые вы надеетесь:

VSTS azure rm powershell versions

В частности, если он не смог войти, я думаю 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-файл, размещенный в частном порядке.

0 голосов
/ 17 мая 2018

Я наконец понял это - добавив ответ для всех, кто страдает таким же образом.

Ключ должен войти в систему после обновления модуля 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 ------------------"
...