在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}"
}
}
关键部分是在启用了ReturnsDout的情况下使用step,以便您可以在变量内部捕获脚本打印到控制台的内容。在本例中,我计算的文件夹总大小为/var/jenkins\u home/war/jsbundles,运行此管道脚本时,我得到:
dir size = 653136
然后,您可以在以后的管道步骤中使用DIR_SIZE
变量作为输入。
您可以考虑使用Groovy的内置方法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}"
}
}
但是,与bash命令的用例相比,这种方法会给你一个不同的结果:
dir size = 649040
这是因为Groovy的文件。directorySize()方法递归地将结果计算为所有文件大小的总和,并且不考虑目录文件的大小。在本例中,差异是4096—目录文件的大小(该路径不包含任何子文件夹,仅包含一组文件)。
您可以通过将诸如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\u home | cut-d“-f5
。上面显示的示例在我的本地bash和Jenkins服务器中都不起作用 问题内容: 在Jenkinsfile Groovy脚本阶段,假设我要发出一个Linux命令来输出字符串的行和列,并想要在特定行的输出中获取第n列。这样的命令的一个示例是“ ls -al”。所以我这样做正确吗? 但是,如何获取本质上为$ {COL [4]}的值,该值是“ ls -al”命令的第五列,即目录大小? 谢谢! 问题答案: 您在示例中显示的bash脚本不会返回正确的目录大小。它将以递归方式返
我有一个Python脚本,它在stdout上返回一个字符串。python脚本返回的值可以收集在bash脚本中,如下所示: 在使用Groovy编写的Jenkinsfile编写脚本的管道上,我需要从Jenkinsfile调用python脚本,并将输出收集到Jenkinsfile中的变量中。 问题: 如果我的Jenkinsfile在macOS节点上运行,我该如何做到这一点。以下是我至少可以在shell变
问题内容: 我需要这个shell脚本一些帮助。我有一个变量,代表一个IP / TCP标头。我需要按所选标题过滤流量捕获。 tcpdump命令的结果如下所示 我需要IP地址源和IP地址目标,在示例中,输出结果必须为 10.0.0.131.58363 > 239.255.255.250.1900 问题答案: 尝试直接在over中执行此操作: 这是坚如磐石的;)
问题内容: 我保留一个名为的shell脚本文件 ,并从构建中执行该文件。 当我执行构建时,它失败。 控制台输出如下: 我在应该保留外壳脚本文件以便执行的位置上感到困惑。 问题答案: 如果看到错误消息,则提示 在工作空间中构建/ var / lib / jenkins / workspace / AutoScript 并根据您的评论将urltest.sh放入 / var / lib / jenkin
我该如何做到这一点,特别是因为您似乎无法真正运行中的任何类型的groovy代码?
我试图传递一个参数到一个cmdline工具,它看起来像下面这样: 其中,“()”是工具所必需的,xyz-123存储在变量$var中,我从另一个函数获取该变量。 如果我硬编码“(xyz-123)”,该工具工作正常,但当我执行时,它会抛出一个错误: