我正在编写一个管道作业,它将调用另一个脚本来执行。 Jenkins文件和脚本存在于同一目录中,但作业无法找到要运行的脚本。
这是脚本的相关部分;
stage ('Update') {
try {
dir('jenkins/pipeline/update-jenkins-plugins-ppln') {
sh 'ls -l'
sh 'update-plugins.sh'
}
}
返回以下错误;
[update-jenkins-plugins-ppln] Running shell script
+ ls -l
total 8
-rw-r--r-- 1 jenkins jenkins 2441 Dec 20 09:34 Jenkinsfile
-rwxr-xr-x 1 jenkins jenkins 506 Dec 19 14:06 update-plugins.sh
[Pipeline] sh
[update-jenkins-plugins-ppln] Running shell script
+ update-plugins.sh
/var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: 2: /var/lib/jenkins/workspace/update-jenkins-plugins-ppln/jenkins/pipeline/update-jenkins-plugins-ppln@tmp/durable-11cefdd0/script.sh: update-plugins.sh: not found
正如您所看到的,我正在使用的路径是正确的,因为根据ls
我需要的文件update-plugins.sh
位于我已经修改过的目录中。但出于某种原因,在实际搜索脚本时,Jenkins正在将@tmp/durable-8d48734f/script.sh
添加到路径中。
各种故障排除:
为什么Jenkins会添加@tmp位,有没有办法防止这种行为?
答案 0 :(得分:3)
您是否尝试过使用jenkins工作区环境变量WORKSPACE
(工作区的绝对路径)?你的行看起来像这样:
sh '${WORKSPACE}/jenkins/pipeline/update-jenkins-plugins-ppln/update-plugins.sh'
答案 1 :(得分:2)
我猜你的pwd不在PATH中所以你必须这样称呼它:sh './update-plugins.sh'
答案 2 :(得分:1)
我遇到了同样的问题。我认为@Oren从技术上回答了您有关为什么 Jenkins创建此tmp
空间的问题,但是我可以分享一些有关如何解决此问题的信息。
基本上,我的Jenkins主机将bin/sh
链接到dash
;不是bash
。因此,使用兼容POSIX的外壳脚本为我解决了这个问题。
例如,我尝试使用shopt -s extglob
进行一些模式匹配:
stage {
def shellCommand = $/ "rm -rf ! (_data|_includes|_plugins|Gemfile|_config.yml|page-builder)"/$
sh(returnStdout: true, script: shellCommand).trim()
}
由于dash
不支持extglob
,因此可以用兼容POSIX的find
命令替换它:
stage {
sh('find . -regextype posix-extended -not -regex ".*includes.*|.*data.*|.*plugins.*|.*config.yml|.*Gemfile.*"')
}
答案 3 :(得分:0)
@tmp文件夹用于jenkins作业和阶段统计信息(阶段持续时间等),如果需要确定的话,可以将其删除。我认为您的问题与错误的路径有关,请仔细检查。
答案 4 :(得分:0)
我猜这种特殊情况与Jenkins管道无关,因为它可以在Jenkins之外的控制台中复制。由于脚本中的 DOS行尾而导致出现此问题后,我在管道的“ sh()”中运行了该脚本。看这个例子:
$ cat -v dos_formatted.sh
#! /bin/sh^M
pwd^M
$ cat script.sh
./dos_formatted.sh
$ sh -xe script.sh
+ ./dos_formatted.sh
script.sh: 1: script.sh: ./dos_formatted.sh: not found
很好地说明了“未找到”消息的误导性。该脚本在正确的位置,并且权限足够,但是当您从另一个脚本运行该脚本时,它会失败,并显示一条错误消息。
“耐用任务插件”(https://github.com/jenkinsci/durable-task-plugin/blob/master/src/main/java/org/jenkinsci/plugins/durabletask/BourneShellScript.java)的代码显示,该插件将自动生成的script.sh作为“ sh -xe ...”运行,因此,这正是我们的情况。
如果您“ git clone”了某个(可能是第3方)Git项目,并且不确定是否已使用Unix风格的LF进行克隆,则会发生上述情况。
答案 5 :(得分:0)
我遇到了类似的问题,尽管shell脚本位于/var/lib/jenkins/workspace/New_commit_test/Fibonacci.sh路径中,但Jenkins构建失败并显示错误消息:“ / tmp / jenkins6688065235543884785.sh: 3:/tmp/jenkins6688065235543884785.sh:/var/lib/jenkins/workspace/New_commit_test/Fibonacci.sh:找不到”
所以我从更改了我以前的命令: $ {WORKSPACE} /Fibonacci.sh> New_commit_test.txt
至:(因为我在这里使用bash脚本) 重击 $ {WORKSPACE} /Fibonacci.sh> New_commit_test.txt
在这里为我整理了问题
答案 6 :(得分:0)
我遇到了同样的问题。将“bin/bash”添加到“Manage Jenkins -> Configure System”下的“Shell Executable”选项即可解决。
我也认为这是一些路径问题,但 Jenkins 找不到 bash 可执行文件本身,尽管错误导致不相信。