在命令行中将Jenkins代理安装为Windows服务

92dk7w1h  于 8个月前  发布在  Jenkins
关注(0)|答案(4)|浏览(81)

我一直在寻找很多关于如何在命令行中安装服务的谷歌(所以没有手动交互),但我坚持如何获得jenkins-slave.exe
我找到了那些指令https://wiki.jenkins.io/display/JENKINS/Installing+Jenkins+as+a+Windows+service,但我不知道如何获得可执行文件。我已经下载并运行slave.jar与正确的关键,连接代理,但exe没有生成。
我发现这个页面https://github.com/kohsuke/winsw/blob/master/doc/installation.md#winsw-installation-guide手动安装它,但这听起来像重新发明了轮子时,jar可以做到这一点。加上有风险的WinSW.exe是不同的,并没有得到更新的插件(我看到一些自动更新代码在它)。
那么,有没有一种方法可以下载jenkins-slave.exe或生成它?或者有没有一种方法可以从slave.jar在命令行中运行“作为服务安装”?

mrzz3bfm

mrzz3bfm1#

为了回答我自己的问题,在联系了插件开发人员之后:
没有直接从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命令(从Node页面)以获取私钥,例如java -jar slave.jar -jnlpUrl http://jenkins...
  • 从Jenkins下载slave.jar文件(从JNLP命令获得)
  • 下载服务 Package 器可执行文件,例如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安装服务
7dl7o3gd

7dl7o3gd2#

我会做的是:

  • 下载slave.jar文件(从Jenkins的节点页面)
  • 从节点页面复制java -jar slave.jar -jnlpUrl http://<YOUR URL HERE>命令
  • 将此命令粘贴到新的.bat文件中并保存
  • 注册计划任务以在Windows启动时运行此.bat文件
mpgws1up

mpgws1up3#

或者,有没有一种方法可以在命令行中从slave.jar运行“Install as a service”?
我不使用jenkins-slave.exe,而是使用一个自定义脚本,在该脚本中,当使用密钥启动java -jar slave.jar时,我可以控制要为Jenkins从节点设置的确切环境变量,您可以在Jenkins主节点页面中看到该新从节点的密钥。
要将slave.jar从主服务器获取到从服务器,请从Windows从服务器执行:

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的软件包管理器。
要完全自动化slave的声明端,请使用Web API创建slave和一个groovy script to retrieve the Jenkins node/slave secret JnlpMac key
请参阅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 =

knpiaxh1

knpiaxh14#

使用此Windows服务 Package 器也可以工作:https://github.com/winsw/winsw
遵循它们的安装,但您应该使用所需的配置更新xml,确保在xml中删除所有**"in路径,并在代理的jenkins主配置页面中禁用websockets**:
x1c 0d1x的数据
一步一步:下载exe:来自https://github.com/winsw/winsw/releases的WinSW-x64.exe在代理上创建工作区目录并将其粘贴到那里,将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>

字符串
使用选项延迟自动启动,以确保所有的网络服务启动,Jenkins连接不能失败.我建议使用注册表项给给予服务更多的时间来启动:插入注册表项给给予服务更多的时间来启动:

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将永远运行!
另一个建议:启用BIOS设置启动电脑开机。如果你有麻烦与电源中断。

相关问题