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

在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在以后的管道步骤中将变量用作输入。

回答:

除了使用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中获取Shell脚本的输出? 的全部内容, 来源链接: utcz.com/qa/432550.html

回到顶部