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

How to pass a file which may have a different name using Execute Shell command in Jenkins

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

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

所以,我试图在 "Execute Shell" 构建操作中将该文件作为 ant -Dfile=/home/xxx/*.txt 传递,但构建是 "unable to read the file".

file_name=(`/home/xxx/*.txt`)
ant -Dfile=${file_name}

shell 不会将 -Dfile=/home/xxx/*.txt 扩展为 -Dfile=/home/xxx/y.txt,因为 -Dfile=/home/xxx/y.txt 不是文件。但是,shell 会将 扩展为 /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 "" ]; } || {
  echo "ERROR: There should be exactly one file matching /home/xxx/*.txt" >&2
  exit 1
}
ant -Dfile=""

这有几个优点:

  • 你实际上是在检测意外情况,而不是让它在不可能的事情发生时(不是 if)被忽视。
  • 一切都发生在一个 shell 中——没有子 shell 性能影响。
  • 您的文件名根本没有被破坏——完全支持所有奇怪的极端情况(即带有文字反斜杠的名称,echoallowed by POSIX to mangle)。
  • 它完全符合任何 POSIX shell。

还有一个警告:

  • set -- /home/xxx/*.txt 在当前上下文中覆盖参数向量 "$@"。如果您需要在外部脚本中引用参数 """" 等,您可以将此代码放在函数中。