从Jenkins管道运行的Bash脚本总是在幻影最后一行之后失败



我们企业运行的是Jenkins 2.303.2.

我在一个共享库上工作,我们已经在很多版本中使用了很长时间。我们用了"嘘"管道步骤经常运行标准命令行工具,或者有时执行存储在正在构建的代码工作区中的脚本。

我现在正在尝试做一些我以前从未做过的事情,这是执行由共享库提供的shell脚本,而不是正在构建的代码。我有一种感觉,事实是转移注意力的。我使用了将脚本存储在"资源"中的已知策略。,并使用"libraryResource"one_answers";writeFile"用于存储文件,并使用sh(chmod)使其可执行。我在那时验证了我可以执行它,因为它显示了脚本中的调试行。

奇怪的是,在执行"exit"在脚本的第一行中,它会失败,并显示一个奇怪的"命令not found"错误,但它没有告诉我它试图找到什么命令。

这是从构建输出中被大量省略的摘录:

+ chmod +x scriptname.sh
[Pipeline] sh
+ ./scriptname.sh ...
+ main ...
...
+ echo ''
+ return
+ exit 0
+ **** ****
.../script.sh: line 2: ****: command not found

这是脚本文件的结尾:

main "$@"
exit 0

可以看到,它执行了"main"函数,它执行我省略的一些工作,它返回一个空字符串,然后退出脚本。带有"exit"的行在它的末尾有一个回车行,这就是文件的结尾。我已经检查了写入工作区(从资源目录)的文件,以验证它与我所期望的完全一致。

这是从管道脚本中省略的一段摘录:

def bashScript = libraryResource "scriptname.sh"
writeFile file: "./scriptname.sh", text: bashScript
sh("chmod +x scriptname.sh")
def scriptOutput = sh(returnStdout: true,
script: "./scriptname.sh ...")
echo "scriptOutput[$scriptOutput]"

我可能错过了什么?

更新:

当前"chmod"call,我添加了这个:

sh("od -c checkmirrorsync.sh")

下面是输出的前几行:

0000000   #   !       /   b   i   n   /   b   a   s   h  n   s   e       t
0000020       -   x  n  n   m   a   i   n   (   )       {  n  t   i

这是脚本的开头:

#! /bin/bash
set -x
main() {

请注意,它在这行之后执行得很好,因此引用第2行"不是指脚本中的行,而是指其他的东西。

废话。我想明白了。我很不好意思花了这么长时间。我应该记得"命令未找到";在线错误"2"从"嘘";管道步骤不是指我调用的脚本的第2行,而是指我发送给"sh"管道的一步。事实上,我发送的单行中有第2行是我应该注意到的。问题是,我发送的一个参数有一个尾随CR,导致下一个参数被认为是一个潜在的命令。有一次我添加了"trim()"调用它,它工作正常。

最新更新