In diesem Blog Beitrag hatte ich gezeigt, wie man auf einem Raspberry Pi einen aktuellen Jenkins installieren kann.
Nun möchte ich mal zeigen, wie Aufgabe parallelisiert werden können.
Ein Jenkins Jobs der folgendes macht, soll mal als Beispiel dienen, um parallele Pipeline zu demonstrieren.
Ein einfacher Job der
- Flugdaten aus Hannover abfragt
- mein Kaffee verbrauch ermittelt
- Temperatur und Luftfeuchte in HAJ abfragt
- Umweltdaten des Lufthygienisches Überwachungssystem Niedersachsen abfragt
- meine drei Server per Ping 10 mal checkt
- und das Ergebnis aller Abfragen per E-Mail versendet
Dazu das kleine Groovy Script, das die öffentlichen Daten abfragt, in den Job eintragen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
node{ stage('Flugdaten HAJ abfragen') { echo 'Max Summe Flugzeuge in EDDV' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'flugdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/44177/feeds/last.json' } stage('Kaffee verbrauch abfragen') { echo 'Kaffee verbrauch Summe' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'kaffeedaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/242708/feeds/last.json' } stage('Temperatur und Luftfeuchte abfragen') { echo 'Temperatur und Luftfeuchte' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'temperaturdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/44925/feeds/last.json' } stage('Umweltdaten abfragen') { echo 'Umweltdaten' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'messdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://www.luen-ni.de/JSON.txt' } stage('Server home, bplus, flug checken ') { echo 'Check Server home' sh 'ping -c 10 home' echo 'Check Server bplus' sh 'ping -c 10 bplus' echo 'Check Server flug' sh 'ping -c 10 flug' } stage('Ergebnisse per E-Mail versenden') { emailext attachLog: true, body: '', subject: 'Autom. check', to: 'jenkins@wenzlaff.de' } } |
Hier die Job Pipeline:
Der Stage mit dem drei mal zehn Ping dauert 29 Sekunden. Den Ping wollen wir nun parallel laufen lassen, um zu sehen, wie man Jobs parallelisieren kann. Dazu brauchen wir in dem Stage nur den Befehl parallel mit Klammern aufrufen. Hier die Syntax:
1 2 3 4 |
parallel ( "stream 1" : { ... parallele Befehle ... }, "stream 2" : { ... parallele Befehle ... } ) |
Der neue modifizierte Job:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
node{ stage('Flugdaten HAJ abfragen') { echo 'Max Summe Flugzeuge in EDDV' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'flugdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/44177/feeds/last.json' } stage('Kaffee verbrauch abfragen') { echo 'Kaffee verbrauch Summe' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'kaffeedaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/242708/feeds/last.json' } stage('Temperatur und Luftfeuchte abfragen') { echo 'Temperatur und Luftfeuchte' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'temperaturdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://api.thingspeak.com/channels/44925/feeds/last.json' } stage('Umweltdaten abfragen') { echo 'Umweltdaten' httpRequest consoleLogResponseBody: true, ignoreSslErrors: true, outputFile: 'messdaten.txt', responseHandle: 'NONE', timeout: 10, url: 'https://www.luen-ni.de/JSON.txt' } stage('Server home, bplus, flug checken ') { parallel ( "home" : { echo 'Check Server home' sh 'ping -c 10 home'}, "pi-bplus" : { echo 'Check Server bplus' sh 'ping -c 10 bplus'}, "pi-flug": {echo 'Check Server flug' sh 'ping -c 10 flug'} ) } stage('Ergebnisse per E-Mail versenden') { emailext attachLog: true, body: '', subject: 'Autom. check', to: 'jenkins@wenzlaff.de' } } |
Das Ergebnis. Ein Stage mit dem check dauert nun nur noch 11 Sekunden:
Das die Ping Befehle parallel abgearbeitet werden, kann man am Log gut sehen, welches per E-Mail bei mir einmal am Tag zugesendet wir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[flug] 64 bytes from flug.router.de (ADRESSE.32): icmp_seq=6 ttl=64 time=5.03 ms [home] 64 bytes from home.router.de (ADRESSE.39): icmp_seq=8 ttl=64 time=2.27 ms [bplus] 64 bytes from bplus.router.de (ADRESSE.43): icmp_seq=7 ttl=64 time=4.92 ms [bplus] 64 bytes from bplus.router.de (ADRESSE.43): icmp_seq=8 ttl=64 time=5.23 ms [flug] 64 bytes from flug.router.de (ADRESSE.32): icmp_seq=7 ttl=64 time=5.34 ms [home] 64 bytes from home.router.de (ADRESSE.39): icmp_seq=9 ttl=64 time=4.41 ms [bplus] 64 bytes from bplus.router.de (ADRESSE.43): icmp_seq=9 ttl=64 time=4.85 ms [flug] 64 bytes from flug.router.de (ADRESSE.32): icmp_seq=8 ttl=64 time=5.15 ms [home] 64 bytes from home.router.de (ADRESSE.39): icmp_seq=10 ttl=64 time=5.20 ms [home] [home] --- home.router.de ping statistics --- [home] 10 packets transmitted, 10 received, 0% packet loss, time 9012ms [home] rtt min/avg/max/mdev = 2.030/4.287/5.200/1.120 ms [flug] 64 bytes from flug.router.de (ADRESSE.32): icmp_seq=9 ttl=64 time=5.15 ms [Pipeline] [home] } [bplus] 64 bytes from bplus.router.de (ADRESSE.43): icmp_seq=10 ttl=64 time=5.72 ms [bplus] [bplus] --- bplus.router.de ping statistics --- [bplus] 10 packets transmitted, 10 received, 0% packet loss, time 9011ms [bplus] rtt min/avg/max/mdev = 2.206/4.782/6.395/1.034 ms [Pipeline] [bplus] } [flug] 64 bytes from flug.router.de (ADRESSE.32): icmp_seq=10 ttl=64 time=5.07 ms |
In der ersten Version hingegen werden alle drei Server nach einander angepingt.
Es können auch noch Nodes parallel abgearbeitet werden.
Hier noch der direkte Vergleich: