在命令行中将 Jenkins slave 安装为 Windows 服务
Install Jenkins slave as a Windows service in command line
我在 Google 上看了很多关于如何在
命令行(因此无需手动交互)但我坚持如何
得到詹金斯-slave.exe
我找到了那些指令
https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+as+a+Windows+service
但我不知道如何获取可执行文件。我已经下载 运行
slave.jar 右键,连接slave,但是exe
未生成。
我找到了这个页面
https://github.com/kohsuke/winsw/blob/master/doc/installation.md#winsw-installation-guide
手动安装,但这听起来像是重新发明了轮子
罐子可以做到。另外还有 WinSW.exe 不同的风险
没有被插件更新(我在里面看到了一些自动更新代码)。
那么有什么方法可以下载或生成 jenkins-slave.exe 吗?
或者有没有办法在命令行中 运行 "Install as a service"
slave.jar?
Or is there a way to run the "Install as a service" in command line from the slave.jar?
我不使用 jenkins-slave.exe
,而是使用自定义脚本,在使用密钥启动 java -jar slave.jar
时,我可以在其中控制我想为 Jenkins slave 设置的确切环境变量您可以在 Jenkins 主节点页面中看到该新从节点。
要从master获取slave.jar
到slave,从slave Windows server:
执行
curl -o slave.jar https://your.server/jenkins/jnlpJars/slave.jar
为了替换 jenkins-slave.exe,我使用声明为 Windows 服务的脚本,其中 nssm
脚本类似于agent.bat
:
set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0
set PATH=D:\Tools\SonarRunner\bin;%PATH%
set M2_HOME=D:\Tools\apache-maven-3.5.0
set PATH=%M2_HOME%\bin;%PATH%
set PATH=D:\Tools\apache-ant-1.9.3\bin;%PATH%
set GH=D:\Tools\Git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%
set PATH=%JAVA_HOME%\bin;%PATH%
set WORKSPACE_FOLDER=D:\Jenkins\workspace
set GIT_WORKSPACE_FOLDER=D:\Jenkins\workspace
java -Xmx768m -jar slave.jar -jnlpUrl https://your.server/jenkins/computer/<SlaveName>/slave-agent.jnlp -secret 87ef3d...
该脚本随后被称为 Windows 服务,运行 由专用用户帐户调用:
runas /user:<domain>\<jenkinsUser> cmd ( enter `jenkinsUser` Windows password )
D:\Tools\nssm-2.24\win64\nssm.exe install <SlaveName> D:\Jenkins\agent.bat
它的 Windows 服务然后被配置:
sc config <SlaveName> obj= <domain>\<jenkinsUsers> password= <jenkinsUser password>
sc config <SlaveName> start= auto
关于自动安装其他软件:参见 Chocolatey - Software Management Automation,Windows 的包管理器。
要完全自动化从站的声明端,请使用网络 API 创建从站,然后 .
参见 this script for the creation。
groovy 脚本(使用 Jenkins 2.46 或更新版本)获取密钥:
echo 'println jenkins.model.Jenkins.instance.nodesObject.getNode("my-agent")?.computer?.jnlpMac' \
| java -jar ~/Downloads/jenkins-cli.jar -s https://jenkins/ groovy =
在联系插件开发人员后回答我自己的问题:
没有直接从 Jenkins 下载 exe 的实际方法,slave.jar 通过远程协议从 master 获取它。我已经创建了一个请求,可以通过 URL(根据开发者的建议)下载它,因此它可能在将来可用。
现在可执行文件是重命名的 Windows Service Wrapper 二进制文件:https://github.com/kohsuke/winsw 所以我以相同的方式使用了这个二进制文件。
关于 WinSW 和 XML 文件使用的配置,我使用了 GitHub 存储库 https://github.com/jenkinsci/windows-slave-installer-module 中的配置。这些版本在配置方面是兼容的。
所以基本上我下载了 exe,从 Jenkins 获取私钥并使用原始插件的配置创建服务。然后我使用 jenkins-slave.exe install
.
安装服务
一步一步:
- 从 Jenkins(从节点页面)获取 JNLP 命令以获取私钥,例如
java -jar slave.jar -jnlpUrl http://jenkins...
- 从 Jenkins 下载
slave.jar
文件(从 JNLP 命令获取)
- 下载服务包装器可执行文件,例如
http://repo.jenkins-ci.org/public/com/sun/winsw/winsw/2.1.0/winsw-2.1.0-bin.exe
- 将
winsw-2.1.0-bin.exe
重命名为 jenkins-slave.exe
- 设置 XML 用于 运行 服务(在模块中或直接在 winsw 网站上可用)
- 设置从属配置XML文件(在模块源代码上可用)
- 然后使用
jenkins-slave.exe install
安装服务
我会做的是:
- 下载
slave.jar
文件(从节点的 Jenkins 页面)
- 从节点页面复制
java -jar slave.jar -jnlpUrl http://<YOUR URL HERE>
命令
- 将此命令粘贴到新的
.bat
文件中并保存
- 在 Windows 启动时将计划任务注册到 运行 这个
.bat
文件
使用这个 windows 服务包装器也可以:
https://github.com/winsw/winsw
按照他们的安装,但是你应该用你想要的配置更新 xml,一定要删除 xml 中路径中的所有 " 和在agent的jenkins master配置页面禁用websockets:
一步一步:
从 https://github.com/winsw/winsw/releases 下载 exe:WinSW-x64.exe
在代理上创建 workspace-dir 并将其粘贴到那里,将 WinSW-x64.exe 重命名为 jenkins-slave.exe
将您的 jenkins-slave.xml 复制到那里,它应该看起来像:
<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>This service runs Jenkins continuous integration system.</description>
<env name="JENKINS_HOME" value="%BASE%"/>
<executable>C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.275-1\jre\bin\java.exe</executable>
<arguments>-jar %BASE%\slave.jar -jnlpUrl https://<your_jenkins>.jenkins.bshg.com/computer/RBGWCW0281/jenkins-agent.jnlp -secret <your_secret> -workDir C:\<workspace-dir>\ -noCertificateCheck</arguments>
<logmode>rotate</logmode>
<onfailure action="restart" />
<delayedAutoStart/>
<!--
If uncommented, download the Remoting version provided by the Jenkins master.
Enabling for HTTP implies security risks (e.g. replacement of JAR via DNS poisoning). Use on your own risk.
NOTE: This option may fail to work correctly (e.g. if Jenkins is located behind HTTPS with untrusted certificate).
In such case the old agent version will be used; you can replace slave.jar manually or to specify another download URL.
-->
<download from="https://<your_jenkins>.jenkins.bshg.com/jnlpJars/slave.jar" to="%BASE%\slave.jar"/>
<!--
In the case WinSW gets terminated and leaks the process, we want to abort
these runaway JAR processes on startup to prevent "Slave is already connected errors" (JENKINS-28492).
-->
<extensions>
<!-- This is a sample configuration for the RunawayProcessKiller extension. -->
<extension enabled="true"
className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension"
id="killOnStartup">
<pidfile>%BASE%\jenkins_agent.pid</pidfile>
<stopTimeout>5000</stopTimeout>
<stopParentFirst>false</stopParentFirst>
</extension>
</extensions>
</service>
使用选项delayed Auto start,保证所有的网络服务都启动,jenkins connect不会失败。
我建议使用注册表项来为服务提供更多启动时间:
插入 registry-key 以使服务有更多时间启动:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\]
"ServicesPipeTimeout"=dword:0001d4c0
您可以在这里查看详细信息:https://serverfault.com/questions/622432/how-do-i-increase-windows-service-startup-timeout
最后,我建议至少每周自动启动一次你的 jenkins。有计划任务:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2020-04-30T12:47:51.8471206</Date>
<Author>Domain/User</Author>
<Description>Some Comment</Description>
<URI>\CI-Restart</URI>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2020-05-01T01:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>whatever</UserId>
<LogonType>Password</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>shutdown</Command>
<Arguments>/r /f /t 10 /d p:2:3 /c "CI-reconnect"</Arguments>
</Exec>
</Actions>
</Task>
现在做(有管理员权限)
- jenkins-slave.exe 安装
- jenkins-slave.exe 启动
您的 Jenkins 将 运行 永远!
我在 Google 上看了很多关于如何在 命令行(因此无需手动交互)但我坚持如何 得到詹金斯-slave.exe
我找到了那些指令 https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+as+a+Windows+service 但我不知道如何获取可执行文件。我已经下载 运行 slave.jar 右键,连接slave,但是exe 未生成。
我找到了这个页面 https://github.com/kohsuke/winsw/blob/master/doc/installation.md#winsw-installation-guide 手动安装,但这听起来像是重新发明了轮子 罐子可以做到。另外还有 WinSW.exe 不同的风险 没有被插件更新(我在里面看到了一些自动更新代码)。
那么有什么方法可以下载或生成 jenkins-slave.exe 吗? 或者有没有办法在命令行中 运行 "Install as a service" slave.jar?
Or is there a way to run the "Install as a service" in command line from the slave.jar?
我不使用 jenkins-slave.exe
,而是使用自定义脚本,在使用密钥启动 java -jar slave.jar
时,我可以在其中控制我想为 Jenkins slave 设置的确切环境变量您可以在 Jenkins 主节点页面中看到该新从节点。
要从master获取slave.jar
到slave,从slave Windows server:
curl -o slave.jar https://your.server/jenkins/jnlpJars/slave.jar
为了替换 jenkins-slave.exe,我使用声明为 Windows 服务的脚本,其中 nssm
脚本类似于agent.bat
:
set PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0
set PATH=D:\Tools\SonarRunner\bin;%PATH%
set M2_HOME=D:\Tools\apache-maven-3.5.0
set PATH=%M2_HOME%\bin;%PATH%
set PATH=D:\Tools\apache-ant-1.9.3\bin;%PATH%
set GH=D:\Tools\Git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%PATH%
set PATH=%JAVA_HOME%\bin;%PATH%
set WORKSPACE_FOLDER=D:\Jenkins\workspace
set GIT_WORKSPACE_FOLDER=D:\Jenkins\workspace
java -Xmx768m -jar slave.jar -jnlpUrl https://your.server/jenkins/computer/<SlaveName>/slave-agent.jnlp -secret 87ef3d...
该脚本随后被称为 Windows 服务,运行 由专用用户帐户调用:
runas /user:<domain>\<jenkinsUser> cmd ( enter `jenkinsUser` Windows password )
D:\Tools\nssm-2.24\win64\nssm.exe install <SlaveName> D:\Jenkins\agent.bat
它的 Windows 服务然后被配置:
sc config <SlaveName> obj= <domain>\<jenkinsUsers> password= <jenkinsUser password>
sc config <SlaveName> start= auto
关于自动安装其他软件:参见 Chocolatey - Software Management Automation,Windows 的包管理器。
要完全自动化从站的声明端,请使用网络 API 创建从站,然后
参见 this script for the creation。
groovy 脚本(使用 Jenkins 2.46 或更新版本)获取密钥:
echo 'println jenkins.model.Jenkins.instance.nodesObject.getNode("my-agent")?.computer?.jnlpMac' \
| java -jar ~/Downloads/jenkins-cli.jar -s https://jenkins/ groovy =
在联系插件开发人员后回答我自己的问题:
没有直接从 Jenkins 下载 exe 的实际方法,slave.jar 通过远程协议从 master 获取它。我已经创建了一个请求,可以通过 URL(根据开发者的建议)下载它,因此它可能在将来可用。
现在可执行文件是重命名的 Windows Service Wrapper 二进制文件:https://github.com/kohsuke/winsw 所以我以相同的方式使用了这个二进制文件。
关于 WinSW 和 XML 文件使用的配置,我使用了 GitHub 存储库 https://github.com/jenkinsci/windows-slave-installer-module 中的配置。这些版本在配置方面是兼容的。
所以基本上我下载了 exe,从 Jenkins 获取私钥并使用原始插件的配置创建服务。然后我使用 jenkins-slave.exe install
.
一步一步:
- 从 Jenkins(从节点页面)获取 JNLP 命令以获取私钥,例如
java -jar slave.jar -jnlpUrl http://jenkins...
- 从 Jenkins 下载
slave.jar
文件(从 JNLP 命令获取) - 下载服务包装器可执行文件,例如
http://repo.jenkins-ci.org/public/com/sun/winsw/winsw/2.1.0/winsw-2.1.0-bin.exe
- 将
winsw-2.1.0-bin.exe
重命名为jenkins-slave.exe
- 设置 XML 用于 运行 服务(在模块中或直接在 winsw 网站上可用)
- 设置从属配置XML文件(在模块源代码上可用)
- 然后使用
jenkins-slave.exe install
安装服务
我会做的是:
- 下载
slave.jar
文件(从节点的 Jenkins 页面) - 从节点页面复制
java -jar slave.jar -jnlpUrl http://<YOUR URL HERE>
命令 - 将此命令粘贴到新的
.bat
文件中并保存 - 在 Windows 启动时将计划任务注册到 运行 这个
.bat
文件
使用这个 windows 服务包装器也可以: https://github.com/winsw/winsw
按照他们的安装,但是你应该用你想要的配置更新 xml,一定要删除 xml 中路径中的所有 " 和在agent的jenkins master配置页面禁用websockets:
一步一步: 从 https://github.com/winsw/winsw/releases 下载 exe:WinSW-x64.exe 在代理上创建 workspace-dir 并将其粘贴到那里,将 WinSW-x64.exe 重命名为 jenkins-slave.exe
将您的 jenkins-slave.xml 复制到那里,它应该看起来像:
<service>
<id>jenkins</id>
<name>Jenkins</name>
<description>This service runs Jenkins continuous integration system.</description>
<env name="JENKINS_HOME" value="%BASE%"/>
<executable>C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.275-1\jre\bin\java.exe</executable>
<arguments>-jar %BASE%\slave.jar -jnlpUrl https://<your_jenkins>.jenkins.bshg.com/computer/RBGWCW0281/jenkins-agent.jnlp -secret <your_secret> -workDir C:\<workspace-dir>\ -noCertificateCheck</arguments>
<logmode>rotate</logmode>
<onfailure action="restart" />
<delayedAutoStart/>
<!--
If uncommented, download the Remoting version provided by the Jenkins master.
Enabling for HTTP implies security risks (e.g. replacement of JAR via DNS poisoning). Use on your own risk.
NOTE: This option may fail to work correctly (e.g. if Jenkins is located behind HTTPS with untrusted certificate).
In such case the old agent version will be used; you can replace slave.jar manually or to specify another download URL.
-->
<download from="https://<your_jenkins>.jenkins.bshg.com/jnlpJars/slave.jar" to="%BASE%\slave.jar"/>
<!--
In the case WinSW gets terminated and leaks the process, we want to abort
these runaway JAR processes on startup to prevent "Slave is already connected errors" (JENKINS-28492).
-->
<extensions>
<!-- This is a sample configuration for the RunawayProcessKiller extension. -->
<extension enabled="true"
className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension"
id="killOnStartup">
<pidfile>%BASE%\jenkins_agent.pid</pidfile>
<stopTimeout>5000</stopTimeout>
<stopParentFirst>false</stopParentFirst>
</extension>
</extensions>
</service>
使用选项delayed Auto start,保证所有的网络服务都启动,jenkins connect不会失败。 我建议使用注册表项来为服务提供更多启动时间: 插入 registry-key 以使服务有更多时间启动:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\]
"ServicesPipeTimeout"=dword:0001d4c0
您可以在这里查看详细信息:https://serverfault.com/questions/622432/how-do-i-increase-windows-service-startup-timeout
最后,我建议至少每周自动启动一次你的 jenkins。有计划任务:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2020-04-30T12:47:51.8471206</Date>
<Author>Domain/User</Author>
<Description>Some Comment</Description>
<URI>\CI-Restart</URI>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2020-05-01T01:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>whatever</UserId>
<LogonType>Password</LogonType>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>shutdown</Command>
<Arguments>/r /f /t 10 /d p:2:3 /c "CI-reconnect"</Arguments>
</Exec>
</Actions>
</Task>
现在做(有管理员权限)
- jenkins-slave.exe 安装
- jenkins-slave.exe 启动
您的 Jenkins 将 运行 永远!