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

Ign*_*tor 2 jenkins-pipeline

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

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

node('linux') {
    sh "echo 'Hello World!'" // this fails
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

nohup: failed to run command 'sh': No such file or directory
Run Code Online (Sandbox Code Playgroud)

PATH环境变量设置正确为包含sh两个节点上命令.

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

Ign*_*tor 6

tl; dr:问题是设置env.PATH了一项任务.withEnv()改为使用:

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

node('linux') {
    sh "echo 'Hello World!'"
}
Run Code Online (Sandbox Code Playgroud)

说明:

管道教程的后面部分之一,据说

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

这意味着在设置这样的环境变量时,env.PATH = ...此变量对于管道脚本的其余部分固定的,因此将覆盖所有后续节点上该环境变量的实际值.因此,它反转了env属性设置为节点的环境变量的实际值的正常行为.

所以我们的Linux节点最终PATH得到了Windows节点的变量.这就是sh找不到的原因.
注意到好奇: nohup仍然被发现,因为它是由Jenkins客户端直接执行的,它使用节点的"真实"环境变量.但詹金斯然后为这个nohup过程设置了修改后的环境,这就是为什么nohup找不到shPATH.