Jenkins Slave Agent als Windows Dienst mit OpenJDK

Jenkins nutze ich beruflich ziemlich intensiv, um gewisse Sachen zu automatisieren. Dadurch bin ich in der Lage, gewisse Tätigkeiten stark zu standardisieren. Erst neulich habe ich mir eine Testumgebung neu aufgebaut, die auf Windows Server 2019 und SQL Server 2019 basiert. Für die Kommunikation zwischen Jenkins Server und Host wird ein so genannter Slave Agent installiert. Dieser basiert auf Java. In meiner neuen Testumgebung sollte für alles Java basierte ausschließlich OpenJDK zum Einsatz kommen. Mit OpenJDK gibt es jedoch standardmäßig keine Möglichkeit, JNLP Dateien auszuführen, da die “javaws” Komponente nicht mehr vorhanden ist. Damit war es immer sehr einfach, einen Slave Agent direkt als Windows Dienst einzurichten. Eine Erweiterung mittels “IcedTea-Web”, um Java Web Start wieder nutzen zu können, wollte ich vermeiden.

In der Jenkins Dokumentation bin ich dann auf den “Windows Service Wrapper” aufmerksam geworden. Damit lässt sich Start des Jenkins Slave Agents, wie er über die Kommandozeile aufgerufen wird, auch als Dienst konfigurieren.

Jenkins Slave Agent Konfiguration

Die aktuelle Version des Windows Service Wrapper lässt sich auf der Github Seite des Projekts herunterladen.

Ich habe mich für „WinSW.NET4.exe“ Version entschieden. Diese habe ich in meinem zukünftigen Stammverzeichnis für den Jenkins Agent unter “E:\Jenkins\jenkins-slave.exe” abgelegt. Zusätzlich muss jetzt noch eine dazu passende XML Datei angelegt werden, in der die für den Agent passende Konfiguration abgelegt wird. Die Datei wird als “E:\Jenkins\jenkins-slave.xml” angelegt und bekommt folgenden Inhalt.

<service>
  <id>JenkinsSlaveAgent</id>
  <name>Jenkins Slave Agent</name>
  <description>This service runs a Jenkins slave agent</description>
  <executable>E:\JAVA\openjdk\bin\java.exe</executable>
  <arguments>-jar "%BASE%\agent.jar" -jnlpUrl http://foo.bar:8080/computer/JENKINSSLAVE/slave-agent.jnlp -secret 963e1fdaf1e7f256e0fca3fb36f16098588085fb2413f134e106c8eb976db8ab -workDir E:\Jenkins</arguments>
  <logmode>rotate</logmode>
  <onfailure action="restart">
    <download from=“http://foo.bar:8080/jnlpJars/agent.jar" to="%BASE%\agent.jar">
      <extensions>
        <extension className="winsw.Plugins.RunawayProcessKiller.RunawayProcessKillerExtension" enabled="true" id="killOnStartup">
          <pidfile>%BASE%\jenkins_slave.pid</pidfile>
          <stopTimeout>5000</stopTimeout>
          <stopParentFirst>false</stopParentFirst>
        </extension>
      </extensions>
    </download>
  </onfailure>
</service>

In der XML Datei müssen die rot markierten Einträge angepasst werden.

“<executable>” Hier wird der Pfad zum OpenJDK angegeben
„<arguments>” Hier wird der Kommandozeilen Aufruf des Jenkins Knotens eingefügt. Der Teil mit “agent.jar” wird durch “%BASE%\agent.jar” ersetzt. Somit wird immer das lokal vorhandene jar File verwendet.
“<download>” Damit jeweils die aktuelle Version des agent.jar genutzt wird, muss der eigene Server samt Port angegeben werden.

Wenn die Konfigurationsarbeiten abgeschlossen sind, kann der Slave Agent als Dienst hinzugefügt werden. Dazu wird die “jenkins-slave.exe” mit dem Parameter “install” aufgerufen.

jenkins-slave.exe install

Danach kann über den Dienste Manager der neue Dienst “Jenkins Slave Agent” gestartet werden, damit die Verbindung zwischen Jenkins Server und Slave hergestellt wird und die ersten Projekte ausgeführt werden können.