1

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 ページを参照した後、考えられる原因は次のとおりです。

  1. VM は存在するが実行されていない
  2. ゲスト OS は PowerShell Direct をサポートしていません
  3. Powershell はゲストではまだ利用できません:

    • オペレーティング システムはまだ起動していません
    • OS が正常に起動しない
    • 一部の起動時イベントにはユーザー入力が必要です
  4. -Credential を使用して資格情報を明示的に渡す必要がある現在のビルドのバグ。回避策として Restart-Service -Name vmicvmsession を実行します。

しかし、Jenkins からの出力から、接続しようとしていた VM は "Running" であり、正常に起動されています。

次に、ホストから直接 VM に「Invoke-Command」と「New-PSSession」を試みたところ、VM に接続できました。

Windowsサーバー2019の代わりにWindows 10マシンにインストールされたJenkinsでも同じことを試しましたが、すべて機能します。

ユーザー管理情報は、Jenkinsを実行しているログインユーザーが「管理者」と「hyper-v管理者」の両方です。

これらは私がデバッグに使用した参照の一部であり、問​​題が何であるかを見つけることができません:

  1. PowerShell と Jenkinsを使用したリモート アクセスですが、これがどのように機能するのか正確にはわかりません。

  2. Jenkins を使用して Powershell スクリプトを実行する

  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して VM に対して実行されます。

それは間違いなく完璧な解決策ではありませんが、誰かがより良い解決策を見つける前に、私は今のところこれで行きます.

4

0 に答える 0