Powershell Direct от Jenkins до Hyper-v Windows 10 - PullRequest
1 голос
/ 02 октября 2019

Я пытался использовать Jenkins для автоматического тестирования виртуальных машин, что включает копирование нового кода в виртуальную машину или запуск определенных команд с хоста в виртуальную машину с использованием скриптов Powershell.

Однако я былвозникла ошибка при попытке использовать Invoke-Command или New-PSSession для виртуальной машины Windows 10 с гипер-V в проектах Jenkins Freestyle и Pipeline.

Это среда, в которой работает Jenkins:

Windows Specifications:
Edition: Windows Server 2019 Standard
Version: 1809
OS build: 17763.379
Jenkins ver. 2.190.1
Hyper-V Manager: 10.0.17763.1

Это сценарии Powershell, которые я написал на этапе сборки Windows Powershell в проекте для фристайла:

# Win10-Clean is currently running and the credentials are for the Win 10 VM.
$ErrorActionPreference = "Stop" 
$VMName = "Win10-Clean"
$username = "username"
$pwd = "password"
$secpasswd = ConvertTo-SecureString $pwd -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("$username", $secpasswd)
Get-VM
Invoke-Command -Credential $mycreds -VMName $VMName -ScriptBlock {host}

Я ожидаю, что результат будет:

Running as SYSTEM
Building on master in workspace G:\ci_server_1\jenkins\workspace\powershell-testing-ground
[powershell-testing-ground] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Windows\TEMP\jenkins6936256398230803297.ps1'"

Name                 State   CPUUsage(%) MemoryAssigned(M) Uptime             Status             Version
----                 -----   ----------- ----------------- ------             ------             -------
Win10-Clean          Running 0           1854              5.14:10:42.5100000 Operating normally 8.3

PSComputerName   : Win10-Clean
RunspaceId       : 56151e46-5772-458f-8f11-9beba5491bc2
Name             : ServerRemoteHost
Version          : 1.0.0.0
InstanceId       : fe09fc40-8434-4a7c-903b-b7b2c3f88506
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      :
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Finished: SUCCESS

Но я получил следующее:

Running as SYSTEM
Building on master in workspace G:\ci_server_1\jenkins\workspace\powershell-testing-ground
[powershell-testing-ground] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Windows\TEMP\jenkins233354859509300046.ps1'"

An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.
At C:\Windows\TEMP\jenkins233354859509300046.ps1:7 char:1
+ Invoke-Command -Credential $mycreds -VMName Build_VM -ScriptBlock {ho ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (Build_VM:String) [], PSRemotingDataStructureException
    + FullyQualifiedErrorId : PSSessionStateBroken

Build step 'Windows PowerShell' marked build as failure
Finished: FAILURE

После обращения к на официальной веб-странице Microsoft, посвященной этой проблеме , возможными причинами являются:

  1. ВМ существует, но не работает
  2. Гостевая ОС не поддерживает PowerShell Direct
  3. Powershell еще не доступен в гостевой системе:

    • Операциясистема еще не загрузилась
    • ОС не может загрузиться правильно
    • Некоторое событие во время загрузки требует ввода пользователя
  4. Ошибка в текущих сборках, когда учетные данные должны явно передаваться с -Credential. Запустите Restart-Service -Name vmicvmsession как обходной путь.

Однако из выходных данных Jenkins виртуальная машина, к которой я пытался подключиться, «работает», и она правильно загружена.

Затем я попытался "Invoke-Command" и "New-PSSession" в виртуальную машину с хоста напрямую, и я смог подключиться к виртуальной машине.

I 'Мы также попробовали то же самое в Jenkins, установленном на компьютере с Windows 10 вместо сервера Windows 2019, и все работает.

Что касается административной информации пользователя, то пользователь, вошедший в систему под управлением Jenkins, является "администратор "и" администратор hyper-v ".

Вот некоторые ссылки, которые я использовал для отладки, и я не могу выяснить, в чем проблема:

  1. Удаленный доступ с помощью PowerShell иДженкинс , но я не могу понять, как именно это работает.

  2. Запуск сценариев Powershell с использованием Jenkins

  3. PowerShell: ошибка при выполнении команды с помощью Invoke-Command?

РЕДАКТИРОВАТЬ:

Я нашел способ обойти эту проблему. Пожалуйста, обратите внимание, что это не определенное решение, а обходной путь.

Вместо запуска Invoke-Command -Credential $mycreds -VMName $VMName -ScriptBlock {host}, запустите:

Invoke-Command -ComputerName "MyHostComputer" -ScriptBlock {Invoke-Command -Credential $mycreds -VMName $VMName -ScriptBlock {host}}

Эта команда, по сути, invoke-commanding на хост-машине и использует хост-компьютер для запуска Invoke-Command в ВМ,

Это определенно не идеальное решение, но прежде чем кто-либо найдет лучшее решение, я пока остановлюсь на этом.

...