当前位置: 首页 > 面试题库 >

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

陈朗
2023-03-14
问题内容

在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}"
  }
}

至关重要的部分是使用启用了shstep的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参数添加到shstep以将命令打印的内容返回到控制台。


 类似资料:
  • 在Jenkinsfile Groovy脚本阶段,假设我想发出一个linux命令来输出字符串的行和列,并希望在某一行的输出中获取第n列。此类命令的示例是“ls-al”。所以我做得对吗? 但是我如何获得${COL[4]}的值,这是“ls-al”命令中的第五列,即目录大小? 谢谢

  • 问题内容: 我保留一个名为的shell脚本文件 ,并从构建中执行该文件。 当我执行构建时,它失败。 控制台输出如下: 我在应该保留外壳脚本文件以便执行的位置上感到困惑。 问题答案: 如果看到错误消息,则提示 在工作空间中构建/ var / lib / jenkins / workspace / AutoScript 并根据您的评论将urltest.sh放入 / var / lib / jenkin

  • 我该如何做到这一点,特别是因为您似乎无法真正运行中的任何类型的groovy代码?

  • 我有一个Python脚本,它在stdout上返回一个字符串。python脚本返回的值可以收集在bash脚本中,如下所示: 在使用Groovy编写的Jenkinsfile编写脚本的管道上,我需要从Jenkinsfile调用python脚本,并将输出收集到Jenkinsfile中的变量中。 问题: 如果我的Jenkinsfile在macOS节点上运行,我该如何做到这一点。以下是我至少可以在shell变

  • 问题内容: 我正在尝试提取git分支并在我的Jenkinsfile中提交信息,如下所示: 我想以后像这样打印它: 我没有得到真正的价值,而是这样: 我做错了什么,如何正确获取需要的值? 编辑:不,建议的重复项不是答案,因为我知道用于检索所需信息的shell命令。我的问题是信息传递给我的方式,而不是。 问题答案: 这个完整的管道对您有用吗?使用管道插件2.4为我工作。

  • 问题内容: 我正在研究一个Java程序,该程序在JUnit测试中调用多个Shell脚本(因此,除了。和E之外没有输出),这些脚本可操纵文件和SQL表,然后将所述表中的数据与其期望值进行比较。一切都在理论上可行,但是我遇到了一个阶段性错误,其中一种类型的测试按预期工作,而另一种类型的测试在十分钟超时后失败。我将问题隔离为Shell脚本之一,但是我没有编写此脚本,因此无法以任何方式进行更改。解决此问题