Jenkins bietet standardmäßig eine REST API mit unterschiedlichen Datenformaten (XML und JSON) an. Über die REST API kann man die Informationen in einem Jenkins Server elektronisch auslesen und ggf. in einer anderen Anwendung auswerten. Ich hatte ja bereits im Artikel Jenkins Build via URL starten über die Fernsteuerung des Build Vorganges geschrieben. In diesem Artikel behandele ich die Abfrage von Informationen aus dem Jenkins Server mit PHP.
Die REST API vom Jenkins ist über den URL Zusatz /api/xml verfügbar. D.h. man nimmt z.B. die Hauptseite vom Jenkins. Das ist in einem Fall die URL http://ci-server:8080/jenkins. Erweitert man die URL mit dem Zusatz erhält man
http://ci-server:8080/jenkins/api/xml
Wenn man diese URL abfragt, erhält man die Informationen der Übersichtsseite direkt als XML in den Browser geliefert. Sehen wir uns die Daten mit dem Firebug an:
(Haw Haw, lustigerweise heisst der Hauptknoten noch Hudson und (noch) nicht jenkins ;-))
Im folgenden PHP Skript wird die gleiche Seite abgefragt und die Daten in eine SimpleXMLObject gewandelt. Durch das PHP SimpleXMLObject kann man sehr einfach auf die einzelnen Informationsknoten der XML Struktur zugreifen:
<?php
/* url to jenkins host */
$jenkins = "http://ci-server:8080/jenkins/";
/* url xml api extension */
$xmlapi = "/api/xml";
$handle = fopen($jenkins.$xmlapi, "r");
if ($handle) {
/* reading the site */
while (($buffer = fgets($handle, 4096)) !== false) {
/* converting buffer to xml object */
$xml = new SimpleXMLElement($buffer);
/* going thru each job */
foreach($xml->job as $job){
/* echo job infos */
echo "name: ".$job->name."<br>";
echo "url: ".$job->url."<br>";
echo "status: ".$job->color."<br>";
}
}
if (!feof($handle)) {
echo "an error occured";
}
/* closing the resource */
fclose($handle);
}
?>
Führt man diese Skript in einem LAMP Stack aus, erhält man das folgende Ergebnis:
name: certread
url: http://192.168.178.2:8080/jenkins/job/certread/
status: blue
name: chaos
url: http://192.168.178.2:8080/jenkins/job/chaos/
status: blue
name: gatling-test
url: http://192.168.178.2:8080/jenkins/job/gatling-test/
status: yellow
name: portscan
url: http://192.168.178.2:8080/jenkins/job/portscan/
status: blue
Jede Seite vom Jenkins liefern über die REST API unterschiedliche XML Knoten aus. Wenn wir uns die Struktur einer Job Seite mal genau anschauen, sieht diese im Firebug so aus:
Wie man schnell erkennen kann, erhält man hier alle Informationen zu den einzelnen Build-Vorgängen. Die XML Struktur enthält im Grunde alle (auch teilweise mehr) Informationen als die die man über die eigentliche Website im Browser angezeigt wird.
Ich finde die REST API vom Jenkins eine tolle Variante, um Jenkins in die Entwicklungslandschaft zu integrieren. Ich habe das bereits im Produktiv Betrieb eingesetzt und Build Informationen dynamisch in ein Projekt-Wiki angezeigt. Somit könnte man aktuelle Technische Informationen zum Projekt zentral allen Projektteilnehmern zur Verfügung stellen.