【问题标题】:Install Jenkins slave as a Windows service in command line在命令行中将 Jenkins slave 安装为 Windows 服务
【发布时间】:2017-06-26 01:05:25
【问题描述】:

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

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

【问题讨论】:

    标签: jenkins jenkins-slave


    【解决方案1】:

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

    没有直接从 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安装服务

    【讨论】:

    • 请问您对此有任何分步说明吗?我不理解高级大纲。
    • @DavidA 我已经添加了分步说明。
    • 谢谢,winsw-2.1.0-bin.exe是否需要重命名为jenkins-slave.exe?
    • 不,不是,这就是他们在 Jenkins 中的做法。
    【解决方案2】:

    我会做的是:

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

    【讨论】:

    • @alex 我相信是这样,我正在使用一个构建服务器,我可以使用我创建的这个 .bat 文件作为从属服务器运行。
    • 如果你这样做,确保你的jar文件的路径在脚本中是绝对的,这样它就可以在启动而不是登录时工作,即不要依赖环境变量。可能不需要那样,但是我过去在不使用 abso-paths 并执行这种 jenkins 预定启动行为时遇到过问题。
    【解决方案3】:

    或者有没有办法从 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 - Software Management Automation,Windows 的包管理器。


    要完全自动化从站的声明端,请使用 Web API 创建从站,并使用 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 =
    

    【讨论】:

    • 谢谢,但这类似于他们在使用 WinSW 的文档中描述的手动创建服务。我希望它是自动的。
    • @MaximeViargues 这就是为什么我提出“要完全自动化奴隶的声明方面”
    【解决方案4】:

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

    按照他们的安装,但你应该用你想要的配置更新xml,确保删除xml中路径中的所有"并在jenkins master中禁用websockets代理配置页面:

    一步一步: 从https://github.com/winsw/winsw/releases下载exe: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>
    

    使用选项delayed Auto start,保证所有网络服务都启动,保证jenkins connect不会失败。 我建议使用注册表项让服务有更多时间启动: 插入注册表项,让服务有更多时间启动:

    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 将永远运行!

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多