添加 Windows 个从站
Add a Windows Slave
我在 Linux 上有一个 Jenkins Master 运行ning,我想添加一个 Windows Slave。
目前我无法启动奴隶:
1) Java 网络启动
-> Java Web Start 在 JDK 11 中被删除(并且从来不是 OpenJDK 的一部分),所以我们想将 Jenkins 切换到 运行 使用 openjdk11,这将不再有效,所以我什至没有尝试这个。
2) Windows 从插件
-> 我遵循 Troubleshootings 并确保端口 135、139 和 445 可从我的 Jenkins 主机访问。
遗憾的是,我仍然收到错误消息:
2019-06-12 14:54:28] [windows-slaves] Connecting to 1.2.3.4
ERROR: Message not found for errorCode: 0xC0000001
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000001
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:121)
at org.jinterop.dcom.core.JIComServer.initialise(JIComServer.java:479)
at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:427)
at org.jvnet.hudson.wmi.WMI.connect(WMI.java:59)
at hudson.os.windows.ManagedWindowsServiceLauncher.launch(ManagedWindowsServiceLauncher.java:208)
at hudson.slaves.SlaveComputer.call(SlaveComputer.java:294)
at jenkins.util.ContextResettingExecutorService.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService.call(ImpersonatingExecutorService.java:71)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/1.2.3.4
jcifs.util.transport.TransportException
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at jcifs.util.transport.Transport.readn(Transport.java:29)
at jcifs.smb.SmbTransport.peekKey(SmbTransport.java:388)
at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:288)
at jcifs.smb.SmbTransport.doConnect(SmbTransport.java:319)
at jcifs.util.transport.Transport.run(Transport.java:241)
at java.lang.Thread.run(Thread.java:748)
at jcifs.util.transport.Transport.run(Transport.java:258)
at java.lang.Thread.run(Thread.java:748)
at jcifs.smb.SmbTransport.connect(SmbTransport.java:309)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:156)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
at jcifs.smb.SmbFile.connect(SmbFile.java:954)
at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:77)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:66)
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)
at rpc.ncacn_np.RpcTransport.attach(RpcTransport.java:90)
at rpc.Stub.attach(Stub.java:104)
at rpc.Stub.call(Stub.java:109)
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:119)
... 11 more
有人有什么建议吗?还是上述两种方法的替代方法?
编辑:
我不得不提一下,master 是 运行ning on-prem,slave 是 Azure VM。有一个 ExpressRoute,正如我所说,端口(135、139、445)是打开的(这些端口从主站到从站的 telnet 成功)。
我放弃了 Windows 从属插件。
相反,我通过 SSH 成功连接到 slave!
我的 Windows 2019 服务器默认没有安装 SSH 守护进程,所以我不得不 运行 这些命令:
# install openSSH server
Add-WindowsCapability -Online -Name $(Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Server*' | Select -ExpandProperty Name)
# start sshd
Start-Service sshd
# enable sshd as a service
Set-Service -Name sshd -StartupType 'Automatic'
# check if firewall rule was automatically created
Get-NetFirewallRule -Name *ssh*
提示:Java >= 8 必须在从站上安装(并添加到 PATH)。
您需要启用 SMB1(参见 JENKINS-46255):
Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol
Set-SmbServerConfiguration -EnableSMB1Protocol $true
但是你会面临更多的问题。请参阅下面的简短摘要...
您需要授予对 "WBEM Scripting Locator" 的访问权限(参见 JENKINS-4859):
$user = [System.Security.Principal.NTAccount]"$env:userdomain$env:username"
$key = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(
"CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6}", "ReadWriteSubTree", "TakeOwnership")
$acl=$key.GetAccessControl()
$acl.SetOwner($user)
$key.SetAccessControl($acl)
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
[System.Security.Principal.NTAccount]"Administrators",
"FullControl", "ContainerInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$key.SetAccessControl($acl)
然后将网络配置文件切换为专用:
Get-NetConnectionProfile
Set-NetConnectionProfile -InterfaceIndex <idx> -NetworkCategory private
禁用防火墙(无法找出需要添加以启用 DCOM 访问的规则)。
安装 OpenJDK 1.8+,确保 java.exe
在系统路径上。
同时安装 .NET 3.5 非 HTTP 远程激活功能(通过服务器管理器 -> 添加功能)。
最终结果:
有关详细信息,请参阅 Windows agents fail to start via DCOM 页面,其中有大量有用的提示。
我在 Linux 上有一个 Jenkins Master 运行ning,我想添加一个 Windows Slave。 目前我无法启动奴隶:
1) Java 网络启动
-> Java Web Start 在 JDK 11 中被删除(并且从来不是 OpenJDK 的一部分),所以我们想将 Jenkins 切换到 运行 使用 openjdk11,这将不再有效,所以我什至没有尝试这个。
2) Windows 从插件
-> 我遵循 Troubleshootings 并确保端口 135、139 和 445 可从我的 Jenkins 主机访问。 遗憾的是,我仍然收到错误消息:
2019-06-12 14:54:28] [windows-slaves] Connecting to 1.2.3.4
ERROR: Message not found for errorCode: 0xC0000001
org.jinterop.dcom.common.JIException: Message not found for errorCode: 0xC0000001
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:121)
at org.jinterop.dcom.core.JIComServer.initialise(JIComServer.java:479)
at org.jinterop.dcom.core.JIComServer.<init>(JIComServer.java:427)
at org.jvnet.hudson.wmi.WMI.connect(WMI.java:59)
at hudson.os.windows.ManagedWindowsServiceLauncher.launch(ManagedWindowsServiceLauncher.java:208)
at hudson.slaves.SlaveComputer.call(SlaveComputer.java:294)
at jenkins.util.ContextResettingExecutorService.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService.call(ImpersonatingExecutorService.java:71)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: jcifs.smb.SmbException: Failed to connect: 0.0.0.0<00>/1.2.3.4
jcifs.util.transport.TransportException
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at jcifs.util.transport.Transport.readn(Transport.java:29)
at jcifs.smb.SmbTransport.peekKey(SmbTransport.java:388)
at jcifs.smb.SmbTransport.negotiate(SmbTransport.java:288)
at jcifs.smb.SmbTransport.doConnect(SmbTransport.java:319)
at jcifs.util.transport.Transport.run(Transport.java:241)
at java.lang.Thread.run(Thread.java:748)
at jcifs.util.transport.Transport.run(Transport.java:258)
at java.lang.Thread.run(Thread.java:748)
at jcifs.smb.SmbTransport.connect(SmbTransport.java:309)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:156)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
at jcifs.smb.SmbFile.connect(SmbFile.java:954)
at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:77)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:66)
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)
at rpc.ncacn_np.RpcTransport.attach(RpcTransport.java:90)
at rpc.Stub.attach(Stub.java:104)
at rpc.Stub.call(Stub.java:109)
at org.jinterop.winreg.smb.JIWinRegStub.winreg_OpenHKCR(JIWinRegStub.java:119)
... 11 more
有人有什么建议吗?还是上述两种方法的替代方法?
编辑:
我不得不提一下,master 是 运行ning on-prem,slave 是 Azure VM。有一个 ExpressRoute,正如我所说,端口(135、139、445)是打开的(这些端口从主站到从站的 telnet 成功)。
我放弃了 Windows 从属插件。 相反,我通过 SSH 成功连接到 slave!
我的 Windows 2019 服务器默认没有安装 SSH 守护进程,所以我不得不 运行 这些命令:
# install openSSH server
Add-WindowsCapability -Online -Name $(Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Server*' | Select -ExpandProperty Name)
# start sshd
Start-Service sshd
# enable sshd as a service
Set-Service -Name sshd -StartupType 'Automatic'
# check if firewall rule was automatically created
Get-NetFirewallRule -Name *ssh*
提示:Java >= 8 必须在从站上安装(并添加到 PATH)。
您需要启用 SMB1(参见 JENKINS-46255):
Enable-WindowsOptionalFeature -Online -FeatureName smb1protocol
Set-SmbServerConfiguration -EnableSMB1Protocol $true
但是你会面临更多的问题。请参阅下面的简短摘要...
您需要授予对 "WBEM Scripting Locator" 的访问权限(参见 JENKINS-4859):
$user = [System.Security.Principal.NTAccount]"$env:userdomain$env:username"
$key = [Microsoft.Win32.Registry]::ClassesRoot.OpenSubKey(
"CLSID\{76A64158-CB41-11D1-8B02-00600806D9B6}", "ReadWriteSubTree", "TakeOwnership")
$acl=$key.GetAccessControl()
$acl.SetOwner($user)
$key.SetAccessControl($acl)
$rule = New-Object System.Security.AccessControl.RegistryAccessRule(
[System.Security.Principal.NTAccount]"Administrators",
"FullControl", "ContainerInherit", "None", "Allow")
$acl.AddAccessRule($rule)
$key.SetAccessControl($acl)
然后将网络配置文件切换为专用:
Get-NetConnectionProfile
Set-NetConnectionProfile -InterfaceIndex <idx> -NetworkCategory private
禁用防火墙(无法找出需要添加以启用 DCOM 访问的规则)。
安装 OpenJDK 1.8+,确保 java.exe
在系统路径上。
同时安装 .NET 3.5 非 HTTP 远程激活功能(通过服务器管理器 -> 添加功能)。
最终结果:
有关详细信息,请参阅 Windows agents fail to start via DCOM 页面,其中有大量有用的提示。