如何在Jenkinsfile中获取shell脚本的输出?

Chr*_*s F 7 groovy jenkins jenkins-pipeline

在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 */
}
Run Code Online (Sandbox Code Playgroud)

但是如何获得$ {COL [4]}的值,这是"ls -al"命令中的第五列,即目录大小?

谢谢!

Szy*_*iak 10

您在示例中显示的此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}"
  }
}
Run Code Online (Sandbox Code Playgroud)

关键部分是使用启用sh步骤,returnStdout这样您就可以在变量内部捕获脚本打印到控制台的内容.在这个例子中,我正在计算/var/jenkins_home/war/jsbundles文件夹的总大小,当我运行这个管道脚本时,我得到:

dir size = 653136
Run Code Online (Sandbox Code Playgroud)

然后,您可以DIR_SIZE在以后的管道步骤中使用变量作为输入.

替代方法:使用Groovy File.directorySize()

您可以考虑使用Groovy的内置方法File.directorySize(),而不是使用bash脚本,例如:

#!groovy

node('master') {

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

但是,与bash命令的用例相比,这种方法会给你一个不同的结果:

dir size = 649040
Run Code Online (Sandbox Code Playgroud)

这是因为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}"
  }
}
Run Code Online (Sandbox Code Playgroud)

并为以下输出:

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
Run Code Online (Sandbox Code Playgroud)

它将提取4096- jenkins_home文件大小.

值得记住的事情:

  • 使用简单的bash脚本ls -la /var | grep jenkins_home | cut -d " " -f5.您在上面显示的示例在我的本地bash以及Jenkins服务器中不起作用
  • returnStdout: true参数添加到sh步骤以返回命令打印到控制台的内容.