在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]}的值,这是&#34; ls -al&#34;中的第五列。命令,这是目录大小?
谢谢!
答案 0 :(得分:7)
您在示例中显示的此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
的{{1}}步骤,这样您就可以在变量中捕获脚本打印到控制台的内容。在这个例子中,我正在计算returnStdout
文件夹的总大小,当我运行这个管道脚本时,我得到:
/var/jenkins_home/war/jsbundles
然后,您可以在以后的管道步骤中使用dir size = 653136
变量作为输入。
DIR_SIZE
您可以考虑使用Groovy的内置方法File.directorySize()
,而不是使用bash脚本,例如:
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}"
}
}
这是因为Groovy的dir size = 649040
方法以递归方式计算所有文件大小的总和,并且没有考虑目录文件的大小。在此示例中,差异为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以及Jenkins服务器ls -la /var | grep jenkins_home | cut -d " " -f5
参数添加到returnStdout: true
步骤,以返回命令打印到控制台的内容。