Jenkins via JSON-API abfragen
Die Stati der Jobs in einer Jenkinsinstallation werden in der Startseite des Jenkins recht übersichtlich dargestellt. Sollen jedoch nur aktuell laufende Jobs dargestellt werden fängt man je nach Menge von Jobs an zu scrollen. Auch muss dafür Jenkins dafür in einem Browsertab oder -fenster geöffnet werden.
Da viele Intranets Startseiten (zur Orientierung / Navigation) haben, liegt es nahe zumindest die laufenden Jobs in dieser Seite einzublenden.
Jenkins kann via JSON-API zu seinen Jobs abgefragt werden. Die aus einer solchen Abfrage gewonnen Informationen können dann in eine Webseite eingebunden werden.
Voraussetzungen
Um die Jenkinsabfrage in eine bestehende Seite einzubinden sind ein paar Voraussetzungen notwendig.
Verzeichnisstruktur auf dem Webserver
Bei Bedarf kann die Verzeichnisstruktur angepasst werden. Wichtig sind die Bilder, diese können vom Jenkins aus kopiert werden bzw. wenn die korrekte Bildadresse bekannt ist über diese eingebunden werden.
/
|
+-index.html
|
+-inc/
| |
| +-getJenkins.php
|
+-js/
| |
| +-getJenkins.js
|
+-pict/
| |
| +-blue_anime.gif
| +-grey_anime.gif
| +-red_anime.gif
| +-yellow_anime.gif
Webserver
Der Webserver muss PHP-Skripte ausführen können.
Webbrowser
Die Webbrowser sollten in der Lage sein JavaScript ausführen zu können. Sollte das nicht möglich sein, kann der nachfolgende PHP-Code direkt in die betreffende Webseite eingebaut werden. Dann müsste die Seite allerdings über einen Meta-Tag regelmäßig neu geladen werde, was je nach Inhalt und Aufbau der Seite mehr oder weniger schön ist.
Jenkins
Im Jenkins muss ein Benutzer für den API-Zugriff vorhanden sein und der API-Token diese Benutzer muss bekannt sein.
Jenkins über JSON abfragen: getJenkins.php
In dem nachfolgenden PHP-Sript wird die Jenkins-JSON-API angesprochen. Es wird ein JSON-Array zurückgeliefert. Über ein Schleife wird in den einzelnen Jobs abgefragt welche Farbe das Statussymbol in der Standard-Jenkinsansicht hat. Hat der Farbname den Zusatz „_anime“ so befindet sich dieser Job gerade in der Ausführung. Auf diese Jobs haben wir es abgesehen, diese filtern wir heraus und stellen sie der Einfachheit halber in einer Tabelle dar. Wird kein Job ausgeführt, wird eine entsprechende Meldung ausgegeben.
Das Skript kann zum Testen direkt aufgerufen werden.
<?php
/*
* PHP-Skript zum Auslesen eines json-Strings, der von Jenkins bereitgestellt
* wird.
* Die Arrayinformationen wird auf das Vorkommen von Stings überprüft und daraus
* die Information über zur Zeit laufenden Buildjobs extrahiert.
*
* Diese Script wird von js/getJenkins.js aufgerufen.
*
*/
// Festlegen das bei Skriptaufruf keine Jobs laufen
$runjobs = false;
try {
// JSON-String von Jenkins holen, die korrekte Adresse von Jenkins ist anzupassen:
$json = file_get_contents('http(s)://user:exxxxxxxAPI-TOKENxxxxxxxxxx@jenkinshost:port/jenkins/api/json');
// JSON-String zuerlegen
$obj = json_decode($json);
// Jobliste extrahieren
$jobs = $obj->{'jobs'};
// Beginn der Tabelle für die Ausgabe
echo "<table border=\"0\">";
for ($i = 0; $i < count($jobs); $i++) {
// Jobcolor extrahieren
$jobcolor = ($jobs[$i]->{'color'});
// Wenn ein Job den Zusatz "_anime" im Farbnamen hat, so wird dieser ausgeführt.
// Die zur Zeit ausgeführten Jobs werden aufgelistet.
if ($jobcolor == 'red_anime' or $jobcolor == 'blue_anime' or $jobcolor == 'yellow_anime' or $jobcolor == 'grey_anime') {
echo "<tr><td><img src=\"./pict/".
$jobs[$i]->{'color'}.
".gif\" width=\"8px\"></td><td><font size=\"0.2\"><a href=\"".
$jobs[$i]->{'url'}.
"\" target=\"_blank\">".
$jobs[$i]->{'name'}.
"</a></font></td></tr>";
// Festlegen, dass zur Zeit Jobs ausgeführt werden.
$runjobs = true;
}
}
// werden keine Jobs ausgeführt wird dies gemeldet.
if ($runjobs == false){
echo "<tr><td><font size=\"0.2\">There are currently no jobs running...</font></td></tr>";
}
//Ende der Tabelle für die Ausgabe
echo "</table>";
}
catch(Exception $ex) {
// Exception beim Zugriff auf Jenkins abfangen
echo $ex->getMessage();
}
?>
JavaScript für das wiederholende Aufrufen: getJenkins.js
Um ein automatisches Update der Stati zu gewährleisten wird das PHP-Skript via JavaScript eingebunden und in definierten Zeitabständen wiederholt aufgerufen. Das Skript liefert eine ID zurück, die in einem
eingebunden werden kann.
//
// JavaScript zur automatischen aktualusierung der Jenkins-Daten.
// Aktualisierungsintervall 10 Sekunden.
//
function jAutoRefresh(){
var fxmlHttp;
try{
fxmlHttp=new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
}
catch (e){
try{
fxmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
}
catch (e){
try{
fxmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
alert("No AJAX");
return false;
}
}
}
fxmlHttp.onreadystatechange=function(){
if(fxmlHttp.readyState==4){
document.getElementById('getJenkins').innerHTML=fxmlHttp.responseText;
setTimeout('jAutoRefresh()',10000); // JavaScript function calls AutoRefresh() every 10 seconds
}
}
fxmlHttp.open("GET","inc/getJenkins.php",true);
fxmlHttp.send(null);
}
jAutoRefresh();
Einbinden in die Webseite: index.html
Das Einbinden in eine html-Seite ist relativ einfach:
Im \<head> wird das JavaScript eingebunden, und im \<body> das \<p>- oder \<div>-Objekt mit der entsprechenden ID.
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset=utf-8 />
...
<script src="js/getMon.js"></script>
...
</head>
<body>
...
<p id="getJenkins"></p>
<!-- ODER -->
<div id="getJenkins"></div>
...
</body>
</html>
In der Webseite werden nun die laufenden Jenkinsjobs bzw. eine Entsprechende Meldung angezeigt. Das
kann mit CSS noch weiter angepasst werden.