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

标签 jenkins groovy 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 */
}

但是我如何获取 ${COL[4]} 的值,它是“ls -al”命令中的第五列,即目录大小?

谢谢!

最佳答案

您在示例中显示的 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()

您可以考虑使用 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}"
  }
}

但是,与使用 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步骤将命令打印的内容返回到控制台。

关于jenkins - 如何在 Jenkinsfile 中获取 shell 脚本的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615649/

相关文章:

jenkins - 在 Jenkinsfile 中创建时间戳

jenkins - 配置可编辑电子邮件通知Jenkins的内容

groovy - Groovy @Mixin 中 'return this' 的类型

Groovy 控制台源代码!

jenkins - 从源代码存储库自动创建 Jenkins 作业 - 无 Jenkins 交互

jenkins - 如何修复 Jenkins 管道中的 JNLPlauncher 异常

continuous-integration - Jenkins/Hudson - 访问当前版本号?

jenkins - 无法实例化 Jenkins 共享库中的对象

jenkins - 如何从声明性管道中的另一项工作开始一项工作?

jenkins - Jenkinsfile 中的构建失败