webentwicklung-frage-antwort-db.com.de

Wie erhalte ich die Ausgabe eines Shell-Skripts in einer Jenkins-Datei?

Sagen wir in einer Jenkinsfile Groovy-Skriptphase, ich möchte einen Linux-Befehl ausgeben, der Zeilen und Spalten von Zeichenfolgen ausgibt, und die n-te Spalte in der Ausgabe einer bestimmten Zeile abrufen. Ein Beispiel für einen solchen Befehl ist "ls -al". Also mache ich das richtig?

stage("Get dir size") {
  sh returnStatus: true, script: '''
    LINE=`ls -al | grep some_dir`
    IFS=" " read -ra COLS <<< $LINE
    echo ${COLS[4]}
  '''
  /* I want to use the value of ${COL[4]} after above block */
}

Aber wie erhalte ich den Wert von im Wesentlichen $ {COL [4]}, der fünften Spalte in einem "ls -al" -Befehl, der Verzeichnisgröße?

Vielen Dank!

7
Chris F

Dieses Bash-Skript, das Sie in Ihrem Beispiel gezeigt haben, gibt nicht die richtige Verzeichnisgröße zurück. Es wird eine Dateigröße zurückgegeben, normalerweise 4096 Bytes und nicht eine Gesamtgröße aller Dateien und Unterverzeichnisse rekursiv. Wenn Sie die Gesamtgröße des Verzeichnisses ermitteln möchten, können Sie Folgendes versuchen:

#!groovy

node('master') {

  stage("Get dir size") {
    script {
      DIR_SIZE = sh(returnStdout: true, script: 'du -sb /var/jenkins_home/war/jsbundles | cut -f1')
    }
    echo "dir size = ${DIR_SIZE}"
  }
}

Entscheidend ist, sh step mit aktiviertem returnStdout zu verwenden, damit Sie in einer Variablen erfassen können, was das Skript auf der Konsole ausgibt. In diesem Beispiel berechne ich die Gesamtgröße des Ordners /var/jenkins_home/war/jsbundles. Wenn ich dieses Pipeline-Skript ausführe, erhalte ich Folgendes:

dir size = 653136

Sie können dann die Variable DIR_SIZE Als Eingabe in späteren Pipelineschritten verwenden.

Alternativer Ansatz: Verwenden von Groovys File.directorySize()

Anstelle eines Bash-Skripts können Sie auch die in Groovy integrierte Methode File.directorySize() verwenden.

#!groovy

node('master') {

  stage("Get dir size") {
    script {
      DIR_SIZE = new File('/var/jenkins_home/war/jsbundles').directorySize()
    }
    echo "dir size = ${DIR_SIZE}"
  }
}

Dieser Ansatz liefert jedoch ein anderes Ergebnis als der Anwendungsfall mit dem Befehl bash:

dir size = 649040

Dies liegt daran, dass die File.directorySize() -Methode von Groovy das Ergebnis als Summe aller Dateigrößen rekursiv berechnet und die Größe der Verzeichnisdatei nicht berücksichtigt. In diesem Beispiel ist der Unterschied 4096 - eine Größe einer Verzeichnisdatei /var/jenkins_home/war/jsbundles (Dieser Pfad enthält keine Unterordner, nur eine Reihe von Dateien).

Update: Extrahieren von Daten aus einer spaltenartigen Ausgabe

Sie können alle Informationen aus der spaltenartigen Ausgabe extrahieren, indem Sie Befehle wie grep und cut zusammenfügen. Zum Beispiel können Sie die obigen Beispiele ersetzen durch:

#!groovy

node('master') {
  stage("Get dir size") {
    script {
      DIR_SIZE = sh(returnStdout: true, script: 'ls -la /var | grep jenkins_home | cut -d " " -f5')
    }
    echo "dir size = ${DIR_SIZE}"
  }
}

Und für folgende Ausgabe:

total 60
drwxr-xr-x  1 root    root    4096 Nov  4  2017 .
drwxr-xr-x  1 root    root    4096 May 31 03:27 ..
drwxr-xr-x  1 root    root    4096 Nov  4  2017 cache
dr-xr-xr-x  2 root    root    4096 May  9  2017 empty
drwxr-xr-x  2 root    root    4096 Nov  4  2017 git
drwxrwxr-x 20 jenkins jenkins 4096 May 31 12:26 jenkins_home
drwxr-xr-x  5 root    root    4096 May  9  2017 lib
drwxr-xr-x  2 root    root    4096 May  9  2017 local
drwxr-xr-x  3 root    root    4096 May  9  2017 lock
drwxr-xr-x  2 root    root    4096 May  9  2017 log
drwxr-xr-x  2 root    root    4096 May  9  2017 opt
drwxr-xr-x  2 root    root    4096 May  9  2017 run
drwxr-xr-x  3 root    root    4096 May  9  2017 spool
drwxrwxrwt  2 root    root    4096 May  9  2017 tmp

es wird 4096 extrahiert - die Dateigröße jenkins_home.

Dinge, an die es sich zu erinnern lohnt:

  • verwenden Sie einfache Bash-Skripte wie ls -la /var | grep jenkins_home | cut -d " " -f5. Das Beispiel, das Sie oben gezeigt haben, funktioniert nicht in meiner lokalen Bash sowie auf dem Jenkins-Server
  • fügen Sie dem Schritt sh den Parameter returnStdout: true hinzu, um den Ausdruck Ihres Befehls an die Konsole zurückzugeben.
10
Szymon Stepniak