您在示例中显示的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
参数到
嘘
步骤返回命令打印到控制台的内容。