11

我一直在谷歌上寻找很多关于如何在命令行中安装服务(所以没有手动交互)但我被困在如何获取 jenkins-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 手动安装它,但当 jar 可以做到时,这听起来像是重新发明了轮子. 此外,WinSW.exe 存在不同的风险,并且不会被插件更新(我在其中看到了一些自动更新代码)。

那么有没有办法可以下载 jenkins-slave.exe 或生成它?或者有没有办法从slave.jar在命令行中运行“作为服务安装”?

4

4 回答 4

16

在联系插件开发人员后,回答我自己的问题:

没有直接从 Jenkins 下载 exe 的实际方法,slave.jar 通过远程协议从主服务器获取它。我创建了一个请求,以便能够通过 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.exejenkins-slave.exe
  • 设置用于运行服务的 XML(在模块中或直接在 winsw 网站上可用)
  • 设置从配置 XML 文件(在模块源代码中可用)
  • 然后使用安装服务jenkins-slave.exe install
于 2017-08-10T01:54:41.183 回答
4

我会做的是:

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

或者有没有办法从slave.jar在命令行中运行“作为服务安装”?

我不使用jenkins-slave.exe,而是使用自定义脚本,我可以在其中控制我想为 Jenkins 从站设置的确切环境变量,当java -jar slave.jar使用密钥启动时,您可以在该新从站的 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 - 软件管理自动化,Windows 的包管理器。


要完全自动化从站的声明端,请使用 Web API 创建从站,并使用groovy 脚本来检索 Jenkins 节点/从站密钥 JnlpMac 密钥
请参阅此脚本以进行创建
以及获取密钥的常规脚本(使用 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 =
于 2017-06-26T04:52:57.233 回答
0

使用此 Windows 服务包装器也可以: https ://github.com/winsw/winsw

按照他们的安装,但是您应该使用所需的配置更新 xml,确保删除xml 中的所有路径,并在代理jenkins 主配置页面中禁用 websockets :

禁用 websocket 代理配置选项

一步一步:从https://github.com/winsw/winsw/releases下载 exe:WinSW-x64.exe 在代理上创建您的工作区目录并将其粘贴到那里,将 WinSW-x64.exe 重命名为 jenkins-从属程序

在那里复制你的 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 将永远运行!

于 2022-02-15T19:59:20.897 回答