Jenkins Pipeline optimieren mit parallele Ausführung auf dem Raspberry Pi

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.

Parallelisieren von Jenkins Stages

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:

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: '[email protected]'
   }
}

Hier die Job Pipeline:

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:

parallel (
     "stream 1" : { ... parallele Befehle ...  },
     "stream 2" : { ... parallele Befehle ...  }
   )

Der neue modifizierte Job:

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: '[email protected]'
   }
}

Das Ergebnis. Ein Stage mit dem check dauert nun nur noch 11 Sekunden:
Jenkins Job

Das die Ping Befehle parallel abgearbeitet werden, kann man am Log gut sehen, welches per E-Mail bei mir einmal am Tag zugesendet wir:

[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:

Jenkins Pipeline optimieren mit parallele Ausführung auf dem Raspberry Pi

Ähnliche Artikel:

  1. Wo kann die IP-Adresse für den Raspberry Pi auf den Mac und im Router fest zugewiesen werden.
  2. Wie können mit Jenkins 2.72 Pipelines rurociągi auf einen Raspberry Pi Zero W angelegt werden?
  3. Überwachung: Automatischer Ping an Server mit NodeRED auf Raspberry Pi (مراقبة)

wallpaper-1019588
Digitalnomaden an der Algarve – wie Handelsroboter und Kryptowährungen durch Automation große Effizienzsteigerung generieren
wallpaper-1019588
altraverse stellt Shojo-Titel für Herbst 2024 vor
wallpaper-1019588
Ninja to Koroshiya no Futarigurashi: Manga erhält eine Anime-Adaption
wallpaper-1019588
[Manga] H.P. Lovecrafts Der leuchtende Trapezoeder