Jenkins を使用して VM を自動的にテストしようとしています。これには、新しいコードを VM にコピーすることや、Powershell スクリプトを使用してホストから VM に特定のコマンドを実行することが含まれます。
ただし、Jenkins Freestyle および Pipeline プロジェクトで、hyper-V Windows 10 VM に対して「Invoke-Command」または「New-PSSession」を使用しようとすると、エラーが発生します。
これは、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
これは、フリースタイル プロジェクトの「Windows Powershell」ビルド ステップで作成した 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 の公式 Web ページを参照した後、考えられる原因は次のとおりです。
- VM は存在するが実行されていない
- ゲスト OS は PowerShell Direct をサポートしていません
Powershell はゲストではまだ利用できません:
- オペレーティング システムはまだ起動していません
- OS が正常に起動しない
- 一部の起動時イベントにはユーザー入力が必要です
- -Credential を使用して資格情報を明示的に渡す必要がある現在のビルドのバグ。回避策として Restart-Service -Name vmicvmsession を実行します。
しかし、Jenkins からの出力から、接続しようとしていた VM は "Running" であり、正常に起動されています。
次に、ホストから直接 VM に「Invoke-Command」と「New-PSSession」を試みたところ、VM に接続できました。
Windowsサーバー2019の代わりにWindows 10マシンにインストールされたJenkinsでも同じことを試しましたが、すべて機能します。
ユーザー管理情報は、Jenkinsを実行しているログインユーザーが「管理者」と「hyper-v管理者」の両方です。
これらは私がデバッグに使用した参照の一部であり、問題が何であるかを見つけることができません:
PowerShell と Jenkinsを使用したリモート アクセスですが、これがどのように機能するのか正確にはわかりません。
編集:
この問題を回避する方法を見つけました。これは確実な解決策ではなく、回避策であることに注意してください。
を実行する代わりに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
して VM に対して実行されます。
それは間違いなく完璧な解決策ではありませんが、誰かがより良い解決策を見つける前に、私は今のところこれで行きます.