为什么在Jenkins管道中第二个节点上的步骤失败?

时间:2016-11-17 23:41:27

标签: jenkins-pipeline

尝试在第二个sh上执行node()步骤失败。 最小的例子:

node('windows') {
    env.PATH = "C:\\some\\path;${env.PATH}"
    // ...
}

node('linux') {
    sh "echo 'Hello World!'" // this fails
}

错误消息是:

nohup: failed to run command 'sh': No such file or directory

正确设置PATH环境变量以在两个节点上包含sh命令。

为什么第二个节点上的sh步骤失败了?

1 个答案:

答案 0 :(得分:6)

tl; dr:问题是通过作业设置env.PATH。请改用withEnv()

node('windows') {
    withEnv('PATH+some=C:\\some\\path') {
        // ...
    }
}

node('linux') {
    sh "echo 'Hello World!'"
}

说明:

pipeline tutorial的后续部分之一中,据说

  

环境变量覆盖仅限于管道运行的全局

这意味着在设置类似此env.PATH = ...的环境变量时,此变量已修复其余的管道脚本,因此将覆盖该环境变量的实际值在所有后续节点上。因此,它反转了env属性设置为节点环境变量实际值的正常行为。

所以我们的Linux节点最终得到了Windows节点的PATH变量。 这就是sh找不到的原因 注意好奇: nohup仍然被发现,因为它是由使用" real"节点的环境变量。但Jenkins随后为nohup流程设置了修改后的环境,这就是nohupsh中找不到PATH的原因。