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!
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.
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).
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:
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-Serversh
den Parameter returnStdout: true
hinzu, um den Ausdruck Ihres Befehls an die Konsole zurückzugeben.