代码之家  ›  专栏  ›  技术社区  ›  Chris F

如何在jenkinsfile中获得shell脚本的输出?

  •  6
  • Chris F  · 技术社区  · 6 年前

    在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 回复  |  直到 6 年前
        1
  •  7
  •   Szymon Stepniak    6 年前

    您在示例中显示的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的内置方法 文件目录大小() ,类似于:

    #!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的 文件目录大小() 方法递归地将结果计算为所有文件大小的总和,而不考虑目录文件的大小。在本例中,区别在于 四千零九十六 -目录文件的大小 /var/jenkins_主页/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
    

    它将提取 四千零九十六 - jenkins_home 文件大小。

    值得记住的事情:

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