Я пытался использовать 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, посвященной этой проблеме , возможными причинами являются:
- ВМ существует, но не работает
- Гостевая ОС не поддерживает PowerShell Direct
Powershell еще не доступен в гостевой системе:
- Операциясистема еще не загрузилась
- ОС не может загрузиться правильно
- Некоторое событие во время загрузки требует ввода пользователя
- Ошибка в текущих сборках, когда учетные данные должны явно передаваться с -Credential. Запустите Restart-Service -Name vmicvmsession как обходной путь.
Однако из выходных данных Jenkins виртуальная машина, к которой я пытался подключиться, «работает», и она правильно загружена.
Затем я попытался "Invoke-Command" и "New-PSSession" в виртуальную машину с хоста напрямую, и я смог подключиться к виртуальной машине.
I 'Мы также попробовали то же самое в Jenkins, установленном на компьютере с Windows 10 вместо сервера Windows 2019, и все работает.
Что касается административной информации пользователя, то пользователь, вошедший в систему под управлением Jenkins, является "администратор "и" администратор hyper-v ".
Вот некоторые ссылки, которые я использовал для отладки, и я не могу выяснить, в чем проблема:
Удаленный доступ с помощью PowerShell иДженкинс , но я не могу понять, как именно это работает.
Запуск сценариев Powershell с использованием Jenkins
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
в ВМ,
Это определенно не идеальное решение, но прежде чем кто-либо найдет лучшее решение, я пока остановлюсь на этом.