Этот bash-скрипт, который вы показали в своем примере, не вернет правильный размер каталога.Он вернет размер файла, обычно 4096
байт, а не рекурсивный общий размер всех файлов и подкаталогов.Если вы хотите получить общий размер каталога, вы можете попробовать что-то вроде этого:
#!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}"
}
}
Важнейшей частью является использование шага sh
с включенным returnStdout
, чтобы вы могли захватывать внутри переменной то, что печатает скриптк консоли.В этом примере я вычисляю общий размер папки /var/jenkins_home/war/jsbundles
, и когда я запускаю сценарий конвейера, я получаю:
dir size = 653136
Затем вы можете использовать переменную DIR_SIZE
в качестве входных данных на последующих этапах конвейера.
Альтернативный подход: использование Groovy File.directorySize()
Вместо использования скрипта bash вы можете рассмотреть использование встроенного метода Groovy File.directorySize()
, что-то вроде:
#!groovy
node('master') {
stage("Get dir size") {
script {
DIR_SIZE = new File('/var/jenkins_home/war/jsbundles').directorySize()
}
echo "dir size = ${DIR_SIZE}"
}
}
Однако этот подход даст вам другой результат по сравнению со случаем использования с командой bash:
dir size = 649040
Это потому, что метод Groovy File.directorySize()
вычисляет результат как сумму всех размеров файлов рекурсивно, и это делаетне учитывать размер файла каталога.В этом примере разница составляет 4096
- размер файла каталога /var/jenkins_home/war/jsbundles
(этот путь не содержит вложенных папок, только набор файлов).
Обновление: извлечение данных из вывода в виде столбцов
Вы можете извлекать любую информацию из вывода в виде столбцов, передавая команды типа grep
и cut
вместе.Например, вы можете заменить приведенные выше примеры на:
#!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}"
}
}
И для следующего вывода:
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
он извлечет 4096
- размер файла jenkins_home
.
Вещи, которые стоит запомнить:
- используйте простые скрипты bash, такие как
ls -la /var | grep jenkins_home | cut -d " " -f5
.Приведенный выше пример не работает в моем локальном bash, а также на сервере Jenkins - добавьте параметр
returnStdout: true
к шагу sh
, чтобы вернуть то, что ваша команда выводит на консоль.