由于正在创建@tmp路径,Jenkins管道作业找不到脚本

时间:2016-12-20 15:45:20

标签: git bash jenkins groovy

我正在编写一个管道作业,它将调用另一个脚本来执行。 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文件,所以我是。
  • 我已经进入Jenkins框进行检查,是的,脚本就在那里。

为什么Jenkins会添加@tmp位,有没有办法防止这种行为?

7 个答案:

答案 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 可执行文件本身,尽管错误导致不相信。