我们企业运行的是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()"调用它,它工作正常。