Как получить вывод сценария оболочки в Jenkinsfile? - PullRequest
0 голосов
/ 31 мая 2018

На этапе сценария Jenkinsfile Groovy, скажем, я хочу выполнить команду linux, которая выводит строки и столбцы строк, и хочу получить n-й столбец в выходных данных определенной строки.Примером такой команды является "ls -al."Итак, я делаю это правильно?

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 */
}

Но как мне получить значение, по существу, $ {COL [4]}, которое является пятым столбцом в команде "ls -al", которая является каталогомразмер?

Спасибо!

1 Ответ

0 голосов
/ 31 мая 2018

Этот 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, чтобы вернуть то, что ваша команда выводит на консоль.
...