如何使用 Jenkins 中的 Execute Shell 命令传递可能具有不同名称的文件



我有一个 Jenkins 作业,我想使用 shell 从目录中读取一个文件,并在ant test步骤中传递该文件。

假设我要读取的文件是/home/xxx/y.txt。文件的名称总是会更改,但在该目录中的任何给定点都只有一个扩展名.txt文件。

因此,我正在尝试在"执行 Shell"构建操作中传递该文件作为ant -Dfile=/home/xxx/*.txt但构建"无法读取文件"。

shell 不会-Dfile=/home/xxx/*.txt扩展到 -Dfile=/home/xxx/y.txt -Dfile=/home/xxx/y.txt因为不是文件。但是,外壳/home/xxx/*.txt扩展到/home/xxx/y.txt。您可以使用命令替换获得所需的结果:

ant -Dfile=`echo /home/xxx/*.txt`

为了防止文件路径中有空格,可以在反引号两边使用双引号:

ant -Dfile="`echo /home/xxx/*.txt`"

一般提示:如果您在使用 Jenkins 作业中运行的 shell 脚本时遇到问题,请尝试启用命令跟踪并查看控制台输出以帮助调试。可以通过以下两种方式之一启用命令跟踪(任您选择):

  • -x作为选项传递给脚本开头的 shebang。例如,将#!/bin/sh替换为 #!/bin/sh -x 。所有命令在执行之前都将在标准错误时输出。
  • set -x放在脚本中的某个位置。将跟踪此行之后的命令。

考虑:

set -- /home/xxx/*.txt
{ [ "$#" -eq 1 ] && [ -e "$1" ]; } || {
  echo "ERROR: There should be exactly one file matching /home/xxx/*.txt" >&2
  exit 1
}
ant -Dfile="$1"

这有几个优点:

  • 您实际上是在检测意外情况,而不是在(而不是如果)发生不可能的事情时让它被忽视。
  • 一切都发生在一个 shell 中 - 没有子 shell 性能影响。
  • 您的文件名根本没有被篡改 - 所有奇怪的角落情况(即带有文字反斜杠的名称,POSIX echo允许修改)都完全受支持。
  • 它完全符合任何POSIX外壳。

还有一个警告:

  • set -- /home/xxx/*.txt 在当前上下文中覆盖"$@" 参数向量。如果需要在外部脚本中将参数引用为 "$1""$2" 等,则可以将此代码放在函数中。
file_name=(`/home/xxx/*.txt`)
ant -Dfile=${file_name}

最新更新