在命令行中将 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 将 运行 永远!